DELETED .fossil-settings/crlf-glob Index: .fossil-settings/crlf-glob ================================================================== --- .fossil-settings/crlf-glob +++ .fossil-settings/crlf-glob @@ -1,1 +0,0 @@ -fossil unset crlf-glob DELETED Artefactos/BibliotecaDigitalBogota/exil.markdown Index: Artefactos/BibliotecaDigitalBogota/exil.markdown ================================================================== --- Artefactos/BibliotecaDigitalBogota/exil.markdown +++ Artefactos/BibliotecaDigitalBogota/exil.markdown @@ -1,158 +0,0 @@ ---- exportedFrom: f9bb35eaafa96ab9de20bdb134cf2a32acbd689a title: Versión grafoscópica del Estudio de Kenneth Crews sobre excepciones y limitaciones al derecho de autor para bibliotecas y archivos en América Latina -lang: es -pandocOptions: | - [ - ' --variable fontsize=12pt --variable documentclass:book --variable papersize:letter --variable classoption:openright --top-level-division=chapter ' - ] - --- # Exil - -Versión grafoscópica del estudio de Kenneth Crews sobre excepciones y limitaciones para bibliotecas y archivos. - -## Introducción - -En el Comité Permanente de Derecho de Autor y Derechos Conexos (SCCR, por sus siglas en inglés, se han realizado ya 3 estudios sobre excepciones y limitaciones para bibliotecas y archivos en el mundo. En el SCCR35, realizado del 13 al 17 de noviembre de 2017, se presentó el tercer estudio. En dicha presentación se usó un mapa para mostrar los países que no tienen excepciones y limitaciones. Buena parte del territorio se encuentra en Latinoamérica. En el siguiente enlace puede verse dicho mapa: https://twitter.com/hiperterminal/status/930759224757575681 - -Al ver este mapa pensaba en Colombia, que tiene excepciones y limitaciones para bibliotecas, pero que realmente son leyes que se han pensado para una época pre-Internet y no necesariamente responden a las necesidades actuales de estas instituciones. ¿Cómo podríamos deconstruir el estudio de Crews y mostrar la realidad de las bibliotecas en detalle? - -EIFL tiene un cuestionario sobre excepciones y limitaciones con 8 diferentes aspectos a considerar, disponible en http://www.eifl.net/resources/core-library-exceptions-checklist-does-your-copyright-law-support-library-activities-and . La idea es tomar el estudio de Crews y mostrar qué tantas excepciones tienen las bibliotecas y archivos en Latinoamérica. - -Por otro lado esperamos, como ya hicimos con el Manual de Periodismo de Datos, abrir documentos para que cualquiera pueda reutilizar estos datos. Que este documento pueda servir de base para hacer análisis propios. Una de las principales diferencias entre el Manual y el Estudio de Crews es que el primero tiene una licencia Creative Commons, que nos permite hacer estas obras derivadas. Resulta paradójico que un estudio sobre las excepciones y limitaciones, para entender mejor este tema no lo tenga y una obra derivada como éste documento sea una infracción al derecho de autor ya que no estamos pidiendo permiso al titular del derecho para hacer este trabajo. - -En este pad se encuentra la información sobre los avances a realizar: https://pad.tupale.co/p/datos-estudiocrews - -## Estudio de Kenneth Crews - - - -~~~{.numberLines} -"The data shows the average publication for person in the country, pero voy a modificarlo para mostrar las excepciones y limitaciones al derecho de autor por país" - | b data | - b := RTMetricMap new. - data := RTTabTable new input: ' -Argentina 1 -Aruba 1 -Bahamas 0 -Belize 0 -Bolivia 1 -Brazil 1 -Chile 0 -Colombia 0 -Costa Rica 1 -Dominican Republic 0 -Ecuador 0 -El Salvador 0 -Guatemala 0 -Guyana 0 -Haiti 0 -Honduras 0 -Mexico 0 -Nicaragua 0 -Panama 0 -Paraguay 0 -Peru 0 -Uruguay 1 -Suriname 1 -Venezuela 0 -'. -"Tengo un error con Suriname 0.00090597, me falta Guyana Francesa --y Jamaica" - data convertColumn: 2 to: [ :t | Integer readFrom: t ]. - b countries: data values named: #first metric: #second. - ^ b -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - -~~~ - -~~~{.numberLines} - "Excepciones y limitaciones al derecho de autor por país sobre limitaciones de responsabilidad a bibliotecas y archivos" - | b data | - b := RTMetricMap new. - data := RTTabTable new input: ' -Argentina 1 -Aruba 1 -Bahamas 0 -Belize 1 -Bolivia 1 -Brazil 1 -Chile 1 -Colombia 1 -Costa Rica 1 -Dominican Republic 1 -Ecuador 1 -El Salvador 1 -Guatemala 1 -Guyana 1 -Haiti 1 -Honduras 1 -Mexico 1 -Nicaragua 1 -Panama 1 -Paraguay 1 -Peru 1 -Uruguay 1 -Suriname 1 -Venezuela 1 -'. -"Ecuador es diferente en realidad, pero el estudio se basa en los datos del estudio Crews" - data convertColumn: 2 to: [ :t | Integer readFrom: t ]. - b countries: data values named: #first metric: #second. - ^ b -~~~ - -~~~{.numberLines} - "Excepciones y limitaciones al derecho de autor por país sobre usos justos" - | b data | - b := RTMetricMap new. - data := RTTabTable new input: ' -Argentina 1 -Aruba 1 -Bahamas 0 -Belize -Bolivia 1 -Brazil 1 -Chile 1 -Colombia 1 -Costa Rica 1 -Dominican Republic 1 -Ecuador 1 -El Salvador 1 -Guatemala 1 -Guyana 0 -Haiti 1 -Honduras 1 -Mexico 1 -Nicaragua 1 -Panama 1 -Paraguay 1 -Peru 1 -Uruguay 1 -Suriname 1 -Venezuela 1 -'. -"Ecuador es diferente en realidad, pero el estudio se basa en los datos del estudio Crews" - data convertColumn: 2 to: [ :t | Integer readFrom: t ]. - b countries: data values named: #first metric: #second. - ^ b -~~~ - DELETED Artefactos/BibliotecaDigitalBogota/exil.ston Index: Artefactos/BibliotecaDigitalBogota/exil.ston ================================================================== --- Artefactos/BibliotecaDigitalBogota/exil.ston +++ Artefactos/BibliotecaDigitalBogota/exil.ston @@ -1,324 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : '%metadata Exil', - #body : '| metadata pandocOptions revision | - -revision := {\'thisNotebook\' -> \'markdownFileChecksumUpto: 10\'} asDictionary. -pandocOptions := { -\' --variable fontsize=12pt\', -\' --variable documentclass:book \', -\' --variable papersize:letter \', -\' --variable classoption:openright \', -\' --top-level-division=chapter \' -}. -metadata := { -\'title\' -> \'Versión grafoscópica del Estudio de Kenneth Crews sobre excepciones y limitaciones al derecho de autor para bibliotecas y archivos en América Latina\'. -\'lang\' -> \'es\'. - -\'pandocOptions\' -> pandocOptions -} asOrderedDictionary. - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : 'Exil', - #body : 'Versión grafoscópica del estudio de Kenneth Crews sobre excepciones y limitaciones para bibliotecas y archivos.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Introducción', - #body : 'En el Comité Permanente de Derecho de Autor y Derechos Conexos (SCCR, por sus siglas en inglés, se han realizado ya 3 estudios sobre excepciones y limitaciones para bibliotecas y archivos en el mundo. En el SCCR35, realizado del 13 al 17 de noviembre de 2017, se presentó el tercer estudio. En dicha presentación se usó un mapa para mostrar los países que no tienen excepciones y limitaciones. Buena parte del territorio se encuentra en Latinoamérica. En el siguiente enlace puede verse dicho mapa: https://twitter.com/hiperterminal/status/930759224757575681 - -Al ver este mapa pensaba en Colombia, que tiene excepciones y limitaciones para bibliotecas, pero que realmente son leyes que se han pensado para una época pre-Internet y no necesariamente responden a las necesidades actuales de estas instituciones. ¿Cómo podríamos deconstruir el estudio de Crews y mostrar la realidad de las bibliotecas en detalle? - -EIFL tiene un cuestionario sobre excepciones y limitaciones con 8 diferentes aspectos a considerar, disponible en http://www.eifl.net/resources/core-library-exceptions-checklist-does-your-copyright-law-support-library-activities-and . La idea es tomar el estudio de Crews y mostrar qué tantas excepciones tienen las bibliotecas y archivos en Latinoamérica. - -Por otro lado esperamos, como ya hicimos con el Manual de Periodismo de Datos, abrir documentos para que cualquiera pueda reutilizar estos datos. Que este documento pueda servir de base para hacer análisis propios. Una de las principales diferencias entre el Manual y el Estudio de Crews es que el primero tiene una licencia Creative Commons, que nos permite hacer estas obras derivadas. Resulta paradójico que un estudio sobre las excepciones y limitaciones, para entender mejor este tema no lo tenga y una obra derivada como éste documento sea una infracción al derecho de autor ya que no estamos pidiendo permiso al titular del derecho para hacer este trabajo. - -En este pad se encuentra la información sobre los avances a realizar: https://pad.tupale.co/p/datos-estudiocrews', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @8, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Estudio de Kenneth Crews', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Países sin excepciones (Columna B)', - #body : '"The data shows the average publication for person in the country, -pero voy a modificarlo para mostrar las excepciones y limitaciones al -derecho de autor por país" -| b data palette | -data := RTTable new input: \' -Argentina\t1 -Aruba\t1 -Bahamas\t0 -Belize\t0 -Bolivia\t1 -Brazil\t1 -Chile\t0 -Colombia\t0 -Costa Rica\t1 -Dominican Republic\t0 -Ecuador\t0 -El Salvador\t0 -Guatemala\t0 -Guyana\t0 -Haiti\t0 -Honduras\t0 -Mexico\t0 -Nicaragua\t0 -Panama\t0 -Paraguay\t0 -Peru\t0 -Uruguay\t1 -Suriname\t1 -Venezuela\t0 -\'. -"Tengo un error con Suriname 0.00090597, me falta Guyana Francesa --y Jamaica" -data convertColumn: 2 to: [ :t | Integer readFrom: t ]. -b := RTMapBuilder new. -b countries: data firstColumn. -b color: [:aCountry | -\t(data values detect: [:v | v first = aCountry]) second = 1 -\tifTrue: [Color lightGreen] -\tifFalse: [Color red]]. -b.', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Desarrollo de colecciones (Columna F)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Soporte a educación e investigación (Columna L)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Preservación y reemplazo (Columna P)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Personas con discapacidades (Columna S)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Formatos neutrales (Columna V)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Salvaguarda de excepciones en entornos digitales (Columna Y)', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Limitaciones de responsabilidad (Columna Z)', - #body : '\t"Excepciones y limitaciones al derecho de autor por país sobre limitaciones de responsabilidad a bibliotecas y archivos" -\t| b data | -\tb := RTMetricMap new. -\tdata := RTTabTable new input: \' -Argentina\t1 -Aruba\t1 -Bahamas\t0 -Belize\t1 -Bolivia\t1 -Brazil\t1 -Chile\t1 -Colombia\t1 -Costa Rica\t1 -Dominican Republic\t1 -Ecuador\t1 -El Salvador\t1 -Guatemala\t1 -Guyana\t1 -Haiti\t1 -Honduras\t1 -Mexico\t1 -Nicaragua\t1 -Panama\t1 -Paraguay\t1 -Peru\t1 -Uruguay\t1 -Suriname\t1 -Venezuela\t1 -\'. -"Ecuador es diferente en realidad, pero el estudio se basa en los datos del estudio Crews" -\tdata convertColumn: 2 to: [ :t | Integer readFrom: t ]. -\tb countries: data values named: #first metric: #second. -\t^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Excepciones flexibles (Columna AA)', - #body : '\t"Excepciones y limitaciones al derecho de autor por país sobre usos justos" -\t| b data | -\tb := RTMetricMap new. -\tdata := RTTabTable new input: \' -Argentina\t1 -Aruba\t1 -Bahamas\t0 -Belize\t -Bolivia\t1 -Brazil\t1 -Chile\t1 -Colombia\t1 -Costa Rica\t1 -Dominican Republic\t1 -Ecuador\t1 -El Salvador\t1 -Guatemala\t1 -Guyana\t0 -Haiti\t1 -Honduras\t1 -Mexico\t1 -Nicaragua\t1 -Panama\t1 -Paraguay\t1 -Peru\t1 -Uruguay\t1 -Suriname\t1 -Venezuela\t1 -\'. -"Ecuador es diferente en realidad, pero el estudio se basa en los datos del estudio Crews" -\tdata convertColumn: 2 to: [ :t | Integer readFrom: t ]. -\tb countries: data values named: #first metric: #second. -\t^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @8, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @11, - @15, - @18, - @22, - @26, - @30, - @34, - @38, - @42, - @46, - @50 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8 -] DELETED Artefactos/BibliotecaDigitalBogota/images/doc1.png Index: Artefactos/BibliotecaDigitalBogota/images/doc1.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc1.png +++ Artefactos/BibliotecaDigitalBogota/images/doc1.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/doc2.png Index: Artefactos/BibliotecaDigitalBogota/images/doc2.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc2.png +++ Artefactos/BibliotecaDigitalBogota/images/doc2.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/doc3.png Index: Artefactos/BibliotecaDigitalBogota/images/doc3.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc3.png +++ Artefactos/BibliotecaDigitalBogota/images/doc3.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/doc4.png Index: Artefactos/BibliotecaDigitalBogota/images/doc4.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc4.png +++ Artefactos/BibliotecaDigitalBogota/images/doc4.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/doc5.png Index: Artefactos/BibliotecaDigitalBogota/images/doc5.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc5.png +++ Artefactos/BibliotecaDigitalBogota/images/doc5.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/doc6.png Index: Artefactos/BibliotecaDigitalBogota/images/doc6.png ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/doc6.png +++ Artefactos/BibliotecaDigitalBogota/images/doc6.png cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo1.jpg Index: Artefactos/BibliotecaDigitalBogota/images/grupo1.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo1.jpg +++ Artefactos/BibliotecaDigitalBogota/images/grupo1.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo2-1.JPG Index: Artefactos/BibliotecaDigitalBogota/images/grupo2-1.JPG ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo2-1.JPG +++ Artefactos/BibliotecaDigitalBogota/images/grupo2-1.JPG cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo2.JPG Index: Artefactos/BibliotecaDigitalBogota/images/grupo2.JPG ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo2.JPG +++ Artefactos/BibliotecaDigitalBogota/images/grupo2.JPG cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo3.jpg Index: Artefactos/BibliotecaDigitalBogota/images/grupo3.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo3.jpg +++ Artefactos/BibliotecaDigitalBogota/images/grupo3.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo4.jpg Index: Artefactos/BibliotecaDigitalBogota/images/grupo4.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo4.jpg +++ Artefactos/BibliotecaDigitalBogota/images/grupo4.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo5.jpg Index: Artefactos/BibliotecaDigitalBogota/images/grupo5.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo5.jpg +++ Artefactos/BibliotecaDigitalBogota/images/grupo5.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/grupo6.jpg Index: Artefactos/BibliotecaDigitalBogota/images/grupo6.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/grupo6.jpg +++ Artefactos/BibliotecaDigitalBogota/images/grupo6.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter1.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter1.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter1.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter1.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter10.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter10.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter10.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter10.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter2.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter2.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter2.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter2.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter3.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter3.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter3.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter3.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter4.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter4.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter4.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter4.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter5.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter5.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter5.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter5.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter6.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter6.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter6.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter6.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter7.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter7.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter7.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter7.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter8.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter8.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter8.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter8.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/images/inter9.jpg Index: Artefactos/BibliotecaDigitalBogota/images/inter9.jpg ================================================================== --- Artefactos/BibliotecaDigitalBogota/images/inter9.jpg +++ Artefactos/BibliotecaDigitalBogota/images/inter9.jpg cannot compute difference between binary files DELETED Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.markdown Index: Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.markdown ================================================================== --- Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.markdown +++ Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.markdown @@ -1,4823 +0,0 @@ ---- -exportedFrom: bd2c0f58191129e14768e9bd578392eead6497fa -title: Pasos para una futura Biblioteca Digital de Bogotá -author: Germán Rey -originalUrl: http://www.culturarecreacionydeporte.gov.co/biblioteca/ -license: #('CC' 'By' 'NC' 'SA') - --- - -# Introducción - - -# PASOS PARA UNA FUTURA BIBLIOTECA DIGITAL DE BOGOTÁ {#pasos-para-una-futura-biblioteca-digital-de-bogotá .tituloi} - -::: {.anchopan .bloque .centrar .blancof .sombra} -Foto Mario Carvajal - -Esta página web contiene el resultado del estudio realizado para la -conceptualización y acciones para la implementación de la Biblioteca -Digital de Bogotá a finales de 2016, las investigaciones anteriores, el -resultado del taller participativo intersectorial realizado el 20 de -diciembre de 2016. Todo esto con el ánimo de ampliar la discusión y -crear las redes necesarias para el desarrollo del proyecto. - -### Documentos de insumo {#documentos-de-insumo .mayusculas .gris} - - -[![](images/doc1.png){.icon}](descargables/Plan%20de%20lectura_100217.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Plan Distrital de Lectura y Escritura "Leer es volar" - -[![](images/doc2.png){.icon}](descargables/UPN%20Lineamientos%20Plan%20Estrategico%202014-2018.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Lineamientos para el plan estratégico 2014 -- 2018 - -[![](images/doc3.png){.icon}](descargables/Relatoria%20mesas%20construccion%20Plan%20de%20Lectura%202016.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Relatoría mesas para la construcción del plan de lectura y escritura -::: -::: - -::: {.bordear .bordeab .margen6} -### Documentos producidos por el equipo investigador {#documentos-producidos-por-el-equipo-investigador .mayusculas .gris} - -::: {.flex .fentre} -[![](images/doc4.png){.icon}](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Bibliotecas digitales, conceptos, tendencias, alianzas y políticas - -[![](images/doc5.png){.icon}](descargables/Analisis%20internacional_Ma%20Alejandra%20Pautassi.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Análisis bibliotecas digitales internacionales - -[![](images/doc6.png){.icon}](descargables/Analisis%20nacional%20y%20de%20tecnologia_Sandra%20Angulo%20.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} - -Análisis nacional y de tecnología -::: -::: - -::: {.azulf5 .cita1 .ajuste .bloque .padding5} -### Algunas definiciones de biblioteca digital {#algunas-definiciones-de-biblioteca-digital .semibold} - -- Una biblioteca digital es un proyecto público, de acceso al - conocimiento, donde actores con intereses similares actúan - des-centralizadamente en un proyecto con fines comunes y - articulados. -- La descentralización y la articulación de un proyecto de esta - naturaleza depende de factores tecnológicos, sin duda, pero también - depende de factores institucionales y de la voluntad de individuos. - En ese sentido clásico, una biblioteca digital es un núcleo que - conecta y pone en dialogo diversos repositorios de información - estructurada. -- Una biblioteca digital en un espacio de acceso a conocimiento en sus - múltiples manifestaciones: textos, libros, revistas, videos, - archivos sonoros, e incluso videojuegos y software, reconociendo la - multiplicidad de maneras como se construye el conocimiento y como se - manifiesta la cultura hoy en día. En ese sentido, una biblioteca - digital debe dar cuenta de todo el rango de expresión humana, - eliminando barreras conceptuales tradicionales que separan a las - personas y las instituciones, a la alta cultura de la cultura - popular. -- Una biblioteca digital debe dar cuenta de la información existente - en el dominio público, de la que se produce en el entorno académico, - de la producida por el sector editorial, audiovisual, y musical. -- Una biblioteca digital también es un espacio de intercambio de - información y de conocimiento construido de arriba para abajo y de - abajo para arriba. -- Una biblioteca digital puede ser una oportunidad de extender el - acceso a la lectura, al conocimiento y al entretenimiento, ampliando - las fronteras de lo público también al entorno digital. -- Una biblioteca digital puede ser una oportunidad para ampliar - programas de formación y educación a distancia, para multiplicar - acciones locales de recuperación de memoria y patrimonio, para - extender el impacto de proyectos que por su naturaleza local carecen - de divulgación. -- Una biblioteca digital es construida por seres humanos para seres - humanos, y por tanto, su vitalidad y relevancia depende de cómo esta - se articule con programas, acciones y proyectos que ocurren en el - mundo real. -- Una biblioteca digital se nutre de prácticas de trabajo del sector - tecnológico y de nuevos enfoques académicos, convoca fuerzas - laborales más amplias, diversas y exige nuevas formas de pensar el - rol de la biblioteca pública en la vida de un ciudadano. En ese - sentido, una biblioteca digital también es una práctica, un método - de trabajo, un organismo vivo que debe ser ágil y mutante, y que - pueda responder con más celeridad a las necesidades de la comunidad - que atiende. - -Catalina Holguín.\ -Texto de apertura del taller intersectorial, diciembre 20, 2016 - - -# ¿Una Biblioteca Digital de Bogotá? Definiciones y aproximaciones - -### Definiciones biblioteca digital de Bogotá {#definiciones-biblioteca-digital-de-bogotá .semibold .mayusculas .azul} - -La definición de la biblioteca virtual de Bogotá es mucho más compleja -que su simple enunciación. Y lo es por varios motivos. En primer lugar, -porque la forma biblioteca, que es una invención milenaria de la -humanidad, está replanteándose de manera muy profunda no sólo por las -transformaciones del libro, sino sobre todo por el lugar que este ha -ocupado en la cultura y por los cambios que se han producido en las -relaciones de las personas con él. En segundo lugar, porque el -calificativo "virtual" desborda la simple acepción tecnológica para -referirse a un nuevo ecosistema en que los significados son muy variados -y entrelazados y corresponden a dimensiones que conciernen nuevamente a -la cultura: la existencia de una inteligencia colectiva, la generación -de redes, el carácter colaborativo del conocimiento, la relación entre -técnicas y memoria o el fortalecimiento de la interactividad (todas -ellas dimensiones que definen el sentido de una biblioteca). Y, en -tercer lugar, porque hay una clara adscripción de la biblioteca a una -ciudad particular ---Bogotá--- que tiene una historia, unos modos de -vivir de sus habitantes, una comprensión del conocimiento y de la -sensibilidad, unos usos determinados de las tecnologías y una geografía -que no solamente se expresa en su ubicación territorial, sino también en -las percepciones de sus habitantes de lo que es una biblioteca y, sobre -todo, de lo que se espera de ella en el contexto de la vida corriente. - -Las bibliotecas son lugares extraños que guardan, por una parte, el -sentido venerable de una tradición (la conservación del conocimiento, la -clasificación y taxonomía de los saberes, la oportunidad de tener acceso -a libros, imágenes y documentos, el testimonio de los cambios que han -experimentado los seres humanos a lo largo del tiempo) y a la vez van -produciendo la sensación de algo detenido en el tiempo. Posiblemente sea -una figura injusta porque las bibliotecas hacen esfuerzos constantes por -remozarse, encontrar funcionalidades que mantengan su vitalidad, diseñar -programas de promoción que atraigan a los lectores e interactuar con -otras expresiones artísticas o corrientes que restablezcan de otro modo -su vigencia del pasado. - -El problema es que no cambian solo las bibliotecas sino que se -transforma severamente el entorno cultural y social que las rodea, como -lo observaremos más adelante en un análisis más detallado de lo que pasa -con la lectura y las bibliotecas en Colombia y, particularmente, en -Bogotá. Constatar estos cambios no es una tarea difícil. En efecto, los -libros disminuyen sus tirajes, la relación del conocimiento con la -biblioteca se desplaza hacia las tecnologías (ya sea a través de las -bases de datos, las aplicaciones, las plataformas digitales o la simple -exploración de la web en internet), el tiempo y su duración en relación -con las distancias y la movilidad urbana tienen otras connotaciones para -el habitante de la ciudad y redefinen sus conexiones con el espacio de -la biblioteca, la lectura compite con una oferta de consumo cultural que -se ha ampliado y que además se concentra en los mismos artefactos que -reemplazan, así sea parcialmente, las funciones de la biblioteca. El -significado de lo documental ha cambiado, como lo ha hecho la tarea de -consulta, y el conocimiento se ha expandido de tal forma que las -bibliotecas son lugares que apenas concentran una parte pequeña de los -materiales de lectura, y lo hacen en un lugar físico que demanda -desplazamientos e inclusive una cierta continuidad en el comportamiento -de los lectores. - -> Biblioteca Digital de Bogotá: las tres palabras que -componen el enunciado (biblioteca, virtual y Bogotá) expresan grandes -conmociones, que tienen correspondencias sociales, simbólicas y -culturales de enorme densidad. Por ello es fundamental que se tengan en -cuenta los cambios sobre los que está asentado el propósito de crear una -biblioteca digital, para que su diseño consulte un horizonte amplio que -pueda ser sometido a un análisis realista que facilite generar -prioridades, definir alcances, tamaño y funciones, prever posibles -relaciones, anticipar los usos por parte de los ciudadanos y garantizar -sus condiciones de sostenibilidad como también los desarrollos posibles -hacia el futuro. -[Germán Rey. Investigación BDB, 2016]{.pie .bloque} - -### Aproximaciones a la Biblioteca Digital de Bogotá {#aproximaciones-a-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas} - -- [Lugar de memoria de y en la ciudad:]{.semibold} La BDB deberá - promover desde su inicio un trabajo sistemático de la memoria - estableciendo relaciones con los referentes institucionales de la - memoria en la ciudad como el Archivo de Bogotá, el Instituto de - Patrimonio, el Museo de Bogotá, entre otros. -- [Lugar de encuentro de la creación en la ciudad:]{.semibold} Bogotá - está atravesada por expresiones musicales, visuales, teatrales o de - intervención en las tecnologías, para mencionar solamente algunas, - que componen su mapa creativo. Más que manifestaciones de la - creación, son modos de construir ciudad. Junto a los festivales de - música, como Rock al parque, está la distribución urbana de los - "ensayaderos" y sobre todo el desarrollo de las bandas de rock en - diferentes lugares de la ciudad, que articulan la expresión musical - con los sistemas de identificación y reconocimiento de los jóvenes. - Estos ejercicios de creación deberían tener un lugar en la BDB, en - nodos que los pusieran en contacto, que permitieran mezclas y - fusiones pero también alianzas y realizaciones prácticas conjuntas. -- [Lugar de articulación entre territorio, conocimiento y experiencia - lectora:]{.semibold} Un elemento fundamental de la BDB será, por una - parte, reconocer las prácticas lectoras en sus localidades, es - decir, las especificidades territoriales del leer y, por otra, - vincular a los habitantes de esas localidades al funcionamiento de - la biblioteca como un sistema virtual, cuyo uso ya no tiene que ver - con las distancias o el lugar sino con otras motivaciones de uso; la - capacidad de navegación, el atractivo de la oferta cultural, la - conexión con sus necesidades, etc. -- [Lugar de exploración de las diversas modalidades del - leer:]{.semibold} Una posibilidad de las bibliotecas digitales es la - de garantizar la recurrencia de diferentes formas de lectura, - inclusive aquellas que provienen de las nuevas experiencias - virtuales: lecturas intempestivas, de vínculos, de participación en - comunidades de lectores, con nuevas estructuras sintácticas, - definidas por los afectos y las emociones (todas esas formas que - desde la lectura tradicional se consideran como no lecturas, - lecturas superficiales e incluso lecturas aberrantes). Lo anterior, - junto a la lectura reposada y analítica, que se propone el recorrido - de textos amplios y en la que se invierte una buena cantidad de - tiempo. -- [Lugar de acceso a recursos que enriquezcan la vida en la - ciudad:]{.semibold} Cada vez es más frecuente entender la biblioteca - no solamente como el lugar de acceso a los libros o a los distintos - materiales impresos sino como un espacio dotado de numerosos - recursos que faciliten y estimulen los procesos de conocimiento. - Muchos de esos recursos son dispositivos o servicios digitales como - por ejemplo las bases de datos, portales y plataformas-e, los libros - electrónicos o en línea, la gama cada vez más grande de - aplicaciones, pero también los catálogos sonoros, los fondos - audiovisuales o los fondos de imágenes, las hemerotecas - digitalizadas. El leer se convierte en una tarea compleja en que - están involucrados diversos lenguajes, sistemas de signos y - experiencias culturales, que además precisan una diversidad de - competencias que sobrepasan al acontecimiento lector. La BDB debería - promover la formación de esas competencias por ejemplo a través de - MOCS o tutoriales, los usos creativos de estos recursos, su - circulación en la web y el diálogo entre los creadores. -- [Lugar-ágora para la deliberación socio-cultural en y desde la - ciudad:]{.semibold} Si bien hay sitios especializados para la - conversación social de los ciudadanos entre sí o con las diferentes - autoridades e instancias públicas, sería importante dotar a la BDB - de alguna posibilidad técnica para facilitar su expresión, diálogo y - debate sobre problemas relacionados con su vida cultural, el acceso - al conocimiento, su aplicación en la vida ciudadana y los vínculos - de la información con sus demandas personales y sociales. Una - dimensión importante de esta ágora digital-cultural es dotar a la - conversación social de información cualificada sobre lo que sucede - en la vida cultural de la ciudad y promover la participación y el - diálogo sobre los problemas y las realizaciones simbólicas de la - ciudad. La BDB debe diseñar estrategias para motivar esta - conversación que bien puede llevar a la lectura y a la deliberación - de la comunidad. -- [Lugar del aprendizaje colaborativo en la ciudad:]{.semibold} El uso - de las bibliotecas físicas tiene que ver con los procesos - educativos. La BDB debe tener en cuenta que una parte importante de - sus usuarios serán estudiantes y que deben promoverse conexiones - eficientes con las bibliotecas escolares, desarrollo de las - competencias de los profesores como acompañantes de los procesos de - lectura y promoción de las competencias lectoras de los estudiantes. -- [Lugar de repositorios y acceso a la información en y de la - ciudad:]{.semibold} Una biblioteca virtual es un espacio de acceso a - colecciones, bases de datos, obras digitalizadas, bancos de - información y diversos tipos de recursos seleccionados de acuerdo a - sus poblaciones prioritarias. Es fundamental la tarea de agregación - y clave la articulación con otras fuentes de generación y - circulación de conocimiento e información. La BDB debe tener una - identidad de ciudad y debe ser un lugar especializado en Bogotá, ya - sea proporcionando conocimiento propio y creativo sobre la ciudad, - ya sea integrando el conocimiento que sobre ella existe tanto a - nivel institucional como en colectivos y grupos sociales. - ->La biblioteca digital es "una herramienta que ocupa -el centro de la actividad intelectual y que no tiene fronteras o -barreras lógicas, conceptuales, físicas o temporales con respecto a la -información\". Se ha generado un cambio [de un sistema centrado en el -contenido, que solo organiza y proporciona acceso a colecciones -particulares de datos e información, a un sistema centrado en las -personas]{.semibold} con el objeto de ofrecerles experiencias -interesantes, novedosas y personalizadas. Su principal función pasó del -almacenamiento estático y la recuperación de información a [propiciar la -comunicación, la colaboración y otras formas de interacción]{.semibold} -entre científicos, investigadores o el público en general en temas que -son pertinentes a la información almacenada en la biblioteca -digital. -[DELOS. Citado en "Anexo 1: Hacia una biblioteca pública digital".]{.pie -.bloque} - -Descargue el texto completo de\ -la investigación realizada por [Germán Rey] - -[\>](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf) - - - -# Usuarios potenciales: recorrido de tendencias y cifras - -# Usuarios potenciales: recorrido de tendencias y cifras {#usuarios-potenciales-recorrido-de-tendencias-y-cifras .tituloi .mayusculas} - - -::: {.imagencontenida .imgfondo7} -::: - -[Recorrido por Biblored: retrato de una red en -2016](https://www.youtube.com/watch?v=svZOUneEgZ8){.gris} - -## ÍNDICE {#índice .azul .extrabold} - -1\. Análisis de cifras - -2\. Encuesta Bienal de Cultura - -3\. Estudio del Observatorio de Desarrollo Económico - -4\. Encuesta de consumo cultural del DANE (2016) - -## Análisis de cifras {#análisis-de-cifras .azul .semibold .mayusculas .interlineado1} - -Colombia y Bogotá cuentan con un conjunto de estudios sobre la lectura y -las bibliotecas de indudable importancia. Además de ser investigaciones -sobre diferentes aspectos del consumo de libros, la generación de -hábitos de lectura, la importancia de los mediadores del leer o los -contextos y lugares de la lectura, son también aproximaciones al consumo -cultural en el que se inscribe la lectura. Más recientemente han -aparecido otras preocupaciones como, por ejemplo, los análisis del -desarrollo de la cultura digital y el impacto de las tecnologías en la -educación como también en general en las sensibilidades y -particularmente en la lectura. - -En los tres estudios de hábitos de lectura y consumo de libros en -Colombia existen datos muy valiosos de carácter sectorial, pero también -de índole longitudinal. Si entre los primeros se puede constatar la -realidad de la lectura y de la no lectura, el desarrollo del leer en -diferentes niveles etarios, socioeconómicos, de género o de grado -educativo, en los segundos es posible confirmar lo que ha sucedido en el -país y en la ciudad en los últimos 15 años, en algunos temas relevantes, -como por ejemplo el surgimiento de lecturas emergentes que se realizan a -través de múltiples pantallas, ya sean las de los computadores, el -teléfono móvil o las tabletas electrónicas. Entre los instrumentos de -análisis cultural se deben destacar los estudios sobre consumo de -libros, asistencia a bibliotecas y hábitos de lectura realizados por el -DANE la encuesta de consumo cultural (DANE), la Encuesta Bienal de -Cultura del Observatorio de Cultura de la Secretaria de Cultura y la -Encuesta Regional del Observatorio de Desarrollo Económico de la -Secretaría de Desarrollo de Bogotá. - -Todos ellos permiten construir un perfil de la lectura y de las -bibliotecas en la ciudad que a la vez ayuda a pensar el sentido y -funcionamiento de su Biblioteca Digital. - -Existe un conjunto de tendencias en todos estos estudios que se pueden -constatar a través de sus mediciones en el tiempo. Entre ellas están la -fuerte presencia de los no lectores, el peso en las prácticas de lectura -de la edad, el nivel socioeconómico, las localidades de la ciudad, el -nivel educativo y el género, el bajo nivel de lectura de libros (1,9 de -promedio al año en Colombia), el incremento significativo de la lectura -en internet, la transformación del mobiliario cultural al que ahora se -integran el computador, el teléfono celular y las tabletas, el papel de -algunos mediadores claves de la aproximación a la lectura, el acceso a -bibliotecas, los temas más consultados, etc. - -Para el presente estudio se analizaron los estudios sobre consumo de -libros, asistencia a bibliotecas y hábitos de lectura realizados por el -DANE en la encuesta de consumo cultural (DANE), la Encuesta Bienal de -Cultura del Observatorio de Cultura de la Secretaria de Cultura y la -Encuesta Regional del Observatorio de Desarrollo Económico de la -Secretaría de Desarrollo de Bogotá. Todos ellos permiten construir un -perfil de la lectura y de las bibliotecas en la ciudad que a la vez -ayuda a pensar el sentido y funcionamiento de su Biblioteca Digital. - -### Conclusiones del análisis de cifras y tendencias {#conclusiones-del-análisis-de-cifras-y-tendencias .azul .semibold .mayusculas} - -Los datos de los estudios sobre Bogotá confirman varias tendencias -importantes que deben ser tenidas en cuenta para la construcción de una -política pública sobre la factibilidad de una Biblioteca Digital de -Bogotá. - -- Existe un contraste verificable entre el acceso a la lectura de los - bogotanos y el incremento de su cultura digital. -- Se ha modificado ya el mobiliario simbólico y cultural de los - bogotanos y bogotanas con un notable incremento de la - infraestructura y las prácticas de apropiación de las tecnologías, - que generan una realidad multi pantalla a través de la cual se ha - incentivado la lectura. -- Aún existen brechas entre las diversas localidades de la ciudad. Se - debe explorar la geografía de estas brechas. -- Las asimetrías frente al uso de las tecnologías están relacionadas - con el estrato socioeconómico, la edad, el nivel educativo y el - género. Tienen más apropiación de tecnologías las personas de clase - alta, los hombres, los más educados y los más jóvenes. -- Es muy determinante la influencia que tienen las tecnologías de - información y comunicación en los más jóvenes de la población de - Bogotá. -- El acceso a las tecnologías se hace particularmente desde las - viviendas, aunque son claves los esfuerzos que se están realizando - para convertir la escuela en un ámbito de expresión y funcionamiento - de las tecnologías. -- El computador y el teléfono móvil son los dos artefactos más - importantes en estos momentos en la vida cultural de los bogotanos. - La televisión está posicionada en un lugar preponderante del consumo - cultural bogotano desde hace años y seguramente empiezan a suceder - cosas con los Smart TV. -- El incremento del computador y su distribución por localidades es un - dato especialmente importante para la definición de políticas en - este campo. -- Una parte importante del consumo cultural de los bogotanos y - bogotanas está sucediendo a través de estos artefactos y en la - navegación por internet. Sobresale el escuchar música, el ver - videos, el participar en redes sociales, el enviar y recibir correos - e inclusive el leer. -- Hay un ascenso de la lectura en internet, aunque aún no hay altos - porcentajes de lectura de libros electrónicos. -- La frecuencia de acceso a internet es muy importante entre la - población joven de la ciudad, es decir, aquella que está entre los - 14 y 18 años. -- Es importante profundizar en la relación del ecosistema digital con - las artes y otras expresiones culturales como la lectura, la - apropiación del patrimonio, y la asistencia a museos y bibliotecas. -- Las culturas científicas y los saberes están circulando por - internet. Los jóvenes acceden a ellos, como soporte de su práctica - educativa y de su desempeño en la vida cotidiana. -- Otros estudios, como por ejemplo los de lectura y lectura digital de - las pruebas PISA, están indicando que Colombia tiene puntajes bajos, - entre otros temas, en las competencias y habilidades para navegar de - manera eficiente en la red y ubicar de manera rápida y correcta los - sitios que pueden proveer de información relevante a los niños y - jóvenes. -- Los recientes resultados colombianos de las Pruebas Saber 11 son - especialmente significativos. Colombia incrementó sus promedios de - 250 a 257 puntos siendo la lectura crítica el resultado pedagógico - más favorecido. -- El desnivel que se observa entre contenidos científicos, - divulgativos y formativos locales y los niveles de acceso a este - tipo de material por parte de los jóvenes es preocupante y de - especial interés para las políticas. -- No existen mediciones sobre las relaciones entre prácticas - artísticas y nuevas tecnologías, muy decisivas para la orientación - de las políticas culturales en la ciudad. - -> A partir de la década de los años ochenta ---se lee -en el Documento de políticas del Distrito--- se han producido -transformaciones sustanciales en las prácticas de interpretación, -valoración y producción del arte y la cultura que fueron heredadas de la -modernidad. Estos cambios han estado motivados por profundos debates -académicos, por transformaciones radicales en las propias prácticas -culturales y artísticas, así como por las presiones ejercidas desde las -agendas culturales y políticas de los grupos y movimientos sociales que -las consideran como territorios de conflicto y negociación cultural y -política. \[...\] Es necesario mencionar el giro radical que marca el -paso de una definición del arte y la cultura como objetos para la -apreciación, la exhibición y el consumo a una que los considera como -prácticas sociales. - -## Encuesta bienal de cultura del 2015, realizada por el Observatorio de Culturas de la Secretaría de Cultura, Recreación y Deporte de Bogotá {#encuesta-bienal-de-cultura-del-2015-realizada-por-el-observatorio-de-culturas-de-la-secretaría-de-cultura-recreación-y-deporte-de-bogotá .azul .semibold .mayusculas .interlineado1} - -- En los últimos 12 meses los bogotanos y bogotanas ha leído - literatura (46,4%), prensa y publicaciones periódicas (35,4%) y un - 35, 3%. Cuando se discrimina esta información se constata que al - sector más bajo socioeconómicamente de la ciudad no le gusta leer en - un 42,4%, el medio en un 30,7% y el alto en un 23,6%. -- Un 10,8% de los ciudadanos y ciudadanas de Bogotá dicen leer un - libro al año, mientras que un 31,2% lo hacen de 2 a 5 libros. El - promedio nacional es muy similar. Los colombianos leemos 1,9 libros - al año. -- La frecuencia de lectura es otro dato importante. Diariamente lo - hace un 26,6% y una vez a la semana un 26,7%. La primera cifra se - distribuye así, según el estrato socio económico: alto un 35,8%, - medio un 30% y bajo un 21,3%. -- Los factores que limitan que se lea más son:\ - Costo: 9,8%\ - Tiempo: 36,7%\ - Interés: 13,8%\ - Dificultad de acceso: 0,8% -- El acceso al material de lectura se hace en:\ - Biblioteca propia o familiar: 22, 1%\ - Biblioteca escolar o universitaria 4%\ - Biblioteca pública: 6,2 %\ - Biblioteca comunitaria: 0,8%\ - Paradero para libros para parque: 0,4%\ - Préstamo entre amigos 6%\ - Internet 9,5%\ - Biblioteca estación 1,1%\ - Librerías 8,0% -- El 59,7% de los encuestados afirman que tienen acceso a internet en - su vivienda. Las localidades que tienen mayor acceso a internet en - su vivienda son Usaquén (75,7%), Teusaquillo (74,3%), Engativá - (68,7%), Suba (68,4%) y Puente Aranda (64,8%), mientras las que - tienen menor acceso son Usme (41,6%), Bosa (46,2%), Rafael Uribe - Uribe (48,6%), San Cristóbal y Santa Fé. -- Los bogotanos usualmente acceden a internet a través de computador - con conexión wifi (21,1%), computador con conexión a red telefónica - conmutada (20.9%) y Smartphone (18%). -- El 33% de los bogotanos usa internet para escuchar música, el 26,9% - ve videos frecuentemente por la web, el 20,5% lee libros, el 30,9% - usa redes sociales, el 39,7% busca frecuentemente información, el - 29% envía y recibe correos electrónicos y el 24,7% frecuentemente - hace tareas utilizando internet. -- El promedio de uso de computador en la ciudad ya es de 63%, mientras - que 87 de cada 100 jóvenes entre 14 y 28 años entran a internet - frecuentemente. En Usme el uso de computador es de un 46%, en Ciudad - Bolívar de 51% y en Bosa de 54%. -- El 82% de personas entre 10 y 28 años usan computador con frecuencia - y en los mayores de 46 años el uso llega al 37%. - - -## Estudio del Observatorio de Desarrollo Económico (ODE), Noviembre del 2015 {#estudio-del-observatorio-de-desarrollo-económico-ode-noviembre-del-2015 .azul .mayusculas .semibold} - -En un estudio reciente del Observatorio de Desarrollo Económico (ODE), -se observan las siguientes tendencias, relevantes para la Biblioteca -Digital de Bogotá: - -- [Internet en las localidades:]{.semibold} - - Chapinero, Usaquén y Suba están por encima del promedio de - Bogotá respecto al uso de internet que es de 66%. - - El uso de computador en Usme es 46%, en Ciudad Bolívar de 51% y - en Bosa de 54%, ubicándolas por debajo del uso promedio de - computador en Bogotá. - - Las localidades con mayor uso de computador son Teusaquillo - (84%), Chapinero (82%), Usaquén (74%) y Barrios Unidos (71%). - - Las localidades con mayor tenencia de teléfonos móviles son - Teusaquillo (93,4%), Chapinero (92,6%), Usaquén (91,5%) y - Engativá (90,5%) -- [Edades en el uso de internet:]{.semibold} - - El promedio de uso de computador en la ciudad ya es de 63%. - - 87% de los jóvenes entre 14 y 28 años entran a internet - frecuentemente. - - El 63% de las personas mayores de 10 años en Bogotá usa - regularmente computador. Y el 39,3% de estos lo hace todos los - días de la semana. -- Las mujeres usan menos computador (60,2%) que los hombres (65%). -- El 75% de bogotanos y bogotanas acceden a internet desde su casa, - mientras que la media de celulares en la ciudad ya alcanza un 86% - del total de su población. - -## Encuesta de consumo cultural del DANE (2016) {#encuesta-de-consumo-cultural-del-dane-2016 .azul .mayusculas .semibold} - -- Usos del internet en Bogotá - - 68, 4% para descargar o escuchar música - - 24,9% para oír radio o ver televisión - - 27% para leer periódicos o revistas en línea - - 22,9% para visitar o acceder a servicios en línea en espacios - culturales virtuales (bibliotecas virtuales, museos, galerías) - - 25,8% para descargar o consultar libros en línea - - 25% para buscar, descargar o jugar videojuegos en línea, - - 57,3% para buscar, descargar o ver películas en línea. -- Número de libros leídos por año en Bogotá: - - Un (1) libro: 23% - - Dos (2) libros: 20,8% - - Tres (3) libros: 18,8% - - Cuatro (4) libros: 10,6% - - Cinco (5) libros: 7,1% - - Seis (6) libros: 8,3% - - Diez (10) o más libros: 11,3% - - El promedio de libros leídos en Bogotá por persona fue de 4,9. -- El 89,8 % de los bogotanos de 12 y más que saben leer y escribir - leyeron en cualquier formato; el 49,6% de esta misma población leyó - libros y el 46,4% revistas. -- Asistencia a espacios culturales - - Bibliotecas: 22,7% - - Teatro, danza u ópera: 19,7% - - Música en espacios abiertos o en espacios cerrados: 24,9% - - Exposiciones de artes visuales: 13,8% - - Exposiciones artesanales y ferias: 19,2% - - -# Articulación con la Política Pública - -# Articulación con la política pública {#articulación-con-la-política-pública .tituloi .mayusculas} - -::: {.imagencontenida .imgfondo3} - - - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -"Leer es volar" nace como un esfuerzo concertado entre la Secretaria de -Educación y la Secretaría de Cultura, Recreación y Deporte de Bogotá. Se -trata por una parte de un plan que involucra a dos áreas fundamentales -de la gestión pública ---la educación y la cultura--- y que se dirige a -una diversidad poblacional conformada por niños y niñas, estudiantes, -jóvenes, maestros, cuidadores, artistas, gestores culturales e -instituciones como escuelas, bibliotecas, museos, entre otros. - -### Líneas estratégicas del Plan Distrital de Lectura y Bibliotecas "Leer es volar" y su relación con la Biblioteca Digital de Bogotá {#líneas-estratégicas-del-plan-distrital-de-lectura-y-bibliotecas-leer-es-volar-y-su-relación-con-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas} - -Promover la lectura y la escritura desde la primera infancia: - -Es importante pensar en la diversidad de las lecturas y las escrituras -que se está generando precisamente entre los niños y los jóvenes de la -ciudad al ingresar en el ecosistema digital. Se requieren, por tanto, -varias acciones que puede potencializar el Plan: - -- Transformación de las percepciones, especialmente de la escuela y - los maestros, sobre la participación de niños y jóvenes en el nuevo - entorno digital. En la Mesa de Cultura Digital del plan se propuso - con acierto el estímulo de etnografías que exploren las experiencias - tecnológicas de los nativos digitales, pero también las de aquellos - que sin serlo (por ejemplo, los maestros o los padres) se deben - enfrentar diariamente a los fenómenos que conforman la nueva cultura - digital. -- Incorporar a los procesos de enseñanza-aprendizaje de la - lectoescritura las competencias relacionadas con los contenidos y - prácticas digitales. -- Formar a profesores de lectura y escritura en el uso de tecnologías - para la activación del aprendizaje en la escuela (Tecnología para la - mejora de la educación: experiencias de éxito y expectativas de - futuro, Francesc Pedró). -- Ofrecer en la Biblioteca Digital de Bogotá contenidos digitales para - el aprendizaje de niños y jóvenes en los centros educativos, así - como posibilidades de creación de contenidos a través de recursos - como aplicaciones específicas. -- El Plan contempla la formación de bibliotecarios y maestros y la BDB - puede ampliar el acceso de niños y niñas a materiales infantiles - interactivos y en línea. También es explícito en recalcar que el - Plan desarrollará una política de textos escolares que fomente el - vínculo entre las competencias de lectoescritura y el gusto de la - lectura "desde diferentes temas, formatos y dispositivos". En el - Plan Nacional de Lectura y Escritura liderado por el Ministerio de - Educación se afirma que busca que todos los niños y jóvenes del país - cuenten con libros y materiales de lectura de calidad que les ayuden - a fortalecer sus procesos de aprendizaje y a mejorar sus - competencias en lectura y escritura. De ahí la entrega de su - Colección Semilla. - -Fortalecer, modernizar y articular las bibliotecas públicas y escolares - -En el Plan Nacional de Lectura y Escritura del Ministerio de Educación -se dice expresamente que se deben crear o fortalecer las Bibliotecas -escolares, entendidas no como lugares en el que se depositan los libros, -sino "como un espacio que se articula con el proyecto educativo de la -nación, con el proyecto educativo institucional y con el currículo -mismo". Se reconoce de ese modo que "la escuela y la biblioteca escolar -son los espacios ideales para incidir en el comportamiento lector y en -la comprensión lectora, así como en sus producciones escritas". Aunque -no se menciona específicamente la relación entre lectura, ecosistema -digital y educación, el Plan menciona la necesidad de tener una -"estrategia de redes sociales basadas en la web, que alimente -permanentemente comunidades de interés sobre el tema de lectura y -escritura". Un propósito fundamental de la BDB sería entonces: - -- Vincularse con las diversas modalidades de bibliotecas y desarrollar - servicios que puedan dirigirse hacia las escuelas y centros - educativos de la ciudad para tratar de superar la notable desventaja - que tiene un número importante de escuelas y colegios del Distrito - que no cuentan con biblioteca escolar. -- Generación de comunidades de lectores y sitios virtuales de - encuentro e intercambio de prácticas y experiencias de lectura -- Suministro de recursos tecnológicos para cualificar la lectura y la - escritura cuyos resultados puedan compartirse en la biblioteca - digital -- Programas de alfabetización y formación de competencias para - desempeñarse adecuadamente en el entorno digital -- Reconocimiento social de propuestas y experiencias educativas de - lectura y escritura, tutoriales y acompañamiento virtual de - prácticas de lectura y escritura, entre otros. - -Fomentar la investigación, la evaluación y el diálogo de saberes frente -a la cultura escrita. - -Será muy clave hacer el seguimiento de la relación de los nuevos modos -de leer con los nuevos modos de escribir que están surgiendo con el uso -de las tecnologías. Según los estudios nacionales y distritales aumenta -la lectura en internet, así como la utilización del correo electrónico, -los chats y los blogs. Como se señaló en la Mesa de Cultura Digital, -convocada por el Plan de lectura "Leer es volar": "No se trata solamente -de crear la Biblioteca Virtual de Bogotá. Esto es uno de los proyectos -importantes del plan y será abordado en la presente reflexión. Pero el -tema va más allá: ¿cómo garantizar desde las políticas públicas la -apropiación social del conocimiento en el entorno digital? ¿Cómo -contribuir al desarrollo de las capacidades digitales de los ciudadanos -para que puedan acceder a la información, construir contenidos -culturales, crear y compartir conocimientos y relacionarse de manera -activa con otros, próximos y lejanos? -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -"Leer es volar" nace como un esfuerzo concertado entre la Secretaria de -Educación y la Secretaría de Cultura, Recreación y Deporte de Bogotá. Se -trata, por una parte de un Plan que involucra a dos áreas fundamentales -de la gestión pública --la educación y la cultura- y que se dirige a una -diversidad poblacional conformada por niños y niñas, estudiantes, -jóvenes, maestros, cuidadores, artistas, gestores culturales e -instituciones como escuelas, bibliotecas, museos, entre otros. - -[](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf) - -::: {.naranjaf .ancho4 .descargar .pointer .ajuste .margen5} -::: {.punteada .ajuste .des} -DESCARGAR -::: -::: -::: - -::: {.naranjaf1 .cita1 .ajuste .bloque .margenes2} -[Acciones digitales en el marco del Plan Nacional de Lectura "Leer es mi -cuento"]{.semibold}\ -Un primer contacto con lo digital es el reconocimiento que hace el Plan -al acceso y circulación de la información y el conocimiento como un -objetivo del estímulo de la lectura y la escritura. - -- Un acción muy destacable en este sentido es la creación por parte - del Ministerio de dos portales: Maguaré para la primera infancia y - Maguared para los cuidadores, padres de familia y maestros. -- La BDB tiene en estos dos portales un ejemplo del uso de tecnologías - digitales para la promoción de la lectura y la escritura fuertemente - enraizado en diferentes manifestaciones del patrimonio inmaterial - del país, una estrategia de participación, y un conjunto de señas de - identidad que se relacionan con la vida simbólica de niños y niñas. - También es un ejemplo de conversación de la lectura y la escritura - con la música, los relatos populares, el medio ambiente y los - valores de la convivencia pacífica. -- A estas líneas de trabajo el Plan "Leer es mi cuento" suma programas - de formación para bibliotecarios, a través de la Biblioteca Nacional - de Colombia, que tienen en cuenta la formación tecnológica en - gestión bibliotecaria además de la formación virtual y digital. A - través del Proyecto uso y apropiación de TICs se busca dotar a las - bibliotecas públicas con computadores y tecnología complementaria - (tabletas, pantallas, proyectores, impresoras, etc) y software. -- La BDB deberá apoyar estas iniciativas en coordinación con las - entidades del sector que las llevan a cabo, posiblemente - especializando su labor para una mayor eficiencia. -::: -::: -::: - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Consideraciones para tener en cuenta de la Mesa de Cultura Digital del Plan "Leer es volar" {#consideraciones-para-tener-en-cuenta-de-la-mesa-de-cultura-digital-del-plan-leer-es-volar .azul .semibold .centrar .mayusculas} - -Las preocupaciones planteadas por la Mesa son legítimas y complementan -las relaciones particulares entre el Plan y la Biblioteca Digital de -Bogotá en la medida en que se interesa por el papel del nuevo ecosistema -digital en los procesos de conocimiento que se dan, circulan y se -apropian en la ciudad, no sólo por parte de los sujetos de la comunidad -educativa (maestros, bibliotecarios, niños, niñas, jóvenes y padres de -familia) sino también por todos los ciudadanos sin discriminación -ninguna. - -Hay una gran tarea educativa que rebasa a la institucionalidad educativa -distrital y que tiene en cuenta la relevancia del conocimiento y la -información en la vida cotidiana de los ciudadanos. En otras palabras: -ser ciudadano hoy significa poder tener autonomía, dominio y creatividad -frente a las tecnologías y lo que ellas permiten y facilitan. La BDB -debe proponerse contribuir a esta tarea que no se define explícitamente -en el Plan. A continuación se analizan algunas preocupaciones expresas -en la Mesa de Cultura Digital: - -- Existencia y complementación de diferentes modalidades de lectura y - la necesidad de abrir las puertas a otros contenidos que no sean - necesariamente literarios. Es lo que Bernard Lahire ha llamado la - "lectura de gestos", frente a la "lectura de interpretación". - Mientras en la segunda están los textos literarios, en la primera se - comprenden aquellas lecturas ancladas en realidades cotidianas. -- Fortalecimiento de la conectividad. Los datos que muestran una - permanencia de la brecha digital especialmente en los sectores - populares y en los niveles educativos bajos y la necesidad de una - alfabetización digital de los maestros como una política pública - consistente y urgente. "Hace falta pensar desde la política cómo - lograr que los profesores inicien la actualización frente a estos - cambios, esto no se le puede delegar a los esfuerzos individuales de - cada profesor. Desde la SED, se debe plantear una política pública - relacionada con la lectura digital". -- Interés por conocer y evaluar los recursos y contenidos digitales - que el Estado está ofreciendo al sector educativo y en general a los - ciudadanos. Como se afirma en la Mesa "la cultura digital exige una - participación activa del lector ya que está inmerso en la - hiperlectura. La mediación, el eje de las prácticas, debe ser la - producción del conocimiento. Lo digital transforma las prácticas y - vivifica las experiencias". -- La lectura digital o los nuevos modos de leer no son simplemente - prácticas que transcurren en soportes nuevos y diferentes. El mundo - digital propone un conjunto de conceptos nuevos que redimensionan el - acto de leer. Los asistentes a la Mesa del plan de Lectura de Bogotá - lo dicen así: "Leer dejó de ser posar los ojos, se pasó a una - lectura sensitiva. La prioridad está en sustentar la práctica en los - propios fundamentos del mundo digital que presupone fundamentos - epistemológicos propios de lo digital" y además confirman los - tránsitos y relaciones de la lectura y la escritura entre el mundo - analógico y el digital. "La promoción de la lectura debe ser - valorada desde lo análogo y lo digital, hay que ver que hay en uno y - otro, y cómo se complementan. Los promotores de lectura están siendo - exigidos por los nuevos formatos y se enfrentan a las necesidades de - los lectores. Cuando se tenga claro cómo es el lector se identifica - cómo se debe formar el promotor de la lectura". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -[Algunas ideas de la Mesa de biblioteca pública escolar para el Plan -\"Leer es Volar\":]{.semibold}\ -Las bibliotecas deberían convertirse en lugares de transmisión de -sentidos (artísticos políticos culturales etc.,) promoviendo la cultura -informacional, esto es, la utilización de recursos de información de -toda índole para resolver problemas cotidianos ya sean académicos, -existenciales o de otro tipo. - -- Compartir saberes está asociado a comunidades de aprendizaje, lo - primordial de las bibliotecas es poner a la gente en diálogo. -- Generar intencionalmente desde la biblioteca los espacios que - generan conocimiento, que sean como laboratorios de creación. Sin - embargo, hay vacíos porque no se han tenido en cuenta las etapas - para llegar a esto, hace falta preparación. -- El tema de los laboratorios de creación artística es una gran - herramienta para que la biblioteca responda a la diversidad - cultural. Estos laboratorios permiten que la comunidad tenga la - posibilidad de investigación y de creación. La biblioteca como sitio - de experimentación. -- La biblioteca debe ser un centro de producción de contenidos. -- Facilitar el acceso, el préstamo a domicilio, el préstamo - interbibliotecario, el acceso remoto. -- En la Biblored no es visible el tema de la memoria. Los usuarios - quieren encontrar la historia de su localidad: estudios serios, - fotos de lo que fue su localidad, relatos. Debe haber un espacio - físico y concreto en la biblioteca que tenga recursos - bibliográficos, recursos informativos, registros auditivos. -- Hay que identificar entonces las prácticas de memoria de los niños y - jóvenes, su manera de registrar y fijar ciertos hechos. Las - bibliotecas públicas deben identificar esas prácticas de memoria y - cerrar las brechas: los youtubers tienen sus propias prácticas de - memoria, hay que crear lazos con ellos, por ejemplo. -::: -::: -::: - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Carácter de la mediación en los procesos de lectura y el papel de los mediadores en una biblioteca digital {#carácter-de-la-mediación-en-los-procesos-de-lectura-y-el-papel-de-los-mediadores-en-una-biblioteca-digital .azul .semibold .centrar .mayusculas} - -Hacer una Biblioteca Digital es operacionalizar un proceso mediador, en -este caso, en el campo de las lecturas y las escrituras en la ciudad. En -efecto la BDB es un nuevo mediador institucional y no simplemente una -estrategia de mediación. Las tecnologías de la información y la -comunicación configuran un área de mediación entre los ciudadanos, la -lectura y la escritura en el entorno de la ciudad. Mediación porque -facilitan su acceso a la información y el conocimiento, estimulan el -vínculo de la lectura y la escritura con los contenidos digitales, -generan oportunidades de ingreso a colecciones, portales interactivos, -tutoriales, aplicaciones y otros dispositivos y favorecen la -alfabetización y el desarrollo de competencias de la comprensión -digital. - -El tema de la mediación fue un tópico que apareció frecuentemente en la -mesa de cultura digital del Plan "Leer es volar" junto con otros -igualmente persistentes como la creación de contenidos y conocimiento, -la democratización, la relevancia de las redes, la diversidad de la -oferta y el significado de los entornos digitales para la educación. - -Sobre la mediación se puntualizó que el mediador debe tener la capacidad -de proporcionar las herramientas para búsquedas efectivas en Internet; -esto implica la formación de mediadores distintos o de otras maneras de -mediar. La biblioteca debe ayudar a encontrar los recursos y poner a -disposición dispositivos digitales de diferente índole; se busca un -sujeto prosumidor. Un mediador que abra la posibilidad de que haya -encuentros con los otros: creación de redes y relaciones con los demás -(no autistas). Lo digital requiere de una mediación para la construcción -del conocimiento, construcción de lectores críticos y argumentativos. - -La creación de contenidos resalta el papel activo y creativo de los -lectores. Como se afirmó en la Mesa de Cultura Digital, habitualmente se -cree que todo lo que tiene que ver con lo digital se concreta en el -manejo de las herramientas pero no se piensa en términos de contenidos y -en las prácticas de lectura y escritura que allí suceden. Incluso los -jóvenes tienen una visión restringida de lo que ofrece Internet: se -limita a las redes sociales. Aquí es clave la mediación para explorar -todas las posibilidades que ofrece lo digital porque el volumen de -información a la que se puede acceder es enorme: hay que desarrollar -capacidades para discriminar, para valorar la información que llega, -saber discernir. Con la mediación debe estar la medición: habría que -analizar qué prácticas de lectura hace la gente y cómo navega. No es -solamente curaduría de contenidos, es el papel de los ciudadanos en la -producción de información y la creación colectiva. - -Los mediadores de la lectura y la escritura son tradicionalmente los -maestros, los bibliotecarios, los padres de familia, los cuidadores, -entre otros. En la evaluación del Plan de lectura "Leer es mi cuento" -(2015) se lee que "La misión del bibliotecario como agente mediador -entre los libros y los niñas y las niñas es sin duda una de las razones -por las cuales el programa consigue generar los resultados que se han -evidenciado a lo largo de este capítulo. No es arriesgado pensar que el -auge de una biblioteca depende mucho del talante y la entrega del -bibliotecario, de las actividades que propone y el conocimiento que -tiene sobre los recursos de los que dispone. Por lo anterior es -importante lograr una mayor sensibilización para que los bibliotecarios -cada vez más entiendan que la población de la primera infancia es una de -las prioridades de su gestión". -::: - -> Sobre el enfoque de acceso y mejoramiento de los -hábitos de lectura de la población colombiana, debe admitirse que el -programa no ha logrado atraer a un conjunto significativo de nuevos -usuarios de bibliotecas. Esta realidad resulta preocupante por dos -motivos. Uno es que la inversión realizada para dotar a las bibliotecas -y formar a los bibliotecarios está siendo utilizada mayoritariamente por -personas que ya tenían contacto con la bibliotecas y en ese sentido, -está mejorando condiciones ya existentes pero no ampliando la base de -nuevos lectores. El otro motivo que causa preocupación es que los -impactos conseguidos son robustos y están concentrados mayoritaria y -precisamente en el grupo de nuevos usuarios de la biblioteca y de la -colección. Lo que esto significa es que los aportes positivos que -reciben las familias que ya son usuarias no son tan significativos y -que, por lo tanto, si no se logra ampliar la base de usuarios, el -programa nunca generará los efectos esperados. En ese sentido, si bien -el retorno obtenido es positivo, el programa tiene un enorme potencial -de crecimiento"... y que "se puede afirmar que Leer es mi Cuento no ha -sido eficaz para profundizar la apropiación social de las -bibliotecas. - -### Creación de contenidos y otras formas de participación y generación de conocimiento. {#creación-de-contenidos-y-otras-formas-de-participación-y-generación-de-conocimiento. .azul .semibold .centrar .mayusculas} - -La política debe contribuir al fomento de iniciativas de creación y -conservación colectiva de la generación de conocimiento. Es necesario un -modelo abierto en el que haya corresponsabilidad en la preservación del -conocimiento. También el modelo debe propiciar la creación colectiva -tanto de las instituciones, como los ciudadanos. Desde la política -pública es necesario hacer la distinción entre el uso de la información -y generar conocimiento. Bajar y procesar no es lo mismo. El conocimiento -es una diversidad de informaciones, pasa por la interpretación que hace -un sujeto. No es solamente saber dónde está la información. - -La generación de redes es otro tema central para la BDB que está muy -respaldado por las opiniones de los integrantes de la Mesa de Cultura -Digital. Existen en educación muchas redes: ¿qué sucede en estas redes? -¿La cultura digital las facilita? ¿Hay aprendizaje colaborativo? ¿Hay -más innovación? ¿Son modelos exitosos? ¿Qué dificultades y aciertos -tienen? Hay algunas redes que tienen alcance internacional (red de -docentes, red de lectura, escritura y oralidad, red de danza, red de -investigadores). Hay que hacer un estado del arte de lo que ya hay. - -Los espacios propicios no solo son físicos, sino también digitales. -¿Cómo es un espacio digital propicio? Debe ser un espacio que facilite -el acceso a contenidos de calidad y a crear los propios contenidos. Debe -tener espacios para interacción social. Hay personas que muestran sus -capacidades más fácilmente a través de lo virtual (esto se ve claramente -en la formación virtual). Cuando se lee en un medio electrónico se puede -empezar a interactuar más fácilmente con otros. La lectura de un libro -físico en un espacio físico no implica la posibilidad de interacciones -de manera tan inmediata. Además, quien lee un libro electrónico puede -acceder a otros contenidos. Las prácticas claramente se transforman. -Quien es buen lector en lo físico tiene mayor oportunidad de ser un buen -lector digital. - - -# Bibliotecas Digitales en Colombia: ¿Qué están haciendo y cómo se están pensando? - - -# Bibliotecas digitales en Colombia: ¿Qué están haciendo y cómo se están pensando? {#bibliotecas-digitales-en-colombia-qué-están-haciendo-y-cómo-se-están-pensando .tituloi .mayusculas} - -Por: Sandra Angulo -::: - -::: {.imagencontenida2 .imgfondo4} -::: - - - -::: {.flex} -::: {.ancho1 .descripcion .ajuste .flexv .flexceh} -::: - -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\. Introducción - -2\. Matriz comparativa de distintas bibliotecas nacionales - -3\. Buenas prácticas para tener en cuenta en Bogotá - -4\. Recomendaciones tecnológicas para tener en cuenta en Bogotá -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Introducción {#introducción .azul .semibold .centrar .mayusculas .interlineado1} - -El panorama de bibliotecas digitales en Bogotá y en Colombia es diverso. -Con excepción del proyecto Biblioteca Digital Colombiana, que agrupó -bajo una misma metodología y plataforma tecnológica los repositorios -digitales de 13 universidades del país y luego hizo apertura para -incluir otro tipo de contenidos culturales, los demás proyectos -digitales tienen características diversas, bien por las plataformas o -tecnología usadas, los servicios prestados, o los contenidos -desarrollados y publicados. Este ejercicio compara nueve bibliotecas -colombianas con desarrollo de servicios o contenidos digitales, y en tal -caso, las conclusiones sólo se enfocan en estos propósitos. Para efectos -de este estudio fueron analizadas las siguientes bibliotecas: Red de -Bibliotecas -- Programa de la Fundación EPM de Medellín, Red de -Bibliotecas del Banco de la República, Red Nacional de Bibliotecas -Públicas, Red Municipal de Bibliotecas de Cali, Biblioteca Departamental -del Valle del Cauca, Biblioteca Departamental de Norte de Santander, -Biblioteca Departamental del Meta, Biblioteca Digital Héctor Rojas -Herazo especializada en el Caribe Colombiano, y El libro total: la -biblioteca digital de América. Finalmente, este estudio propone -lineamientos generales para la implementación de una biblioteca digital, -los cuales pueden ser consultados en la sección "Orientaciones técnicas, -modelo de plan de trabajo y estándares". - -Los hallazgos de este estudio se pueden resumir en los siguientes -puntos: - -- La Red de Bibliotecas-EPM (Medellín) se destaca porque articula y - optimiza los servicios físicos y digitales de una región, siendo el - único caso en el país. -- La BibloRed (y el portal que lleva su nombre) no es la Biblioteca - Digital de Bogotá. -- Existe una tendencia en todos los proyectos por la generación de - contenidos patrimoniales a partir de colecciones físicas con énfasis - en proyectos digitales fotográficos. -- Las exposiciones virtuales son la modalidad de contenidos digitales - más usada. -- Existe un potencial de producción de contenidos digitales - colombianos que no estamos capitalizando en red. -- En el caso de Bogotá, existen al menos veinte instituciones - distritales que producen contenidos digitales culturales y - educativos pertinentes para integrarse en el concepto de una - biblioteca digital para la ciudad. -- Los proyectos digitales de las bibliotecas departamentales se - enfocan en fotografía y la comunidad participa en ellos. -- La comunidad también participa de otra manera en contenidos - digitales a partir de los planes de promoción de lectura, pero no - son visibles en las bibliotecas. -- Existe una preferencia por referenciar proyectos digitales - internacionales frente a los mismos nacionales. -- Existe una tendencia por el uso de repositorios digitales con - software Dspace y, en consecuencia, un camino ya transitado en la - estandarización de formatos, metadatos e infraestructura de - preservación digital. -::: -::: - -::: {.blancof} -Red de Bibliotecas -- Programa de la Fundación EPM de Medellín -::: -::: - -Red de Bibliotecas del Banco de la República - -BibloRed - -OverDrive - -Ebsco - -Bibliotechnia - -McGraw Hill - -Multilegis - -Leyes.info - -Enciclopedia Britannica - -Manuvo: libros interactivos; colecciones de [música]{.semibold} -Alexander Street Press: American Song, Classical Music Reference -Library, Classical Scores Library Contemporary World Music, Jazz Music -Library, Smithsonian Global Sound for Libraries, Popular Music Library, -The Garland Encyclopedia of World Music Online, Classical Music in -Video, Dance in Video y Opera in Video. - -Virtualplan Forestal\ -Virtualplan Gastronomía\ -Virtualplan Procesos industriales - -Enciclopedia Escolar - -Océano saber - -Enciclopedia Virtual Nat Geo - -Naxos Music Library - -Enciclopedia Virtual Nat Geo Kids - -Naxos Sheet Music - -Manuvo: libros interactivos - -[Cuadro 1:]{.semibold} Bases de datos por suscripción en las bibliotecas - - -------------------------------------------------------------------------------------------- - Bases de datos de acceso abierto usadas en la Red de Bibliotecas del Banco de la República - Dialnet - DOAJ (Directory of Open Access Journals) - Biomed Central - Biblioteca Virtual en Salud - PLoS Public Library of Science - -------------------------------------------------------------------------------------------- - -[Cuadro 2:]{.semibold} Solamente el Banco de la República vincula bases -de datos de acceso abierto. - -\ - -::: {.ajuste .descripcion .ancho1} -Las plataformas de gestor de contenidos más usadas por la totalidad de -las bibliotecas es Drupal y Dspace. En relación con los formatos usados, -existe una estandarización en todas las bibliotecas, usando mayormente -formatos ePub, pdf, html, mp3 y mp4. Sólo una biblioteca, la Red de -Bibliotecas --EPM tiene en uso un App para acceso a servicios de la Red. -Cada red tiene definido un tipo de software diferente para el catálogo -bibliográfico: Janium (código propietario) para las bibliotecas de la -Red de Bibliotecas-EPM, Koha (Código abierto) para las bibliotecas de la -Red Nacional y AbsysNet (código propietario) para las bibliotecas del -Banco de la República. - -[Servicios y posicionamiento]{.semibold}\ -El principal servicio de las bibliotecas es la circulación de los -contenidos digitales, bien a través del préstamo digital con condiciones -específicas, por ejemplo, en tiempo y unidad de préstamo, o los -contenidos de acceso abierto. En el caso de las bibliotecas -departamentales, municipal de Cali y la Biblioteca Digital Rojas Herazo, -los contenidos patrimoniales son en sí mismo un servicio. - -La principal herramienta para circulación y posicionamiento es la página -web a través de las noticias, la agenda cultural del momento y las redes -sociales. La Red de Medellín publicita o hace visible todas las -bibliotecas de su red a través de enlaces directos o sugerencias de -consulta, y en las páginas destacadas, a diferencia de las demás -bibliotecas, esta red destaca proyectos culturales y pedagógicos del -mismo ámbito geográfico, entre otros. Las demás bibliotecas, incluida -BibloRed, destacan otros proyectos y bibliotecas digitales tanto -nacionales como internacionales. - -Existen otros servicios digitales tales como: Catálogo en el celular, -tutorial de acceso y uso del catálogo bibliográfico en la Red de -Bibliotecas-EPM, el servicio de la Llave del Saber utilizada en las -bibliotecas de la Red Nacional y Municipal de Cali. -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## MATRIZ COMPARATIVA DE DISTINTAS BIBLIOTECAS DIGITALES NACIONALES {#matriz-comparativa-de-distintas-bibliotecas-digitales-nacionales .azul .semibold .centrar .mayusculas .interlineado1} -::: - -Red de Bibliotecas - Programa de la Fundación EPM -::: - -Url - -[www.reddebibliotecas.org.co/](http://www.reddebibliotecas.org.co/){.azul} - -Tipo de biblioteca - -Descripción del\ -proyecto digital - -La Red de Bibliotecas, un programa Fundación EPM. En la versión digital -se trata de un portal web que agrupa servicios digitales para 115 -bibliotecas de Medellín, área metropolitana y Antioquia; y se ocupa de -apoyar, difundir y visibilizar la labor que realiza cada una de ellas en -beneficio de su entorno social. Además, cuenta con un conjunto de -servicios y contenidos digitales que propenden por la apropiación social -del conocimiento, la alfabetización e inclusión digital, y la promoción -de la memoria histórica local. - -Financiación y aliados (Redes de colaboración) - -Alianza de Empresas Públicas de Medellín, Fundación EPM, Área -Metropolitana, Alcaldía de Medellín y la Biblioteca Pública Piloto. - -Público - -General, teniendo en cuenta que ofrece contenidos académicos, -pedagógicos, locales, patrimoniales y de interés general que trascienden -el perfil de un público infantil y adolescente como es el llamado a las -bibliotecas públicas. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Cuenta con acceso limitado para usuarios de las bibliotecas de la Red en -cuanto a documentos en las plataformas licenciadas, y acceso abierto a -contenidos propios, como de otros proyectos nacionales a los que se -hipervíncula a través de la página web. - -Política de creación de colecciones digitales - -Sí. Los contenidos y servicios tienen tres líneas: apropiación social -del conocimiento, alfabetización e inclusión digital, y promoción de la -memoria histórica local. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sí para el caso de las multimedias de la Sala Interactiva, que usa -documentos originales patrimoniales de la colección fotográfica de la -Biblioteca Pública Piloto de Medellín. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -Drupal versión 2.6.2 para la página web. Plataforma de préstamo de -libros: OverDrive, e-books 24-7, Bibliotechnica, Britannica Escolar, -Enciclopedia Virtual Nat Geo y Nat Geo Kids. Catálogo bibliográfico: -Janium. - -Perfil de usuarios - -Jóvenes, niños y familias. - -Acceso a contenidos (¿personal carnetizado o todos?) - -El acceso es personal a las diferentes bibliotecas de la Red a través de -carné. En la página el usuario debe usar el número de tarjeta de la -biblioteca en donde se encuentra registrado. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -conformada por 8 secciones -(inicio-catálogo-agéndate-diario-bibliotecas-sala de lectura-sala -interactiva y páginas especiales). A través de la página de inicio se -accede también a las secciones de agéndate, diario, sala de lectura y -sala interactiva. La navegación en toda la página tiene un máximo de -tres niveles. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Los contenidos digitales se encuentran distribuidos en las secciones de -Sala de lectura y Sala interactiva. En la Sala de lectura y a través de -un tercer nivel de acceso, se llega a los siguientes contenidos: 600 -libros y audiolibros digitales entre novelas, cuentos, ciencia y -naturaleza, en formatos adaptativos para lectura en tabletas, teléfonos -inteligentes y computadores, disponibles para préstamo digital a través -de la plataforma OverDrive. 197 libros licenciados de la editorial Mc -Graw Hill con disponibilidad para lectura en línea de entre 1 y 10 -copias en la plataforma e-books 24-7. Libros licenciados en formato pdf -de la plataforma Bibliotechnica en temas de: Bellas artes, Ciencias -naturales y Matemáticas, Ciencias sociales, Filosofía y Psicología, -Geografía e Historia, Lenguas, Literatura, Religión y Tecnología. -Licencias para acceso a las enciclopedias: Britannica Escolar, -Enciclopedia Virtual Nat Geo y Nat Geo Kids. La Sala Interactiva: cuenta -12 exhibiciones virtuales en multimedia sobre temas históricos, -culturales y sociales de Medellín, desarrolladas a partir de documentos -patrimoniales del Archivo Fotográfico de la Biblioteca Pública Piloto de -Medellín en un lenguaje y diseño para un público general. -Adicionalmente, tres multimedias dirigidas a público infantil y juvenil, -trabajos en asocio con el programa Medellín Digital de la Alcaldía de -Medellín. Enlaza a 14 proyectos de libros digitales producidos por -entidades como Ministerio de Cultura, Ministerio de Educación, Instituto -de Bienestar Familiar y Biblioteca Nacional entre otros, los cuales -están en acceso gratuito y libre. De igual forma, enlaza al proyecto -Libro Total y a una selección de libros en español del proyecto -Gutenberg. Cada proyecto tiene una página de presentación con un leguaje -uniforme. - -Formatos - -ePub, pdf, html, mp3, multimedia. Cuenta con un App para acceso a -servicios de la Red - -Gestión de derechos de autor - -La entidad paga una licencia a las plataformas de préstamo. Los demás -contenidos están en dominio público. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -El catálogo de la firma Janium centraliza las búsquedas de las -bibliotecas que conforman la red: 29 bibliotecas del Sistema de -Bibliotecas Públicas de Medellín, 48 bibliotecas públicas de Antioquia, -8 de Comfenalco, 11 de Comfama, 13 bibliotecas del Área metropolitana -del Valle de Aburrá, 12 bibliotecas especializadas, 4 de la Fundación -Ratón de Biblioteca, Centros de documentación de ambiente, Planeación -Municipal, Buen Comienzo y repositorio digital de la Secretaría de -Salud, Archivo Histórico de Medellín y Biblioteca Pública Piloto de -Medellín. - -Estrategia de posicionamiento (mercadeo digital) - -En la última sección la página cuenta con contenidos generales enfocados -al fortalecimiento de capacidades de los usuarios: MOOCs-cursos en -línea, comunidad de bibliotecólogos, eventos del libro, Hay Festival, -Fundación Letra Verde y Comunidad de Cinéfilos. - -Otros servicios digitales (conocimiento colaborativos, chats virtuales, -aplicaciones, videojuegos, etc\...) - -App, escaneo de código de barras o código ISBN y se accede a la -localización y disponibilidad del documento, tutoriales de acceso al -App, plataforma OverDrive, y catálogo. - -Contacto - -(57-4) 511 51 98 rflorez@fundacionepm.org.co - -Red de Bibliotecas del Banco de la República - -Url - - - -Tipo de biblioteca - -Red de bibliotecas. Institución pública. - -Descripción del\ -proyecto digital - -La Red de Bibliotecas del Banco de la República está conformada por la -Biblioteca Luis Ángel Arango y 20 bibliotecas más. Además, cuenta con 5 -Centros de Documentación Regionales. - -Financiación y aliados (Redes de colaboración) - -Público - -General, teniendo en cuenta que ofrece contenidos académicos, -pedagógicos, locales, patrimoniales y de interés general que trasciende -el perfil de un público infantil y adolescente como es el llamado a las -bibliotecas públicas. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Cuenta con acceso limitado para afiliados de las bibliotecas de la Red, -en cuanto a documentos en las plataformas licenciadas, y acceso abierto -a contenidos propios y a catálogos para toda clase de público, socio o -no. - -Política de creación de colecciones digitales - -Sí. La Biblioteca Virtual se propone como una extensión de la biblioteca -física que promueve el conocimiento de su colección bibliográfica y -audiovisual. Las colecciones digitales tienen énfasis sobre Colombia o -de autores colombianos. Tiene colecciones para préstamo digital en los -campos generales del conocimiento, incluida la música, en donde hay una -oferta más concentrada. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sí. El proyecto Pacífico Colombiano incluye información sobre contenidos -tanto físicos como virtuales del Pacífico Colombiano; Fonoteca incluye -digitalizaciones de documentos analógicos; publicaciones monográficas y -revistas son representaciones digitales de la publicación en papel. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -CMS Drupal para la página web. Plataforma de préstamo de libros de -editoriales McGraw Hill, Bilineata Publishing, Manuvo, Digitalia -Hispánica y Pearson educación. Plataforma de biblioteca virtual: -Contentdm versión 1.0.0 de OCLC. Plataforma de catálogo bibliográfico: -Absys Net. - -Perfil de usuarios - -General. Niños, jóvenes, adultos. - -Acceso a contenidos (¿personal carnetizado o todos?) - -Acceso a los servicios a través del carné de las bibliotecas. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -Conformada por siete secciones (actividad cultural del Banco, áreas -culturales en el país, arte y numismática, bibliotecas, BVirtual, Museo -del Oro y música) en el front superior horizontal, y una taxonomía en -los laterales izquierdos que direccionan en cada sección a información -de interés. Los contenidos centrales son informativos. La sección de -Bibliotecas muestra un menú izquierdo con vínculos a secciones de -contenido de la página: noticias, servicios, colecciones, recursos -electrónicos y clubes de lectura. En la zona central direcciona al -catálogo, la biblioteca virtual y proyectos digitales. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Cuenta con tres tipos de contenidos: colecciones digitales, proyectos -digitales y recursos electrónicos. Están disponibles para consulta -online y préstamo digital con descarga en computadores y otros -dispositivos electrónicos: En la sección Biblioteca virtual se -concentran los contenidos digitales de acceso gratuito en colecciones y -proyectos digitales, así como los recursos electrónicos con consulta -restringida únicamente a socios de la Red. Las colecciones digitales -están conformadas por libros de títulos colombianos, latinoamericanos y -de diversas regiones del mundo tales como publicaciones de libros y -revistas del Banco de la República, Biblioteca Básica de pueblos -indígenas y Biblioteca de literatura Afrocolombiana del Ministerio de -Cultura, Biblioteca Familiar Colombiana, publicaciones del Centro de -Memoria, Paz y Reconciliación, del Centro de Memoria Histórica, Comisión -Colombiana del Océano, Fundación Ética Mundial, Leer el Caribe, Libro al -Viento, Monografías de FIAN, Observatorio de Discriminación Racial y -SENA. Otras colecciones son la Hemeroteca Digital Histórica, tesis y -artículos académicos, galería de imágenes, cartografía histórica y -videos producidos por el Banco de la República. Los proyectos digitales -incluyen exposiciones en línea de carácter cultural y educativo, en su -mayoría sobre Colombia o con temáticas y autores colombianos, la -Fonoteca, así como proyectos web orientados a público escolar: Ayuda de -tareas --- que apoya los procesos de aprendizaje de niños y jóvenes en -edad escolar con información sobre arte, música, literatura, historia, -política, economía y ciencias naturales--- y Biografías, que incluye la -biografía de más de 550 personajes colombianos. Los recursos -electrónicos están conformados por bases de datos por suscripción y -bases de datos de acceso abierto, revistas y libros electrónicos. - -Formatos - -ePub, pdf, jpg, mp3, multimedia. - -Gestión de derechos de autor - -La entidad paga una licencia a las plataformas de préstamo. El acceso a -los contenidos de la Biblioteca Virtual, así como el enlace a otras -páginas, es gratuito, siempre y cuando se realice en un solo ejemplar -para uso privado y sin fines de lucro. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -La plataforma Contentdm centraliza y es el repositorio de los contenidos -digitales de acceso gratuito. El catálogo bibliográfico es -respectivamente para las colecciones analógicas. - -Estrategia de posicionamiento (mercadeo digital) - -Se realiza a través de la página web haciendo relevancia de los -contenidos y la agenda cultural del momento. - -Otros servicios digitales (conocimiento colaborativos, chats virtuales, -aplicaciones, videojuegos, etc\...) - -Catálogo en el celular, tutorial de acceso y uso del catálogo -bibliográfico. - -Contacto - -Natalia Ruiz Rodgers - Biblioteca Luis Ángel Arango: Calle 11 \# 4-14, -teléfono: (571) 3431224 - -Red Nacional de Bibliotecas Públicas - -Url - -[www.bibliotecanacional.gov.co/rnbp/](http://www.bibliotecanacional.gov.co/rnbp/){.azul} - -Tipo de biblioteca - -Red de bibliotecas. Institución pública. - -Descripción del\ -proyecto digital - -Red que articula e integra 1.444 bibliotecas públicas estatales del país -y sus servicios bibliotecarios en orden departamental, distrital, -municipal, rural, territorios indígenas y comunidades afrocolombianas, -bajo la coordinación del Ministerio de Cultura mediante la Biblioteca -Nacional de Colombia. En su versión digital cuenta con un portal web que -incluye dos secciones destinadas a: recursos digitales y al sistema de -información en línea para la red de bibliotecas afiliadas. - -Financiación y aliados (Redes de colaboración) - -Red del orden nacional. Funciona con presupuesto del Ministerio de -Cultura y las administraciones locales coordinan las bibliotecas a nivel -local. Las administraciones municipales y departamentales, adicional a -sus recursos propios, cuentan con fuentes de financiación con -destinación a proyectos culturales como las bibliotecas. Estos son: -Sistema General de participaciones, SGP, recursos de libre inversión, -SGP, Conpes de Primera Infancia, estampilla Procultura Municipal, -recursos del impuesto al consumo a la telefonía móvil. Otras fuentes de -financiación nacionales son: Plan Nacional de Lectura y Escritura, -Programa Nacional de Concertación Cultural, Programa Nacional de -Estímulos, comercialización de bienes y servicios (alquiler de espacios, -reprografía, entre otros), donaciones del sector privado, participación -en convocatorias locales, regionales, nacionales e internacionales, -presentación de proyectos a fundaciones u organismos internacionales, y -apoyo de proyectos de responsabilidad social empresarial. - -Público - -Comunidad en general a nivel nacional. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Los servicios en línea del sistema de información SIISE, incluyen un -formulario único de registro y otro de estadísticas, están restringidos -a las bibliotecas de la Red. Los demás contenidos del portal son de -acceso abierto para el público de la Web. - -Política de creación de colecciones digitales - -Sí. Tiene tres enfoques: colecciones en la Caja Abierta de Herramientas -que contiene recursos enfocados en la administración, lineamientos y -políticas para la gestión en las bibliotecas públicas de la Red; -recursos para la lectura desarrollados por la Biblioteca Nacional; y el -manual de ideas inspiradoras, una micrositio dirigido a la formación de -comunidades rurales entorno a la biblioteca. Cuenta con 29 contenidos, o -ideas innovadoras, con temáticas diferentes. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sólo para algunos contenidos de la caja abierta de herramientas que han -sido elaborados inicialmente en forma analógica. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -CMS Drupal para la página web; sin embargo está en proceso de migración -a la plataforma SharePoint de Microsoft. Catálogo bibliográfico: Koha - -Perfil de usuarios - -Jóvenes, niños y familias. - -Acceso a contenidos (¿personal carnetizado o todos?) - -El acceso a contenidos del catálogo y del sistema SIISE está -condicionado a la vinculación y registro en la Red. Los demás contenidos -son de acceso abierto. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -La página web puede encontrarse a través de la web de la Biblioteca -Nacional de Colombia en donde ocupa una sección en la página de inicio y -desde allí hace enlace al portal individual en el tercer clic de -búsqueda. Está conformada por 7 secciones (Quiénes somos, planes y -proyectos, recursos digitales, SIISE en línea, preguntas frecuentes y -contactos). Esta misma navegación es persistente en la columna izquierda -en todas las secciones, en donde al tiempo despliega los contenidos -específicos de cada sección seleccionada, siendo el cuarto clic de -búsqueda y un quinto para acceder a los recursos digitales. Los accesos -en la sección del Sistema SIISE son del tipo paso a paso. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Informativos y orientativos para la gestión bibliotecaria de la red: a -través de la Caja Abierta de Herramientas y el Sistema SIISE. Recursos -bibliográficos: a través del catálogo que despliega registros -bibliográficos y recursos digitales incorporados en el mismo -relacionados con los libros de la dotación básica que proporciona el -Ministerio de Cultura para las bibliotecas de la Red. Recursos para la -lectura en digital: acceso a algunos contenidos digitales desarrollados -por la Biblioteca Nacional: Gaboteca, Biblioteca Básica de la Cultura -Colombiana, Libros y Cartillas Digitales de la Biblioteca Nacional; y el -aparte de Recomendados digitales organizado a través de etiquetas: -compartir y transferir, crear, escuchar, formarse, informarse, -investigar, leer, usar tabletas, y ver, los cuales incluyen enlaces a -contenidos relacionados; sin embargo algunos de ellos repetidos. -Recursos para la formación: manual de ideas inspiradoras, una micrositio -dirigido a la formación de comunidades rurales en torno a la biblioteca. -Cuenta con 29 contenidos, o ideas innovadoras, con temáticas diferentes. - -Formatos - -ePub, pdf, html, mp3. - -Gestión de derechos de autor - -Los contenidos digitales de la plataforma están en dominio público. -Otros contenidos digitales ofrecidos a la red para la lectura en -tabletas tienen restricción de uso, el cual es limitado a la tableta. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -Los sistemas con que cuenta la Red funcionan cada uno de forma -individual. En la página no existe un sistema que busque y recupere -información. - -Estrategia de posicionamiento (mercadeo digital) - -La principal estrategia de posicionamiento se hace a través de noticias -en la página web y redes de la Biblioteca Nacional. - -Otros servicios digitales (conocimiento colaborativo, chats virtuales, -aplicaciones, videojuegos, etc\...) - -Servicio de la Llave del Saber utilizada por todas las bibliotecas de la -Red. Distribución de tabletas en las bibliotecas de la Red con -contenidos digitales para la lectura. - -Contacto - -Sandra Suescún Barrera, Coordinación Nacional de Servicios -Bibliotecarios -Coordinadora (57-1) 3816464 ext. 3270 - ------------------------------------------------------------------------- - -Biblioteca Departamental del Valle del Cauca - -Url - -[www.labibliotecadigital.com/inicio.html](http://www.labibliotecadigital.com/inicio.html){.azul}\ -[Publicaciones](http://www.bibliovalle.gov.co/publicaciones.php/publicacion/titulo/Buscador-APFFVC){.azul}\ -[Exposiciones -vitruales](http://expovirtuales.bibliovalle.gov.co/){.azul}\ - -Tipo de biblioteca - -Pública Departamental, cabeza de la Red Departamental de Bibliotecas -Públicas del Valle del Cauca. - -Descripción del\ -proyecto digital - -La Biblioteca Departamental del Valle promueve la identidad y diversidad -cultural, conservando y difundiendo el patrimonio del Valle del Cauca- -Es la cabeza de la Red Departamental de Bibliotecas Públicas del Valle -del Cauca. En su versión digital cuenta con una página web institucional -que muestra tres iniciativas digitales: Biblioteca Digital, una -herramienta que hace enlace a otros recursos digitales de diferente -orden y para todos los públicos. El repositorio del Archivo Fotográfico -del Valle del Cauca, y la aplicación sobre exposiciones virtuales con -temáticas del Valle del Cauca que usa los contenidos originales del -Archivo Fotográfico. - -Financiación y aliados (Redes de colaboración) - -Del Archivo fotográfico: Universidad ICESI\ -De la herramienta Biblioteca Digital: Fundación Carvajal y Alcaldía de -Cali.\ -De las exposiciones virtuales: Universidad Autónoma de Occidente, -Gobernación del Valle y MinCultura. - -Público - -General - -Plataforma y contenidos - -Nombre del producto digital - -Tipo de contenido - -Tipo de acceso - -Gestión de derechos - -Integrado a otros servicios - -Plataforma - -Relevancia del contenido - -Contacto - -Archivo del Patrimonio Fotográfico y Fílmico del Valle del Cauca - -Fotografías históricas y contemporáneas del Valle del Cauca. - -Abierto a través de la página de la Biblioteca Departamental. - -Biblioteca Departamental Calle 18 No. 122-135, Cali-Colombia Teléfono: -+57 (2) 555 2334 \| Fax: +57 (2) 555 1441 - -No - -Dspace - -Sí. Para integrar a un repositorio local o nacional. - -Lisney Guayara - Calle 5 No. 24A - 91 Teléfono: 6200400 - -Biblioteca Digital - -Enlace 7.500.000 páginas a través de 9 temáticas. - -Abierto a través de la página de la Biblioteca Departamental. - -Fundación Carvajal - -No - -Desarrollo propio de la Fundación Carvajal - -No - -Exposiciones virtuales - -4 exposiciones virtuales sobre temas de Cali que usan documentos del -Archivo del Patrimonio Fotográfico y Fílmico del Valle. - -Abierto a través de la página de la Biblioteca Departamental. - -Universidad Autónoma de Occidente - -No - -Drupal - -Sí. Para integrar a un repositorio local o nacional. - ------------------------------------------------------------------------- - -Red de Bibliotecas públicas de Cali - -Url - -[http://www.cali.gov.co](%20http://www.cali.gov.co/cultura/publicaciones/110128/red_de_bibliotecas_publicas_de_cali_landing/){.azul}\ -[Archivo fotográfico de -Cali](http://www.archivofotograficoymemoriahistorica.org/home_archivofotografico/){.azul}\ -[Experiencias de Leer es una -nota](http://www.cali.gov.co/cultura/publicaciones/108473/programa_leer_es_una_nota/){.azul} - -Tipo de biblioteca - -Pública Municipal. Cabeza de la Red Municipal de Bibliotecas de Cali - -Descripción del\ -proyecto digital - -La Red de Bibliotecas Públicas de Cali, la Casa de las Ideas, es un -programa de la Secretaría de Cultura y Turismo del municipio conformada -por 62 espacios, en su mayoría ubicados en sectores de prioridad social: -5 bibliotecas temáticas, 49 bibliotecas locales, 4 centrales didácticas -y 5 centros culturales, entre los que está el Centro Cultural de Cali. - -Financiación y aliados (Redes de colaboración) - -Alcaldía de Cali -- Secretaría de Cultura y Turismo de Cali -- Fundación -Carvajal. - -Público - -General - -Plataforma y contenidos - -Nombre del producto digital - -Tipo de contenido - -Tipo de acceso - -Gestión de derechos - -Integrado a otros servicios - -Plataforma - -Relevancia del contenido - -contacto - -Archivo Fotográfico de Cali -- imagen y memoria local - -Fotografías de álbumes familiares y personales; con la participación de -líderes juveniles de los sectores de prioridad social y la comunidad -misma. - -Abierto - -Red Municipal de Bibliotecas y Alcaldía de Cali - -No. Reposa en la página web institucional. - -Sí. Para integrar a un repositorio local o nacional. - -Luz Adriana Betancourt Lorza Dirección: Carrera 5 \# 6-05 -Teléfono:(57+2) 8961965 - -Leer es una nota - -Experiencias del programa de lectura. - -Canal You Tube - -Red Municipal de Bibliotecas y Alcaldía de Cali - -No. Reposa en la página web institucional - -Exposiciones virtuales - -4 exposiciones virtuales sobre temas de Cali que usan documentos del -Archivo del Patrimonio Fotográfico y Fílmico del Valle. - -Abierto a través de la página de la Biblioteca Departamental. - -Universidad Autónoma de Occidente - -No - -Drupal - -Sí. Para integrar a un repositorio local o nacional. - ------------------------------------------------------------------------- - -Corporación Cultural Biblioteca Departamental Norte de Santander - -Url - -[http://www.bibliocucuta.org/](%20http://www.cali.gov.co/cultura/publicaciones/110128/red_de_bibliotecas_publicas_de_cali_landing/){.azul}\ -[Archivo Fotográfico Norte de Santander y ciudad de -Cúcuta](http://www.archivofotograficoymemoriahistorica.org/home_archivofotografico/){.azul}\ -[Red Departamental](https://www.facebook.com/RedBiblioNorte){.azul} - -Tipo de biblioteca - -Pública Departamental. Cabeza de la Red Departamental de Bibliotecas de -Norte de Santander. - -Descripción del\ -proyecto digital - -La Biblioteca Departamental de Norte de Santander Julio Pérez Ferrero es -un centro cultural, social y educativo al servicio de la comunidad -nortesantandereana y fronteriza. Protagonista activa en la construcción -de la identidad a través de la conservación del patrimonio -arquitectónico, bibliográfico, hemerográfico, documental y fotográfico -de la región. Cuenta con una oferta de servicios bibliográficos, -alquiler de espacios y servicios en línea a través del Repositorio Norte -de Santander que tiene como objetivo facilitar y mejorar la visibilidad -y preservación del contenido fotográfico Histórico del departamento. - -Financiación y aliados (Redes de colaboración) - -Recursos propios, Gobernación de Norte de Santander, MinCultura, -Secretaría de Cultura de Cúcuta, Comfanorte, Secretaría de Despacho Área -Cultural y Turismo de Cúcuta - -Público - -General - -Plataforma y contenidos - - ----------------------------------------------------------- ------------------------------------------------------------------------------------------- ---------------------- ----------------------------------------------- -------------------------------------------- ------------------------ ------------------------------------------------------ ----------------------------------------------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - Archivo Fotográfico Norte de Santander y ciudad de Cúcuta Colección de fondos fotográficos seleccionados por temas, regiones, lugares y escritores. Abierto Biblioteca Departamental No. Reposa en la página web institucional. Dspace. Código abierto Sí. Para integrar a un repositorio local o nacional. Alix Xenaida Pérez\ - Teléfono: 3124778166\ - Correo electrónico:\ - adminrepositorio@bibliocucuta - - Página Facebook de la Red Departamental @RedBiblionorte Promoción e información de actividades de la Red.C Abierto - invitación Política de contenidos y derechos de Facebook No Facebook No Avenida 1 No 12-35 Barrio la Playa -- CUCUTA\ - 5723186\ - soportecnico@bibliocucuta.org\ - ----------------------------------------------------------- ------------------------------------------------------------------------------------------- ---------------------- ----------------------------------------------- -------------------------------------------- ------------------------ ------------------------------------------------------ ----------------------------------------------- - ------------------------------------------------------------------------- - -Biblioteca Departamental del Meta "Eduardo Carranza" - -Url - -[http://www.bibliotecaeduardocarranza.gov.co/](%20http://www.bibliotecaeduardocarranza.gov.co/){.azul}\ -[Biblioteca -Digital](http://www.bibliotecaeduardocarranza.gov.co/#){.azul}\ -[Red Departamental](https://www.facebook.com/RedBiblioNorte){.azul} - -Tipo de biblioteca - -Pública Departamental. Cabeza de la Red Departamental de Bibliotecas del -Meta. - -Descripción del\ -proyecto digital - -La Biblioteca Digital es una de las secciones de la página web de la -Biblioteca Departamental. Tiene contenidos en diferentes formatos, -libros, fotografía y audiovisuales relacionados con temáticas sociales, -culturales y educativas representados por los municipios del -departamento. Rescata la producción de autores llaneros. La plataforma -hipervincula los contenidos con las bibliotecas que los ha producido o -temáticamente se relacionan. Se encuentra aún en construcción. - -Financiación y aliados (Redes de colaboración) - -Gobernación del Meta, Ministerio de Cultura. - -Público - -General - -Plataforma y contenidos - - ----------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------- ----------------------------------- ----------------------------- ---------------------- --------------------------------------------------------------------------------- ---------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido Contacto - Libros patrimoniales: 63 libros con su ficha de inventario de bien cultural mueble y descarga. Acceso a libros y fotografías relacionados con los municipios del Departamento, enlazados a las bibliotecas municipales de la Red. Abierto Biblioteca Departamental del Meta No JavaScript, XML- php Sí. Para integrar a un repositorio local o nacional. Requiere aún construcción. - ----------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------- ----------------------------------- ----------------------------- ---------------------- --------------------------------------------------------------------------------- ---------- - ------------------------------------------------------------------------- - -Biblioteca Digital Héctor Rojas Herazo especializada en el Caribe -Colombiano. Universidad del Norte de Barranquilla - -Url - -\ -[http://guayacan.uninorte.edu.co/](http://guayacan.uninorte.edu.co/biblioteca_digital/index.asp){.azul} - -Tipo de biblioteca - -Desarrollo institucional de la Universidad del Norte de Barranquilla. - -Descripción del\ -proyecto digital - -La Biblioteca Digital Héctor Rojas Herazo tiene como objetivo potenciar -la expansión de la cultura del Caribe colombiano a través de la -utilización y aplicación de los medios tecnológicos a obras relevantes -de carácter científico, social y humanístico representados en materiales -digitalizados de diferentes tipos (libros y documentos existentes -impresos, en forma digital, audiovisuales y otros). - -Financiación y aliados (Redes de colaboración) - -Universidad del Norte. - -Público - -General - -Plataforma y contenidos - - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------- ---------------------------------------- -------------------------------------------- ------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------- - Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - Memoria visual del caribe colombiano. Revistas digitales de la Universidad. Museo Virtual de Estética. Catálogo de realizadores audiovisuales de la costa caribe Abierto, Lectura en plataforma -repositorio institucional- y descarga de contenidos. Biblioteca Digital Héctor Rojas Herazo Los metadatos al repositorio institucional Repositorio Dspace y plataforma de la página web Microsoft Sí. Está recogiendo documentos patrimoniales y actuales bajo licencia de derechos de autor a cargo de la biblioteca sobre la memoria local del caribe. Marlem Uribe Marenco\ - Coordinadora\ - Colecciones Digitales\ - Biblioteca Karl C. Parrish\ - Teléfono: 3509224 extensión 4405\ - Correo electrónico: mauribe@uninorte.edu.co - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------- ---------------------------------------- -------------------------------------------- ------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------- - ------------------------------------------------------------------------- - -El libro total: la biblioteca digital de América - -Url - -[http://www.reddebibliotecas.org.co](http://www.reddebibliotecas.org.co/sala-lectura/el-libro-total){.azul}\ -[Institución](http://www.ellibrototal.com/ltotal/newltotal/){.azul} - -Tipo de biblioteca - -Particular, para lectura online. - -Descripción del\ -proyecto digital - -Conformada por diferentes colecciones de libros y audiolibros gratuitos -para lectura online sin permitir descarga: colección de clásicos, -literatura infantil, selección de obras hispanoamericanas (Argentina, -Chile, Colombia, Cuba, Ecuador, España, México, Perú, Uruguay, -Venezuela) y de otros países. - -Financiación y aliados (Redes de colaboración) - -Fundación El Libro Total. - -Público - -General - -Plataforma y contenidos - - ------------------------------------------------- ------------------------------------------------------------------------------------------------------- ---------------------- ----------------------- ----------------------------- -------------------------------------- -------------------------- ------------------------------------------------------------------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - El Libro Total la biblioteca digital de América Libros y audiolibros de clásicos de literatura, obras infantiles y selección obras hispanoamericanas. Consulta sólo online Fundación Libro Total No Propietaria de Fundación Libro Total Sí Calle 35 No 9-81, Casa del Libro Total, Bucaramanga - Santander.\ - contactenos@syc.com.co;\ - Teléfono: (7) 6343558. - ------------------------------------------------- ------------------------------------------------------------------------------------------------------- ---------------------- ----------------------- ----------------------------- -------------------------------------- -------------------------- ------------------------------------------------------------------- - ------------------------------------------------------------------------- - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Buenas prácticas para tener en cuenta en Bogotá {#buenas-prácticas-para-tener-en-cuenta-en-bogotá .azul .semibold .centrar .mayusculas .interlineado1} - -A la luz del ejercicio de comparación realizado, se puede decir sobre -BibloRed lo siguiente: - -- La BibloRed no es la Biblioteca Digital de Bogotá. -- La BibloRed se está estructurando para tener contenidos digitales y - servicios de préstamo digital. Es un trabajo en construcción y aún - no tiene mediciones de resultados. -- Los recursos y contenidos digitales producidos por algunos miembros - de la Red que incluyen la comunidad, no hacen parte de la oferta de - contenidos a mediano y largo plazo para la totalidad de la Red. - Éstos están claramente expuestos a pérdida en la medida que no - existe una estrategia de preservación definida y su circulación es - limitada. -- Los responsables en BibloRed coinciden en que el proyecto de una - Biblioteca Digital para Bogotá es de más largo aliento. Incluye a la - comunidad en sus intereses y producción de contenidos, y la oferta - de información es pertinente a Bogotá, en especial lo relacionado - con contenidos patrimoniales. -- Sobre la cooperación, BibloRed coopera en sí misma, pero no lo hace - con otras bibliotecas de la ciudad. -- La infraestructura tecnológica de BibloRed (área de sistemas) - trabaja con servicios tercerizados y su planta de personal es baja. -- No existen gestores digitales en la planta de personal, lo que - impacta en el seguimiento de la estrategia digital ya iniciada y en - la potencialización de los servicios, su planeación y futuro. - -BibloRed podría mejorar su capacidad revisando las siguientes prácticas -basadas esencialmente en la cooperación e integración. Por tanto, se -sugiere: - -- Ampliar la articulación de la Red para otras bibliotecas de la - ciudad con propósitos afines, es el caso de las bibliotecas de cajas - de compensación, bibliotecas escolares, Biblioteca Nacional, - Biblioteca Luis Ángel Arango, Archivo Distrital, centros de - documentación, bibliotecas digitales y bases de datos de y en la - ciudad . -- Aumentar la capacidad de bases de datos de acceso abierto como lo - hace la Red del Banco de la República. -- Capitalizar los contenidos desarrollados por la comunidad y en - especial generar una política de almacenamiento, seguridad y - preservación digital. -- Desarrollar contenidos locales a partir de las colecciones sobre la - ciudad, las experiencias de promoción de lectura y demás actividades - que involucren a la comunidad. -- Desarrollar estrategias o herramientas de formación en una - experiencia similar a la Red de Bibliotecas-EPM, MOOCs-cursos en - línea. -- Ampliar la estrategia de circulación y difusión de contenidos - digitales utilizando algunos espacios de la infraestructura de la - ciudad, tales como estaciones de transporte o centros de - información, entre otros. -- Incluir o destacar páginas de medios de comunicación (radio y - televisión) de la ciudad. -- Integrar en una sola interfaz de búsqueda los diferentes contenidos - que se presentan a través de la página web. -::: -::: - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Recomendaciones en la infraestructura tecnológica {#recomendaciones-en-la-infraestructura-tecnológica .azul .semibold .centrar .mayusculas .interlineado1} - -BibloRed ya ha iniciado una línea de infraestructura para la -organización de sus contenidos digitales. La primera indicación al -respecto es concluir el segundo año de implementación y hacer un estudio -de la pertinencia y uso, analizando estadísticas de uso de contenidos y -en especial, el análisis de la plataforma de préstamo como integrador. - -Dado que las sugerencias en el ítem anterior se enfocan en ampliar los -colaboradores en el plano digital de la red, se requerirá un trabajo -orientado a mejorar la integración de la información a través del CMS de -la página web y las plataformas que utiliza. - -Diferentes acciones pueden abordarse: - -- En términos del sistema de administración de contenidos --CMS- de - forma tal que se realicen cosechas globales o incrementales por - protocolo OAI. Como ejemplo, se puede consultar la nueva interfaz de - la Biblioteca Nacional de Chile que opera con un CMS propietario de - la empresa chilena Newtemberg, o el uso de SOLR, un motor de - búsqueda de código abierto basado en la biblioteca Java del proyecto - Lucene, con APIs en XML/HTTP y JSON, y el CMS Drupal como por - ejemplo: Islandora (http://islandora.ca/) que es una solución madura - Fedora + Solr + repositorio Drupal, utilizada en instituciones como - la Biblioteca Nacional de España. -- Mejorar los servicios de integración de recursos a través de las - búsquedas federadas, las cuales permiten, al lanzar una consulta - simultánea a los diferentes recursos de información, obtener un - acceso integrado a los recursos. Supone algo más que una simple - búsqueda cruzada. Comienza identificando el recurso y termina con la - disponibilidad de la información: tan fácil como Google pero mejor. - Al respecto se sugiere consultar el metabuscador de ExLibris, - teniendo en cuenta que es el proveedor de los servicios del catálogo - bibliográfico. Adicionalmente, otra herramienta para servidor de - enlaces que también puede revisarse a través del producto es SFX de - ExLibris. - -Por otra parte, un aspecto en el que BibloRed debe hacer especial -énfasis es en el equipo de gestión de contenidos digitales, actualmente -inexistente. Este equipo deberá tener las competencias para trabajar de -forma interdisciplinar de forma tal que pueda desarrollar actividades -como: - -- Producción, diseño y edición de contenidos y productos digitales -- Selección y evaluación de contenidos y productos digitales -- Construcción de taxonomías de contenidos -- Injerencia en las decisiones tecnológicas -- Un equipo así requerirá como mínimo un editor digital, diseñador web - digital, programador con experiencia en contenidos para web y - referencistas virtuales. - - - -# Bibliotecas Digitales Internacionales: ¿Qué están haciendo y cómo se están pensando? - - -# BIBLIOTECAS DIGITALES INTERNACIONALES: ¿Qué están haciendo y cómo se están pensando? {#bibliotecas-digitales-internacionales-qué-están-haciendo-y-cómo-se-están-pensando .tituloi .mayusculas} - -Por: María Alejandra Pautassi -::: - -::: {.flex} -::: {.ancho1 .descripcion .ajuste .flexv .flexceh} -El objetivo del 'benchmarking' internacional es conocer el estado del -arte y distintos modelos de biblioteca digital implementados por algunos -sistemas de bibliotecas públicas en el mundo, cuyos objetivos y -particularidades son similares o se pueden relacionar con los de -BibloRed. Para esto se tuvieron en cuenta las características de -Biblioteca Digital de Bogotá establecidas en el capítulo ["¿Una -biblioteca digital de Bogotá? Definiciones y -aproximaciones"](aproxdef.html){.azul}: un lugar de memoria, de -encuentro para la creación, de articulación y entre territorio, -conocimiento y experiencia lectora, de exploración de diversas -modalidades de leer, de acceso y repositorios, que fomenta la -deliberación y el aprendizaje colaborativo. - -Sin embargo, y a pesar de que estas instituciones se han dedicado cada -vez más a digitalizar sus colecciones y darles acceso en línea, no hay -un método estándar para evaluar las bibliotecas digitales. Por lo tanto, -partimos de la definición de biblioteca digital que aparece en el -"Manifiesto de las IFLA/Unesco sobre las bibliotecas digitales": - -"Una biblioteca digital es una colección en línea de objetos digitales -de buena calidad, creados o recopilados y administrados de conformidad -con principios aceptados en el plano internacional para la creación de -colecciones, y que se ponen a disposición de manera coherente y -perdurable y con el respaldo de los servicios necesarios para que los -usuarios puedan encontrar y utilizar esos recursos\... - -La misión de las bibliotecas digitales consiste en proporcionar acceso -directo a recursos informativos, digitales y no digitales, de manera -estructurada y fiable, para de esa manera vincular la tecnología de la -información, la educación y la cultura en las bibliotecas actuales...". -Tomado del [Manifiesto de las IFLA/Unesco sobre las bibliotecas -digitales](http://www.ifla.org/ES/publications/manifiesto-de-las-ifla-unesco-sobre-las-bibliotecas-digitales.){.azul -.semibold} - -Nos guiamos, además, por la definición de DELOS.org: "Su principal -función \[la de una biblioteca digital\] pasó del almacenamiento -estático y la recuperación de información a propiciar la comunicación, -la colaboración y otras formas de interacción entre científicos, -investigadores o el público en general en temas que son pertinentes a la -información almacenada en la biblioteca digital". - -Tuvimos en cuenta sistemas de bibliotecas públicas con experiencias -enmarcadas en un ámbito local, que se entendieran como parte de un -territorio y como constructoras de identidades, bien fuera de ciudades o -países, que hubieran implementado una biblioteca digital (o incursionado -en la creación y diseminación de colecciones y servicios digitales), que -hubieran desarrollado una política de creación de colecciones digitales -con materiales de diverso tipo y/o hubieran desarrollado una estrategia -de producción de contenidos que involucre a la comunidad o de -recuperación de contenidos locales. - -Es de notar que el término 'biblioteca digital' es usado de distintas -maneras por las instituciones analizadas. En la Biblioteca Pública de -Nueva York, por ejemplo, se hablaba hasta 2008 de 'Programa de -Biblioteca Digital' para referirse a distintos procesos que se llevaban -a cabo dentro de la biblioteca: digitalización, creación de metadatos y -curaduría de colecciones y exposiciones virtuales. Para las bibliotecas -públicas de la Región Flamenca de Bélgica se trata de un sistema central -de bibliotecas interoperables (catálogos, servicios, colecciones -digitales, etc.). El Sistema de Bibliotecas Públicas de Chile bautizó -'Biblioteca Pública Digital' a su plataforma de préstamo de libros -digitales, aunque tiene además colecciones digitales de documentos -patrimoniales y un Archivo Colaborativo de Contenidos Locales digitales. -La Biblioteca Pública Digital de América es la única en la que el -término describe tanto sus servicios como su plataforma ---quizá porque -de todas, es la única que desde sus inicios fue pensada para un ámbito -puramente digital---. Todas estas instituciones, sin embargo, cuentan -con uno o varios espacios digitales con contenidos y servicios que -surgen de las necesidades específicas de sus usuarios, ciudadanos o -público objetivo. -::: - -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\. Digital Public Library of America (DPLA): la biblioteca como -agregadora de contenidos - -2\. Biblioteca Pública de Nueva York (NYPL Labs): la biblioteca como -laboratorio de innovación - -3\. Sistema de Bibliotecas Públicas de Flandes: la biblioteca en red -(visión regional y participación local) - -4\. Sistema de Bibliotecas Públicas de Chile: la biblioteca como -productora de contenidos, un espacio para la memoria - -5\. Algunas conclusiones -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Digital Public Library of America (DPLA): la biblioteca como agregadora de contenidos {#digital-public-library-of-america-dpla-la-biblioteca-como-agregadora-de-contenidos .azul .semibold .centrar .mayusculas .interlineado1} - -La Biblioteca Pública Digital de América (DPLA, por sus siglas en -inglés) es el resultado de un proceso de planeación que comenzó en -octubre de 2010, cuando un grupo de 40 líderes de bibliotecas, -fundaciones, académicos y expertos en tecnología de Estados Unidos -acordaron trabajar juntos para crear "una red abierta de recursos en -línea que alberga el patrimonio vivo de la nación custodiado por -universidades, bibliotecas, archivos y museos, con el fin de educar, -informar y capacitar a todos los miembros de las generaciones actuales y -futuras". Para ellos, las colecciones digitales que hasta entonces -existían en silos debían existir en un solo lugar con el fin de -facilitar el libre acceso al patrimonio cultural digitalizado -estadounidense de manera coherente. Dos meses después, el Berkman Center -for Internet and Society de la Universidad de Harvard, con recursos de -la Fundación Alfred P. Sloan, convocó a un grupo interdisciplinario de -expertos (bibliotecarios y curadores, humanistas digitales y -programadores) para darle un alcance, diseñar y construir el ambicioso -proyecto. - -El portal de descubrimiento y la plataforma de búsqueda de la DPLA fue -lanzada en abril de 2013. En ese momento contaba con 2.4 millones de -objetos digitales del patrimonio cultural estadounidense, provenientes -de 500 instituciones (bibliotecas, museos, archivos, centros -culturales). Un año después, en abril de 2014, la DPLA ya contenía más -de 7 millones de objetos digitales, provenientes de 1,200 instituciones ----un logro en términos de colaboración interinstitucional pocas veces -visto en el ámbito de las bibliotecas---. Estas instituciones incluyen -tanto pequeñas sociedades históricas locales y bibliotecas públicas -rurales hasta algunos de los museos, archivos y bibliotecas de -investigación más grandes de los Estados Unidos. - -Financiada con dineros públicos y privados, los valores que guían el -trabajo de la DPLA son: - -- Darle la [mayor apertura al patrimonio compartido de los - estadounidenses]{.semibold} (datos, contenidos y colecciones). -- Promover [un fuerte espíritu público, que se basa en la acción - colectiva y la colaboración]{.semibold} de diversas instituciones e - individuos. -- Brindar [acceso libre, gratuito y democrático]{.semibold} por el que - son conocidas las bibliotecas públicas. - -Por otro lado, uno de los principios que ha guiado su estructura -organizacional ha sido el trabajo interdisciplinario y que todos sus -miembros trabajen hacia unos objetivos comunes: "La mayoría de nuestras -actividades requieren necesariamente el trabajo colaborativo de -programadores, expertos en contenido y divulgación". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -### DPLA {#dpla .cafe .extrabold} - -[](http://www.dp.la){.cafe .bloque .margen3} - -*www.dp.la* - -Más de 7 millones de objetos digitales, provenientes de 1,200 -instituciones, desde pequeñas sociedades históricas locales y -bibliotecas públicas rurales hasta algunos de los museos, archivos y -bibliotecas de investigación más grandes de los Estados Unidos. -::: -::: -::: - -::: {.blancof} -![pantalla](images/inter1.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -### Los centros de servicio y contenidos {#los-centros-de-servicio-y-contenidos .azul .semibold .centrar .mayusculas} - -Una de las características fundamentales del funcionamiento de la DPLA -es que está conformada por una de red de más de 40 centros (bibliotecas, -archivos, museos u otras instituciones culturales) a nivel regional o -estatal. Estas instituciones han digitalizado sus colecciones, cumplen -con los estándares de metadatos establecidos por la DPLA y pueden -cosechar los datos de otras instituciones. Para este fin, la DPLA creó -su propia estructura de metadatos (Metadata Application Profile). Este -esquema se diseñó para aprovechar la experiencia del Modelo de Datos -Europeana (EDM, por sus siglas en inglés) y para cruzar con otros -estándares internacionales de metadatos: Dublin Core, ORE y una variedad -de vocabularios controlados y tesauros. También está disponible una -versión preliminar del esquema RDF. En este sentido, los centros son -"agregadores de metadatos", pues los archivos digitales permanecen en el -servidor de la institución madre, aunque estén asociados al catálogo de -la DPLA. -::: - -::: {.blancof} -![pantalla](images/inter2.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -Estos centros se dividen en dos tipos: - -[Centros de contenido (17 en total):]{.semibold} Son grandes -bibliotecas, museos, archivos, entre otros tipo de repositorios -digitales que se relacionan directamente con la DPLA. Por regla general, -estos centros deben estar en la capacidad de aportarle a la DPLA al -menos 200.000 registros de objetos digitales y están obligados a -construir y administrar esos registros, según las políticas de metadatos -establecida por la DPLA. - -[Centros de servicio (20 en total):]{.semibold} Los centros de servicio -son instituciones que albergan y agregan objetos digitales de pequeñas -bibliotecas, museos y otras instituciones culturales de una región o -estado. Estos centros se encargan de recuperar contenidos que describen -la historia e identidad local de su región. Ofrecen servicios de -digitalización, asesorías en la creación de metadatos, y almacenamiento -y preservación digital a las instituciones que cobijan. - -### DPLA apps {#dpla-apps .azul .semibold .centrar .mayusculas} - -Además de ser un portal de contenido para estudiantes, profesores, -investigadores y el público general, DPLA también permite transformar y -darle nuevos usos a los documentos de sus colecciones. Una interfaz de -programación de aplicaciones (API) de datos abiertos (todas sus bases de -datos se pueden descargar sin restricciones), les permite a -desarrolladores, investigadores y bibliotecarios utilizar los contenidos -de la biblioteca para construir nuevos entornos de aprendizaje, -herramientas de descubrimiento y aplicaciones. El código sobre el cual -está construida la plataforma de la biblioteca está disponible en -GitHub. La participación de desarrolladores independientes ha sido -promovida a través de eventos de programación que se llevan a cabo en -distintas bibliotecas, 'newsletters', foros de programadores, -hackatones, formatos para compartir ideas y talleres. - -La biblioteca de 'apps' en este momento contiene 34 aplicaciones -desarrolladas por laboratorios de universidades estadounidenses o -europeas, pequeñas y medianas empresas, colectivos y desarrolladores -independientes. Entre los proyectos destacan las visualizaciones de -datos, los videojuegos, los buscadores y los Twitterbots. - -### Otros servicios: OpenEbook {#otros-servicios-openebook .azul .semibold .centrar .mayusculas} - -En tanto agregadora de contenidos de algunas de las bibliotecas y -archivos digitales más prestigiosos de Estados Unidos, la DPLA se ha -hecho a una rica colección de libros digitales (más de 2 millones de -libros en formato PDF e EPUB). Sin embargo, uno de sus principales -aportes para el acceso de los libros digitales en Estados Unidos es el -programa OpenEbook. Fruto de una alianza con la Biblioteca Pública de -Nueva York y la organización sin ánimo de lucro First Book, se trata de -una aplicación con libros de diversos tipos (lanzamientos recientes, -títulos premiados y populares, educativos, de ficción y no-ficción) que -puede ser utilizada de manera gratuita por niños de bajos recursos a -través de la escuela o las bibliotecas. Su objetivo es fomentar el gusto -por la lectura. -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Biblioteca Pública de Nueva York (NYPL Labs): la biblioteca como laboratorio de innovación {#biblioteca-pública-de-nueva-york-nypl-labs-la-biblioteca-como-laboratorio-de-innovación .azul .semibold .centrar .mayusculas .interlineado1} - -La Biblioteca Pública de Nueva York tiene una doble misión. Por una -parte, conforma una de la redes de bibliotecas públicas más grandes en -el mundo (con 88 sedes en tres de los cinco distritos de Nueva York, -atiende a más de 17 millones de usuarios al año). Y, por otra, es una -biblioteca patrimonial que, con cuatro centros de investigación, no -tiene nada que envidiarle a las grandes bibliotecas nacionales del -mundo. Las colecciones de investigación y circulación suman más de 51 -millones de ítems, incluyendo libros digitales y materiales para -personas con discapacidad visual. NYPL Labs, el laboratorio digital de -la biblioteca, ha jugado en los últimos cinco años un papel fundamental -para la difusión de sus colecciones, al igual que para el uso y -apropiación de las mismas. - -Un área independiente de la Biblioteca desde 2011, NYPL Labs es la -sucesora del Programa de Biblioteca Digital (Digital Library Program) -que entre 2000 y 2008 se encargó de digitalizar, producir metadatos y -curar exposiciones digitales, y cuyo legado es la Galería Digital de la -Biblioteca Pública de Nueva York (que contiene más de 800.000 de objetos -digitales). Desde un inicio, su enfoque fue el de experimentar (aunque -con un acceso mínimo a la infraestructura digital de la biblioteca y sin -injerencia en la digitalización de nuevas colecciones) y se centró en -traducir la misión pública de la biblioteca al entorno digital, -aprovechando sus colecciones digitales. La unidad de trabajo fue -concebida como una productora 'in-house' de proyectos curatoriales -colaborativos y su trabajo pensado de manera transdisciplinar, buscando -que "los curadores empezaran a pensar como diseñadores y programadores, -y viceversa". -::: - -::: {.blancof} -![pantalla](images/inter3.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -Para 2016 NYPL Labs, que en sus inicios estaba compuesto por cuatro -personas, contaba con un equipo de treinta personas y centralizaba las -principales operaciones de una biblioteca digital (15 se ocupaban de la -digitalización, 5 de la creación metadatos, 3 de nuevos desarrollos y -visualización de producto, 2 de permisos y reproducciones, 4 -exclusivamente del proyecto de préstamos de libros digitales y una -dedicada a trabajar con la comunidad). Por otro lado, sus proyectos son -transversales a distintas áreas de la biblioteca: en ellos se trabaja de -la mano con los curadores de las 26 áreas de investigación, los -catalogadores, un abogado especializado en derechos de autor y el equipo -encargado de la página web y las comunicaciones. En palabras de su -director durante 5 años, Ben Vershbow, "la digitalización ahora es -pensada como un principio y no un fin en sí mismo, el comienzo de un -proceso de transformación e interacción por parte de los usuarios que -termina en nuevas colecciones y series de datos nacidos en un entorno -digital". - -### Curaduría colaborativa y datos abiertos {#curaduría-colaborativa-y-datos-abiertos .azul .semibold .centrar .mayusculas .interlineado1} - -Unas de las primeras necesidades de las que se ocupó [NYPL -Labs]{.semibold} fue propiciar el descubrimiento, uso y apropiación de -los miles de objetos que componían la Galería Digital de la biblioteca. -Partiendo de la pregunta ¿qué pasa luego de que digitalizamos un -documento y lo ponemos al acceso del público? y convencidos de que los -metadatos convencionales no terminaban de describir mapas, fotografías y -manuscritos, entre otro tipo de materiales, el equipo se propuso -desarrollar herramientas que permitieran la descripción, corrección y -transcripción colaborativa de millones de objetos. De esta manera, -varios cientos de usuarios podrían asumir una carga de trabajo que a los -catalogadores de la biblioteca les llevaría décadas terminar (la -biblioteca alberga colecciones que llegan a 100.000 ítems), mientras -conocían, modificaban y reutilizaban sus colecciones. - -El primero de estos proyectos fue el Mapwarper, una herramienta en -código abierto que permite georectificar las imágenes de los mapas -históricos de Nueva York en las colecciones de la Biblioteca. Con ella, -los usuarios pudieron empezar a agregarle a los mapas datos (nombres de -calles, puntos de referencia y locaciones patrimoniales)que no eran -inmediatamente reconocibles en su versión digitalizada, facilitando su -búsqueda en el catálogo. La página web, que fue lanzada en 2012, sigue -recibiendo visitas y tiene una activa comunidad de usuarios. Por su -parte, la herramienta ha sido implementada desde entonces en diversas -bibliotecas y archivos del mundo, entre ellos Wikipedia y la Biblioteca -del Congreso. - -A este le siguieron Building Inspector que se vale de Mapwarper para -identificar datos sobre los edificios de Nueva York (direcciones, -materiales con los que fueron construidos, colores, etc.) y los vincula -con otros documentos de la biblioteca (recortes de prensa, fotografías, -directorios telefónicos); What's on the Menu, que con una herramienta de -transcripción colaborativa extrae los textos de una colección de menús -históricos que la biblioteca ha digitalizado, lo que permite rastrear la -evolución de las tradiciones gastronómicas de la ciudad (al día de hoy -hay más de un millón de platos transcritos de 17.545 menús); y -Stereogranimator, una herramienta que permite transformar imágenes -estereográficas históricas en las colecciones de la biblioteca y otras -organizaciones a formatos web 3D. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -Colecciones digitales con cerca de un millón de ítems digitalizados, -muchos de ellos de uso libre y sin restricciones: - - -Portal institucional de la Biblioteca Pública de Nueva York que sirve -para informar de eventos, noticias, servicios: - -Catálogo unificado de colecciones digitales: - - -Proyectos más destacados de los laboratorios de innovación: - - -[http://stereo.nypl.org/](http://menus.nypl.org/){.gris} -::: -::: -::: - -::: {.negrof} -![](images/inter4.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -### Library Simplified (software de código abierto para préstamo de libros digitales y app) {#library-simplified-software-de-código-abierto-para-préstamo-de-libros-digitales-y-app .azul .semibold .centrar .mayusculas .interlineado1} - -Hace tres años, el Equipo de NYPL Labs empezó a trabajar en un -desarrollo propio para el préstamo de libros digitales, con apoyo -financiero de la agencia federal estadounidense Institute of Museum & -Library Services. La Biblioteca, que es el mayor comprador de libros -digitales en Estados Unidos y que desde 2010 cuenta con el servicio de -préstamo digital a través del distribuidor OverDrive, se había dado -cuenta de que, pese a las grandes inversiones, pocos usuarios estaban -usando el servicio. Según el programador de NYPL Labs Leonard -Richardson, los usuarios debían realizar 13 pasos para tomar en préstamo -un libro, además de descargar tres aplicaciones distintas para leerlo. -Por otro lado, que las plataformas comerciales de distribución no -incluyeran algunas funcionalidades, ni estándares de accesibilidad y -usabilidad, iba en detrimento de la misión pública de la biblioteca. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -Desde el lanzamiento oficial del app Library Simplified, el préstamo de -libros digitales por parte de la Biblioteca Pública de Nueva York ha -aumentado en 25% (para algunos de los catálogos la cifra llega al 40%). -La comunidad de desarrolladores asciende a 43 y el equipo que se encarga -del proyecto dentro la biblioteca cuenta con siete empleados de tiempo -completo. -::: -::: -::: - -::: {.blancof} -![](images/inter5.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -La aplicación Library Simplified fue lanzada en versión beta en -septiembre de 2014, en febrero de 2015 entró a producción bajo la marca -Open eBooks y desde mediados de 2016 está disponible para dispositivos -iOS y Android. La app, cuyo diseño está centrado en el usuario, integra -tecnologías y sistemas de información propios de las bibliotecas (ILS, -LMS), OPAC, registro de usuarios, al igual que el catálogo de OverDrive -y otras dos distribuidoras de libros digitales. Dentro de sus -funcionalidades se cuentan la visualización de EPUB 3, audio, video, -utilidades de accesibilidad (OneVoice y lector de gestos), subrayados y -notas. Fue desarrollada, además, con el software de código abierto -Readium, por lo que es gratuita, libre (11 instituciones se unieron al -desarrollo) y customizable. En palabras de James English, quien dirige -el proyecto "las ventajas del código abierto es que permite inspeccionar -la calidad y mejorar las funcionalidades sin restricciones, según las -necesidades de bibliotecas. En mi experiencia personal, las licencias -cerradas oscurecen la calidad de los servicios o buscan mantener alguna -ventaja comercial --- lo que en ningún momento satisface las necesidades -de una biblioteca pública". - -Desde su lanzamiento oficial, el préstamo de libros digitales por parte -de la Biblioteca Pública de Nueva York ha aumentado en 25% (para algunos -de los catálogos la cifra llega al 40%). La comunidad de desarrolladores -asciende a 43 y el equipo que se encarga del proyecto dentro la -biblioteca cuenta con siete empleados de tiempo completo. -::: -::: - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Sistema de Bibliotecas Públicas de Flandes: la biblioteca en red (visión regional y participación local) {#sistema-de-bibliotecas-públicas-de-flandes-la-biblioteca-en-red-visión-regional-y-participación-local .azul .semibold .centrar .mayusculas .interlineado1} - -La región de Flandes (una de las tres regiones políticas y -administrativas de Bélgica) cuenta con 308 bibliotecas públicas -(provinciales, municipales o locales). En la primera década del 2000, -las bibliotecas empezaron a entender las posibilidades que las TIC les -ofrecían (llegarle a nuevos públicos, automatización e innovación en -servicios, y mayor acceso). Con lo que también surgió la necesidad de -unificar sus sistemas (ILS, catálogos, páginas web, etc.): no había una -sola visión o política, lo que imposibilitaba la interoperabilidad de -los sistemas. En 2009, el Ministerio de Cultura de Flandes, creó Bibnet, -una institución cuyo objetivo era "desarrollar la infraestructura y los -servicios de las bibliotecas públicas flamencas acorde con las nuevas -tecnologías de la información... darles las herramientas para llegar al -público en los nuevos medios y redes sociales... enfocarse en la -búsqueda conjunta, la interoperabilidad y el enriquecimiento de -metadatos tanto de sus colecciones digitales como físicas... y darle -sentido al término 'Biblioteca Digital de Flandes'". -::: - -::: {.blancof} -![](images/inter6.jpg){.ancho1 .centrar .bloque} -::: - -::: {.ajuste .descripcion .ancho1} -Pese a que el gobierno flamenco la financia, Bibnet (conocida desde 2015 -como Cultuurconnect) es una institución con autonomía de gestión y -acción. Su misión es "trabajar con las bibliotecas y centros culturales -locales para crear un ambiente de experimentación, tipo laboratorio, en -el que se puedan probar soluciones a los desafíos digitales\". Su meta -es innovar los servicios y gestionar proyectos digitales a gran escala. -Con 30 empleados, su estructura es horizontal y lo suficientemente -flexible como para trabajar de la mano con las comunidades locales y -tener representación y voz en el gobierno regional, moverse a nivel -intergubernamental (distintas provincias) y facilitar la cooperación con -otros sectores. -::: - -::: {.blancof} -![](images/inter7.jpg){.ancho1 .centrar .bloque} -::: - -::: {.ajuste .descripcion .ancho1} -En sus inicios (2009-2015), la organización tuvo a su cargo cuatro -tareas fundamentales: - -[1. Dictar la política digital para la biblioteca públicas de -Flandes]{.semibold}\ -La creación de Bibnet supuso desde un principio una redefinición de las -bibliotecas desde el punto de vista administrativo: dejaron de ser -vistas como instituciones aisladas para ser concebidas como una pieza -dentro una red descentralizada. Esto favoreció la articulación del -trabajo a nivel regional, provincial y local, con el fin de producir -nuevos desarrollos y aplicaciones digitales de manera conjunta, tales -como la construcción de un catálogo de libros digitales flamencos; -encarar grandes inversiones en tecnología (catálogo colectivo y páginas -web), y proponer y ajustar políticas de acuerdo a las nuevas lógicas y -prácticas del entorno digital (derechos de autor, compra y distribución -de libros digitales, entre otras). - -[2. Hacer de las bibliotecas públicas de Flandes un referente digital en -la comunidad]{.semibold}\ -Esto también implicó darle un nuevo valor al trabajo de las bibliotecas -a nivel local y modificar su modelo de servicios: en tanto centros -cercanos a la comunidad y a las personas (base de la sociedad), éstas -pasaron a ser lugares privilegiados para el acceso a la información, la -creación de colecciones digitales diversas y únicas, al igual que el uso -y apropiación de estas colecciones a través de las nuevas tecnologías. -Por otro lado y conscientes de que las TIC permiten mayor participación -en diversos procesos ciudadanos, Bibnet empezó a fomentar la -intervención de bibliotecarios y usuarios en la creación de servicios y -a fomentar el emprendimiento local. A través de hackatones, -convocatorias para proponer proyectos, talleres para desarrollar -propuestas (modelo de negocio, presupuestos, tiempos de ejecución) y -concursos, distintos ciudadanos empezaron a tener una participación -directa en la creación de servicios bibliotecarios y culturales. En este -momento, por ejemplo, Cultuurconnect está desarrollando y probando con -la comunidad un prototipo de aplicación para encontrar libros, a partir -de los perfiles y preferencias de los usuarios en redes sociales como -Facebook. - -[3. Organizar y enriquecer las colecciones]{.semibold}\ -Una de las principales tareas de Bibnet fue asumir la titánica tarea de -desarrollar e implementar un catálogo colectivo para las 308 bibliotecas -de Flandes. Esto implicó definir una política de metadatos, desarrollar -una infraestructura tecnológica (backend) lo suficientemente robusta y -flexible como para soportar miles de registros, y un diseño (frontend) -que se ajustara a las necesidades los diversos usuarios de las -bibliotecas de las cinco provincias y su capital. El [catálogo -colectivo](http://zoeken.bibliotheek.be/){.gris .subrayado .italica}, -que se ha ido implementando de manera escalonada, funciona hoy con un -software de catalogación propio (Open Vlacc) que permite la catalogación -colaborativa, la actualización de los registros automatizada, incluye -reseñas, resúmenes y portadas, y vincula bases de datos, colecciones de -revistas, periódicos y algunos libros digitales. - -[4. Construir y administrar ambientes digitales\ -orientados hacia el usuario]{.semibold}\ -Esta tarea incluyó diseñar páginas web para las bibliotecas, un -[portal](http://www.bibliotheek.be/){.gris .subrayado .italica} que -contuviera la información de todas éstas (portal de portales) y -gestionar el desarrollo de diversos servicios digitales partiendo de las -necesidades particulares de las instituciones. Para hacer que estos -ambientes digitales funcionaran en red, se desarrolló un buscador propio -(Aquabrowser) que vincula la información de todas las bibliotecas a -través de datos abiertos enlazados y un Content Management System (CMS) -que les permite a los bibliotecarios gestionar y actualizar la -información de la institución en la que trabajan. También fue necesario -crear un registro único de usuario (tanto para la afiliación a las -bibliotecas físicas como para acceder a los diversos servicios -digitales). Esta funcionalidad, conocida como MiBiblioteca y que se -valida con el número de identificación nacional, permite hacer reservas, -crear listas de favoritos, acceso a historial de préstamos y a otros -servicios digitales. - -Entre estos últimos se cuentan un servicio de préstamo de libros -interactivos para niños llamado Fundels . La colección, desarrollada en -conjunto con una editorial digital local, incluye más de 75 títulos (25 -educativos, 50 generales), que están disponibles para préstamo (7 -títulos al año por cada usuario de la biblioteca) o para compra (3 euros -cada uno). Además de que los libros están enriquecidos con audio, video -y animación, incluyen funcionalidades de lectura sincronizada en varios -idiomas, juegos con los personajes de las historias, contenido adicional -y creación de multimedia. -::: -::: - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Sistema de Bibliotecas Públicas de Chile: la biblioteca como productora de contenidos, un espacio para la memoria {#sistema-de-bibliotecas-públicas-de-chile-la-biblioteca-como-productora-de-contenidos-un-espacio-para-la-memoria .azul .semibold .centrar .mayusculas .interlineado1} - -El Sistema Nacional de Bibliotecas Públicas de Chile (creado en 1978, -bajo el nombre Coordinación Nacional de Bibliotecas como parte de la -Dirección de Bibliotecas, Archivos y Museos, DIBAM) es el eje -articulador de más de 450 bibliotecas públicas a lo largo de todo el -territorio chileno. Además de ser uno de los tres coordinadores del Plan -Nacional de Lectura de Chile, entre sus principales funciones está la -creación y administración de colecciones físicas y digitales, la -construcción y modernización de los edificios de las bibliotecas y la -automatización de las bibliotecas públicas a través del proyecto \"la -Optimización tecnológica de servicios y gestión de bibliotecas públicas" -que se encarga de la creación de un catálogo colectivo en línea, -adquisición de licencias de software y capacitación a los bibliotecarios -en el manejo de las TIC. - -La creación de una biblioteca digital (y sus componentes) responde a las -necesidades de ésta última función. Chile cuenta con una Biblioteca -Nacional Digital (colecciones de documentos patrimoniales -digitalizados), una Biblioteca Pública Digital (préstamo de libros -digitales) y un archivo colaborativo de Contenidos Locales producidos -por los habitantes de las distintas regiones de Chile. Cada uno de estos -servicios tiene misiones distintas y, aunque todos hacen parte de DIBAM, -están a cargo de diferentes coordinaciones. -::: - -::: {.blancof} -![](images/inter8.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -### Biblioteca Nacional Digital y colecciones digitales {#biblioteca-nacional-digital-y-colecciones-digitales .azul .semibold .centrar .mayusculas} - -El objetivo de la Biblioteca Nacional digital es, según lo expresado por -su coordinadora Daniela Schutte, "traspasar las fronteras geográficas y -temporales, asumiendo la impronta de las nuevas formas de crear, -preservar, utilizar y publicar el conocimiento, a través de las nuevas -tecnologías de la información. Ofrece una plataforma unificada de -servicios digitales que les permite a los usuarios de Chile y el mundo -la consulta remota de las colecciones de la Biblioteca Nacional de -Chile, el depósito de obras de creación digital y la asistencia de -bibliotecarios especializados". Cuenta con acceso para descarga gratuita -de 243 mil objetos digitales de la Biblioteca Nacional (organizados por -Fondos y Colecciones, bibliotecas temáticas, bibliotecas territoriales, -curadurías bajo el nombre de Memoria Chilena), visitas virtuales al -edificio de la Biblioteca, acceso a servicio de bibliotecario en línea, -mapas patrimoniales, depósito legal electrónico, entre otros. - -### Biblioteca Pública Digital {#biblioteca-pública-digital .azul .semibold .centrar .mayusculas} - -A finales de 2013, el Sistema de Bibliotecas Públicas de Chile lanzó su -servicio de préstamo de libros digitales a través de la plataforma de -préstamo y distribución Odilo, con el nombre Biblioteca Pública Digital. -Sin embargo, solo desde enero de 2016, la BP Digital empezó a vivir un -momento de esplendor, al lanzar una app disponible para sistemas -operativos iOS y Android que integra catálogo y DRM. Para diciembre de -2016, el servicio ya contaba con 65.000 usuarios registrados, un -incremento del 400%, frente al 2015 cuando apenas tenía 13.000. En el -año se habían realizado más 107.000 préstamos y había tenido más de un -millón de vistas. - -El éxito de la Biblioteca Pública Digital de Chile, que en 2016 recibió -el Premio Nacional a la Innovación, ha sido el resultado de un proceso -lento, en el que su equipo ha tenido que sortear diversas dificultades. -Según lo expresado por Florencia García Oyandel, quien ha estado a cargo -del proyecto desde sus inicios, muy pronto en su proceso de -implementación se hizo evidente que el público de la Biblioteca Pública -Digital era distinto al de las bibliotecas públicas del sistema, "un -público cautivo, que es fiel, pero que cuesta mucho ampliar". Fue -entonces que decidieron abrir el sistema a otros usuarios: todos los -chilenos residentes en Chile y en el extranjero (su registro solo pide -el número de identificación nacional). Hoy en día, los usuarios de las -bibliotecas públicas solo representan el 10% del número total de -usuarios de la BP Digital. - -Por otro lado, el sistema de inscripción representaba problemas tanto a -nivel administrativo como desde la perspectiva del usuario. Para -empezar, el proceso de autenticación era muy dispendioso (solo después -de que un funcionario validara y autorizara los datos, se emitía una -contraseña) y ésta solo se podía recuperar si el usuario lo hacía -inmediatamente después de emitida. La solución fue generar un sistema de -autenticación automática, simplificar los campos que debía llenar el -usuario a la hora de inscribirse (en este momento solo piden nombre -completo, correo y número de identificación nacional). Y, como la -plataforma estaba integrada con el sistema de información de las -bibliotecas públicas, apenas un usuario hacía su afiliación al sistema, -quedaba automáticamente inscrito en la BP Digital. Según Florencia -García: "sacrificamos estadísticas, en pro del préstamo. Nos encantaría -saber el rango etario de los usuarios, si son mujeres u hombres, pero -como nuestro objetivo es facilitar el acceso, esta información pierde -relevancia frente al número de préstamos y qué se está prestando". - -Finalmente, el proceso de descarga y préstamo era muy complicado. Los -usuarios debían inscribirse, solicitar un libro, descargar la aplicación -de DRM (de distintas empresas, dependiendo si se conectaba desde un PC, -tableta o celular) y esperar a que abriera el libro. La solución fue -diseñar junto con Odilo y una empresa de tecnología local una aplicación -que integrara el lector, el DRM y el sistema de información de las -bibliotecas. En febrero de 2016, tan solo un mes después de lanzada la -aplicación, ya se habían hecho 7000 préstamos. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -La Biblioteca Nacional ofrece al público 244 mil objetos digitales de -descarga libre: -[www.bibliotecanacionaldigital.cl](http://www.bibliotecanacionaldigital.cl/bnd/612/w3-channel.html){.gris -.subrayado .italica} - -Portal de Contenidos locales: - -Servicio de préstamo de libros digitales, con 65.000 usuarios -registrados y 107.000 préstamos. Recibió el Premio Nacional a la -Innovación. Disponible solo para ciudadanos chilenos. - -Los usuarios de las bibliotecas públicas solo representan el 10% del -número total de usuarios de la BP Digital. -::: -::: -::: - -::: {.blancof} -![](images/inter9.jpg){.ancho5 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -Uno de los principales retos que aún enfrenta este servicio es el modelo -de compras de libros digitales establecido por las editoriales y los -distribuidores. Según éste, la bibliotecas compran licencias (permisos -de uso) de uno o varios títulos, que permiten 24 préstamos no -concurrentes (es decir, que no permite prestar el mismo título de manera -simultánea a más de un usuario). Este último aspecto es especialmente -problemático, ya que un usuario que esté buscando un libro que ya esté -prestado, debe esperar a que el otro usuario lo devuelva y reservarlo. -Según García Oyandel, "sabemos que hay una pérdida de usuarios en las -reservas ---algunos de nuestros títulos tienen 200 reservas---, además -de un número que no conocemos de usuarios que se van sin llegar a -reservar." Solucionar esto es particularmente apremiante, ya que el -Sistema de Bibliotecas tiene proyectado inaugurar a inicios de 2017 una -estación de préstamo de libros digitales en el aeropuerto internacional -de Santiago, cuya población es flotante (por lo que no hay posibilidad -de reservar). Según ella, la solución estaría en que las bibliotecas le -puedan comprar a las editoriales el acceso total a su catálogo y que las -licencias no estén asociadas a títulos. De esa manera, la construcción -de una lista de lectura dependería completamente del usuario. - -### Archivo colaborativo de Contenidos Locales {#archivo-colaborativo-de-contenidos-locales .azul .semibold .centrar .mayusculas} - -El programa Biblioredes, que hoy es responsable del archivo colaborativo -de Contenidos Locales, nació en 2002 como un proyecto de la DIBAM -financiado por la Fundación Bill & Melinda Gates con el fin de disminuir -la brecha digital y fomentar el desarrollo de las comunidades de Chile a -través de sus bibliotecas públicas. Entre sus objetivos específicos -están: 1. Desarrollar competencias para la participación y expresión -social digital de las Bibliotecas y comunidades locales, 2. Desarrollar -e implementar servicios virtuales focalizados en la participación y el -aumento del capital social y cultural de las comunidades locales y, 3. -Asegurar, mejorar y ampliar el acceso y uso gratuito de Internet y otros -recursos digitales a las comunidades asociadas al sistema de Bibliotecas -Públicas. - -El programa incluye alfabetización digital básica, alfabetización -digital avanzada y la creación de contenidos locales, que inició en -2004, se consolidó como comunidad virtual en 2009 y ahora se conoce como -un archivo digital colaborativo del patrimonio cultural chileno. La -filosofía que sostiene el programa es que la apropiación social de la -tecnología pasa por la creación y recreación de las identidades locales -en internet. En este sentido, un contenido local es una expresión -cultural, artística o patrimonial, registrada por los habitantes de cada -territorio bajo sus propios criterios estéticos y publicados en formato -digital. En palabras del exdirector de Bibliotecas Públicas de Chile, -Enzo Abbliagati: "creemos que ---en un mundo hiperconectado--- la -biblioteca pública tiene que, cada vez más, convertirse en un medio para -que sus usuarios no solo reciban sino aporten contenidos a la web. Pero -ese aportar, en el caso nuestro, no es neutro: nos interesan las -culturas locales, esas que difícilmente aparecen en los grandes medios y -que son apenas una cita a pie de página en los versiones oficiales de -Chile, que las personas se encuentren retratadas en internet\". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -El programa de Contenidos Locales de Chile, uno de los primeros de su -tipo y de mayor continuidad en América Latina, cuenta con un [nutrido -repositorio]{.semibold} de páginas web, blogs, videos, fotografías, -'podcasts' y revistas digitales. Para enero de 2016 tenía en total 6.218 -contenidos, 72.916 vistas anuales al sitio, 62.388 usuarios únicos. - -La difusión y la [participación de la comunidad]{.semibold} se hace a -través de convocatorias, concursos, seminarios-taller, ferias y, desde -2014, se celebra un encuentro anual al que asisten las 50 bibliotecas -que hacen parte de la red de Contenidos Locales, los creadores y la -ciudadanía en general. -::: -::: -::: - -::: {.blancof} -![](images/inter10.jpg){.ancho5 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -La implementación del programa ---y su éxito--- hizo que el rol de las -bibliotecas públicas chilenas al igual que las funciones de sus -bibliotecarios cambiara, pues ahora se debían asumir como un articulador -o mediador cultural e informacional de su comunidad. La biblioteca -pública pasó a ser un espacio para acoger, elaborar, generar, enseñar y -difundir las prácticas socioculturales de las comunidades; su patrimonio -en el sentido más amplio, aquello que las identifica. Más aún, la -biblioteca empezó a constituirse como un espacio para la memoria, de -identidad. En palabras de la bibliotecaria chilena Lucía Abello Abello: - -"Contenidos Locales ha facilitado el intercambio de experiencias y -prácticas de personas anónimas, comunes y corrientes, que nos permite -reconocernos como parte de un territorio común, como miembros de una -misma comunidad, lo que contribuye a fortalecer nuestra identidad, -nuestro sentido de pertenencia. Permite reconocernos en nuestra cultura -con todo lo que ello implica y en donde, quien tiene el control de lo -que se publica en la Web es el propio usuario, pues es él o ella quien -gestiona, crea y difunde lo que estima pertinente o según sus -necesidades, preocupaciones o intereses". - -El proceso de creación de contenidos, que inicia con convocatorias de -las bibliotecas locales, depende totalmente del creador (si los que se -postulan no saben de computadores o internet, son capacitados; si no -tienen equipos, la biblioteca se los presta). Para subir el contenido, -éste debe registarse en la página de Contenidos Locales con sus datos -básicos y correo electrónico. Una vez un contenido es ingresado pasa por -dos filtros de selección. El primero es el encargado regional de la -biblioteca, quien es responsable de revisar la forma y el formato. Luego -pasa a manos de la responsable del programa, quien revisa el contenido -(que sea pertinente, se vincule con la cultura o patrimonio local y que -presente una mirada particular del fenómeno). - -Uno de los grandes desafíos que enfrenta el programa a futuro es la -preservación digital de los contenidos y mantenerse actualizado en -términos tecnológicos. En este momento, los productores no están en la -obligación de entregarle los archivos madre al Sistema de Bibliotecas -Públicas de Chile, con lo que el mantenimiento y preservación de las -páginas no es controlado. El programa, sin embargo, ya ha hecho -contactos con la Biblioteca Nacional Digital, para recibir asesoría en -preservación y para ver cuáles de sus contenidos pueden entrar por -depósito digital. -::: -::: - -::: {#cont5 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## CONCLUSIONES {#conclusiones .semibold .azul .mayusculas} - -~[»]{.azul .tamano1}~El entorno digital no solo permite, sino que exige -el trabajo en redes y a través de alianzas. Estas son favorables no solo -a la hora de agregar contenidos y construir colecciones, sino para -llegarle a comunidades locales o remotas, disminuir costos al hacer -compras o desarrollar tecnologías conjuntas, escalar servicios y dictar -(o modificar) políticas acordes a las nuevas lógicas y prácticas de una -sociedad interconectada. - -~[»]{.azul .tamano1}~El uso de las nuevas tecnologías de información en -las bibliotecas favorece y fomenta nuevos modelos de trabajo en los que -prevalecen la interdisciplinariedad y la colaboración. Con ellos se -nutren, crecen y cambian los servicios, y los conocimientos y -habilidades de los empleados. - -~[»]{.azul .tamano1}~Los ambientes colaborativos, que surgen al -aprovechar las TIC para fomentar la participación ciudadana en la -creación de servicios y contenidos, hacen que las funciones de empleados -y bibliotecarios cambien: de funcionarios cuyas tareas radican en suplir -la demanda (poner a disposición colecciones y ofrecer programaciones) se -pasa a la co-creación con el público, de la distribución de contenidos -acabados a la mediación de diversas expresiones culturales. - -~[»]{.azul .tamano1}~De lo anterior se desprenden (y se hacen -necesarias) nuevas formas de relacionarse con los usuarios, quienes -empiezan a tener un rol de creadores, colaboradores y no simples -espectadores o consumidores. Muchas veces los usuarios no solo tienen -voz, sino que también tienen voto y participación en el desarrollo de -los productos y servicios ofrecidos por las bibliotecas. - -~[»]{.azul .tamano1}~El entorno digital no solo favorece sino que -también hace recomendable crear ambientes de experimentación en los que -se puedan probar prototipos de servicios, plataformas y contenidos -digitales. Por tratarse de nuevos desarrollos es necesario probar, -mejorar y volver a probar antes de invertir grandes sumas de dinero en -el desarrollo de nuevas tecnologías. De esta manera se reducen costos y -se minimiza el riesgo. En palabras de Koen Vandendriessche, gerente de -proyectos para el Sistema de Bibliotecas Públicas de Flandes: "es -preferible hacer muchas pruebas y fracasar pronto en el proceso". - -~[»]{.azul .tamano1}~Las plataformas de préstamo de libros que ofrecen -las distribuidoras comerciales siguen siendo deficientes para las -bibliotecas públicas: manejan interfaces poco usables y no incluyen -funciones de accesibilidad, entre otras, por lo que varios sistemas de -bibliotecas públicas se han visto en la obligación de tomar rutas -alternativas; bien sea desarrollando su propio software o negociando con -las empresas soluciones más acordes con las necesidades de sus usuarios -y la misión pública de las bibliotecas. - -~[»]{.azul .tamano1}~Se recomienda el uso y desarrollo de 'software -libre' y de código abierto, no solo por tratarse soportes gratuitos que -permiten hacer correcciones, modificaciones y actualizaciones, lo que -ayuda a superar ciertas imposiciones comerciales de grandes -distribuidores, sino porque también facilita la interoperabilidad entre -varios sistemas de información y es afín a la misión pública de las -bibliotecas de dar acceso libre y abierto a la información. - -~[»]{.azul .tamano1}~Una de las características de las bibliotecas, -servicios y contenidos digitales es que permiten traspasar las fronteras -geográficas y temporales. Por lo tanto, los usuarios de algunos -servicios digitales proveídos por las bibliotecas públicas no son los -mismos usuarios de la bibliotecas físicas. Hay que tener en cuenta que -para llegarle a estos nuevos usuarios se está compitiendo por su -atención con medios de comunicación y entretenimiento que son más -rápidos. En este sentido, la usabilidad de los servicios debería ser una -de las prioridades en su desarrollo. - -~[»]{.azul .tamano1}~Las redes de bibliotecas de distintas ciudades del -mundo enfrentan los mismos retos en torno a la prestación de servicios y -creación de contenidos digitales: oferta desventajosa en la compra y -distribución de libros digitales; modelos de derechos de autor que no -están pensados para el ámbito digital; la preservación de contenidos y -productos digitales en un entorno tecnológico cambiante; la percepción -de que la biblioteca digital es una competencia de la biblioteca física; -asumirse como agentes en un entorno de cambio cultural (digital) que es -lento. Es fundamental seguir investigando, explorando y estudiando, para -seguir actualizados, pues el entorno digital es cambiante. - - -# Orientaciones Técnicas, Modelo de Plan de Trabajo y Estándares para crear una Biblioteca Digital - - -# ORIENTACIONES TÉCNICAS, MODELO DE PLAN DE TRABAJO Y ESTÁNDARES PARA CREAR UNA BIBLIOTECA DIGITAL {#orientaciones-técnicas-modelo-de-plan-de-trabajo-y-estándares-para-crear-una-biblioteca-digital .tituloi .mayusculas} - -Por: Sandra Angulo -::: - -::: {.imagencontenida2 .imgfondo4} -::: - - - -::: {.flex} -::: {.ancho6 .descripcion .ajuste .flexv .flexceh} -::: - -::: {.ajuste .indice .ancho4 .partido} -## ÍNDICE {#índice .azul .extrabold} - -1\. Introducción - -2\. Esquema de plan de trabajo en el modelo de agregación - -3\. Esquema del plan de trabajo en el modelo de producción - -4\. Estándares de metadatos: el modelo Dublin Core - -\ -\ -\ - -5\. Estandarización de formatos - -6\. Arquitectura de información - -7\. Políticas recomendadas para una biblioteca digital - -8\. Políticas de propiedad intelectual - -9\. Infraestructura tecnológica y selección de plataforma -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Introducción {#introducción .azul .semibold .centrar .mayusculas .interlineado1} - -Las bibliotecas digitales se desenvuelven como sistemas de información -documental en red, en donde a partir del uso de las tecnologías de -información y comunicación, se realizan las diferentes operaciones -propias del ciclo de entrada y salida de la información digital. De esta -manera se proponen las orientaciones para el diseño y plan de trabajo -que requerirá la Biblioteca Digital de Bogotá, entendiéndola como un -organismo propio y específico que requiere desarrollarse en el entorno -de una situación en donde existen ya otras entidades del Distrito -Capital que vienen desarrollando contenidos y servicios digitales, lo -que la pone en una condición de [modelo de agregación]{.semibold}, pero -que también puede tener la oportunidad de generar contenidos propios, lo -que la pone en una condición de [modelo de producción.]{.semibold} En -ambos casos, los diseños a realizar deberán ser flexibles y acomodados -al tiempo de desarrollo y madurez del proyecto. - -De otra parte, ver la Biblioteca Digital como sistema de información en -red requerirá un plan de trabajo y la definición de un equipo de -personas con roles y tareas definidas, que igualmente puede graduarse de -acuerdo con la evolución del proyecto. -::: -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Esquema del plan de trabajo en el modelo de agregación {#esquema-del-plan-de-trabajo-en-el-modelo-de-agregación .azul .semibold .centrar .mayusculas .interlineado1} -::: - - ------------------ ------------------ ------------------ ------------------ - Aquí estamos Fase 1 -- Fase 2 - Fase 3 - - Identificación Administrativa Operaciones - - Inscripción de la -Conformación de \- Identificación -Diseño del modelo - iniciativa en el equipo de trabajo de los tipos de de arquitectura de - plan de la general y recursos digitales contenidos, - ciudad.\ contratación del de las entidades colecciones y usos - \ inicial. seleccionadas, que se pretende - Desarrollo de una -Inventario de bien sea primarios para la Biblioteca - consultoría.\ instituciones con o secundarios. Digital como - \ desarrollos -Identificación de agregadora. - Taller de digitales, la estructura de -Diseño de modelos - prospectiva partiendo de la organización de de metadatos. - selección sus metadatos y el -Diseño de - realizada en el sistema de bases políticas y - anexo No. 2, así de datos usadas. lineamientos de - como del alcance Esto porque si participación en - establecido para bien la la Biblioteca - la biblioteca generalidad de las Digital. - digital que se instituciones del -Selección y - pretende. Distrito utiliza funcionamiento de - -Selección y sistemas de las plataformas - contacto con las administración de web de agregación, - entidades contenidos, otras visualización y - pertinentes a cuentan con almacenamiento. - vincularse de información - acuerdo con el relevante - alcance, función y organizada en - misión de la bases de datos - Biblioteca Digital tipo Excel que - de Bogotá. requieren - estructurarse. - ------------------ ------------------ ------------------ ------------------ - -::: {.ajuste .descripcion .ancho1} -#### Identificación {#identificación .azul .semibold .centrar .mayusculas} - -La fase de identificación y administrativa es realizable en seis meses a -partir de la definición de un cronograma de trabajo. El equipo de -trabajo inicial puede estar conformado por un líder de proceso, y dos -profesionales en el campo de la ingeniería de sistemas y/o ciencias de -la información con experiencia en proyectos de bibliotecas o -repositorios digitales. - -La tarea fundamental en esta fase tiene que ver con el contacto y -levantamiento discriminado de las instituciones del Distrito que tienen -contenidos digitales desarrollados y que puedan ser pertinentes a los -intereses y alcance de la Biblioteca Digital. Esta fase es muy -importante en la medida que pone el discurso de la Biblioteca Digital en -las agendas de las demás entidades del Distrito. Como resultado deberá -obtenerse el croquis de instituciones como insumo para el inicio de la -fase dos. - -#### Fase Administrativa {#fase-administrativa .azul .semibold .mayusculas} - -Con base en el croquis de instituciones, una primera acción será la -identificación de los tipos de recursos digitales, bien sea primarios o -secundarios. Los primarios son los objetos de investigación, tales como -libros, fotos, mapas, etc., mientras que los secundarios se utilizan -para realizar la investigación, tales como bases de datos, motores de -búsqueda, catálogos, páginas web. (Galina, 2012). Esta identificación -deberá acompañarse de un esquema que defina temas clave, como por -ejemplo afinidades temáticas: ¿Qué tienen en común los contenidos de la -CAR y del IDEAM, o los de la Cámara de Comercio con los de Artesanías de -Colombia?. El resultado o el esquema elaborado, deberá servir como -insumo para la fase de operaciones relacionada con la definición de la -arquitectura de la biblioteca digital y la conexión entre metadatos -basados en web semántica. - -#### Fase de Operaciones {#fase-de-operaciones .azul .semibold .mayusculas} - -La fase de operaciones es realizable en dos pasos: 1) en el diseño de -estructuras de contenidos, metadatos, colecciones, y políticas de -participación, y 2) en la implementación de éstas a partir de la -selección de la plataforma seleccionada. - -Esta fase deberá tener en cuenta un principio orientador y es la -estandarización, ya que se trata de reunir información que debe ser -disponible de forma ágil, coherente y organizada. Los "estándares deben -desarrollarse de manera paralela hacia normas flexibles de estructura -que permitan desarrollar un web semántico" (Méndez Rodríguez; Merlo -Vega, 2000). Para ello deberá tenerse en cuenta como mínimo el uso de: - -- Metadatos basados en lenguajes xml. -- Uso de estándares interoperables basados OAI-PMH. -- Lenguajes controlados -- Definición de la propiedad intelectual -::: -::: - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Esquema del plan de trabajo en el modelo de producción {#esquema-del-plan-de-trabajo-en-el-modelo-de-producción .azul .semibold .centrar .mayusculas .interlineado1} - -En el modelo de producción, la Biblioteca Digital produce contenidos y -otro tipo de desarrollos aplicados a la biblioteca y los incorpora a la -misma a través de un modelo de gestión. En tal caso, debe desarrollar un -ciclo de trabajo y ajustar su equipo de trabajo. Los contenidos pueden -ser: digitalización, edición de libros digitales, producción de -aplicaciones, API, servicios virtuales y virtualización de contenidos y -servicios, entre otros. -::: - -Gestión de conservación y digitalización -::: - -Catalogación - -Gestión de contenidos - -Gestión de plataforma y tecnologías - -Responsable de digitalizar a partir de parámetros técnicos y conservar -los recursos digitales con normas de seguridad. Puede optar por el -modelo de digitalizar bajo gestión propia, digitalizar en conjunto con -las entidades participantes o tercerizar. - -Responsable de la catalogación de los recursos, de la revisión de -metadatos y bases de datos agregadas, así como de la metodología de -enlazado de metadatos para semántica. - -Responsable de mantener, gestionar y visualizar los contenidos del -portal Web de la Biblioteca Digital. - -Responsable del funcionamiento y mantenimiento de las plataformas, -además de la investigación y desarrollo de nueva infraestructura para la -gestión y servicios de la Biblioteca Digital. - -Gestión de recursos digitales: Responsable por el desarrollo de las -colecciones a partir de los recursos digitales. Implica la gestión en -cada momento del ciclo de vida del documento en la biblioteca digital, a -partir de los procesos de selección, adquisición y organización con -metadatos. Dicta las pautas para la negociación de los derechos de -autor, inclusión de colecciones a digitalizar o agregar. - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Estándares de metadatos: el modelo Dublin Core {#estándares-de-metadatos-el-modelo-dublin-core .azul .semibold .centrar .mayusculas .interlineado1} - -El siguiente cuadro muestra el esquema Dublin Core y la definición de -campos para tener en cuenta tanto en la fase de agregación como en la de -producción de contenidos digitales: -::: - -CAMPOS DE METADATOS - DUBLIN CORE -::: - -Contenido - -Título de la publicación (Etiqueta: DC. Title)\ -Corresponde al nombre dado a un recurso, habitualmente por el autor. - -Materias (Etiqueta: DC. Subject)\ -Corresponde a las palabras claves normalizadas asociadas al contenido de -un recurso. Esta etiqueta puede integrar descriptores personales, -corporativos, temáticos, geográficos y taxonómicos. Se fomentará el uso -de vocabularios controlados y de sistemas de clasificación formales. - -Descripción (DC. Description)\ -Corresponde a una descripción textual del recurso. Puede ser un resumen -en el caso de un documento o una descripción del contenido en el caso de -un documento visual. - -Fuente (Etiqueta: DC.Source)\ -Corresponde a una secuencia de caracteres usados para identificar -unívocamente la fuente de la catalogación, o en otras palabras, la -institución que genera el registro. Una opción es usar el código que se -genera en la Biblioteca del Congreso y que se usa en el formato MARC21, -en el campo 040 (Fuente de catalogación). - -Lengua/Idioma (Etiqueta: DC. Language)\ -Corresponde a la lengua o idioma del contenido intelectual del recurso. - -Relación (Etiqueta: DC. Relation)\ -Es un identificador de un segundo recurso y su relación con el recurso -actual. Este elemento permite enlazar los recursos relacionados y las -descripciones de los recursos. Es importante tenerlo en cuenta para los -procesos de organización semántica y enlazada de la información entre -colecciones. - -Cobertura (Etiqueta: DC. Coverage)\ -Es la característica de cobertura espacial y/o temporal del contenido -intelectual del recurso. La cobertura espacial se refiere a una región -física, utilizando por ejemplo puntos o coordenadas. La cobertura -temporal se refiere al contenido del recurso, no a cuándo fue creado -(que ya lo encontramos en el elemento Date), la cobertura geográfica -(sitios geográficos) o jurisdiccional (entidades jurídicas) que describa -el contenido de la información. - -Propiedad intelectual - -Autor o creador (Etiqueta: DC. Creator)\ -Corresponde a la persona u organización responsable de la creación del -contenido intelectual del recurso. Por ejemplo, los autores en el caso -de documentos escritos; artistas, fotógrafos e ilustradores en el caso -de recursos visuales. - -Otros colaboradores (Etiqueta: DC. Contributor)\ -Corresponde a las personas o entidades que tienen una contribución -intelectual significativa, es decir, que implique un aporte intelectual -pero que ésta sea secundaria en comparación con las de las personas u -organizaciones especificadas en el elemento Creator. Tradicionalmente, -esta colaboración se refiere a los ilustradores, directores, -traductores, compiladores, etc. - -Editor (Etiqueta: DC. Publisher)\ -Corresponde a la entidad responsable de hacer que el recurso se -encuentre disponible en la red en su formato actual. Este elemento puede -utilizarse para la identificación de la entidad que aporta el recurso -digital. - -Derechos (Etiqueta: DC. Rights)\ -Corresponde a una referencia (por ejemplo, una URL) para una nota sobre -derechos de autor, para un servicio de gestión de derechos o para un -servicio que dará información sobre términos y condiciones de acceso a -un recurso. (derechos de propiedad, uso, acceso, transformación, -explotación comercial, etc.). - -Aspectos formales - -Fecha (Etiqueta: DC. Date)\ -Corresponde a una fecha en la cual el recurso se puso a disposición del -usuario en su forma actual. Esta fecha no se tiene que confundir con la -que pertenece al elemento Coverage, que estaría asociada con el recurso -en la medida que el contenido intelectual está de alguna manera -relacionado con aquella fecha. - -Tipo del Recurso ( DC.Type )\ -Corresponde a la categoría del recurso. Por ejemplo, página personal, -romance, poema, diccionario, etc. - -Formato (Etiqueta: DC. Format)\ -Es el formato de datos de un recurso usado para identificar el software -y, posiblemente, el hardware que se necesitaría para mostrar el recurso. - -Identificador del documento digital (Etiqueta: DC. Identifier)\ -Secuencia de caracteres utilizados para identificar unívocamente un -recurso. Ejemplos para recursos en línea pueden ser URLs y URNs. Para -otros recursos pueden ser usados otros formatos de identificadores, como -por ejemplo ISBN (\"International Standard Book Number\"). - -::: {#cont5 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Estandarización de formatos {#estandarización-de-formatos .azul .semibold .centrar .mayusculas .interlineado1} - -La estandarización también es aplicable a los tipos de formatos. De esta -forma es importante establecer una política de formatos de forma tal que -la Biblioteca Digital pueda generar lineamientos para las instituciones -que desarrollan y le aportan contenidos. De esta forma deberán -preferirse los formatos abiertos que apoyan la inclusión de metadatos -descriptivos, técnicos y administrativos, favoreciendo metadatos en -formatos estandarizados. - -El término formato es muy amplio y abarca los siguientes conjuntos -superpuestos de entidades: - -- A nivel indicado por extensiones de archivo, por ejemplo, .mp3 -- Como se indica por los tipos de medios de Internet (también conocido - como tipo MIME), por ejemplo , text/html -- Las versiones que se desarrollan a través del tiempo, por ejemplo, - el formato TIFF versión 5.0 fue reemplazado por la versión de Adobe - 6.0 -- Refinamientos que están diseñados para reducir, con fines - específicos, por ejemplo, TIFF/EP para fotografía electrónica y - TIFF/IT para requisitos de impresiones preliminares, establecidos - como estándares ISO. -- Instancias con funciones opcionales significativas para la - sostenibilidad en el tiempo, por ejemplo, los programas descargados - de Audible, Inc., están en formatos que impiden \" que un cliente - pase duplicados de archivos de audio digital a otro usuario\" -- Bitstream, codificaciones que subyacen a ciertos formatos de - archivo, por ejemplo, el código de pulso modulado lineal (LPCM) que - se puede encontrar en WAVE o AIFF o vídeo H.264 que se pueden - encontrar en QuickTime o MPEG -4. -- Agrupación de formatos que incluyen ejemplos que van de TIFF a ZIP - para MXF a METS. -- Clases de formatos relacionados cuyas características familiares son - importantes, por ejemplo, el formato de audio WAVE es una instancia - de la clase de formato RIFF. - -El cuadro a continuación relaciona los tipos de formatos recomendados -que pueden circular en la biblioteca digital, bien en el escenario de -agregación o de producción, y es importante reconocerlos desde la fase -administrativa para facilitar el diseño y la toma de decisiones en la -fase de operaciones. -::: - -::: {.blancof .padding2} -TIPO -::: -::: - -ESTÁNDAR - -SOPORTE - -Intercambio de datos - -Texto con marcadores estructurales - -SGML utilizando DTD o un esquema estándar o conocido apropiado para un -género textual particular. Lenguaje estándar de descripción de páginas -(SPDL) - -ISO/IEC JTCI/SC34 - -Lenguaje de marcado extensible XML - -W3C - -PostScript - -Adobe Systems Inc - -OEBPS\_1\_2, Estructura de publicación Open eBook, versión 1.2 (para las -novelas, libros de texto, monografías académicas, etc.) - -OEBPS container format - -DTB, Digital Talking Book, con transcripción completa del texto (para -novelas, libros de texto, monografías académicas, etc.) Document Type -Definition (DTD). Para artículos y revistas electrónicas - -ANSI/NISO Z39.86-2005 - -Formato de arquitectura de documento abierto ODA - -ISO/IEC JTC, ITU, ECMA - -Formato de texto enriquecido RTF - -Microsoft - -Formato de archivo independiente de dispositivo TeX DVI - -American Mathematical Society - -PDF/A Otros subtipos PDF creados a partir de texto legible por la -máquina (en lugar de imágenes de la página) - -Adobe System Inc - -HTML (solo si se publica de esta forma). - -W3C - -Imágenes digitales de mapas de bits - -TIFF\_UNC (TIFF, mapa de bits sin comprimir) en cualquier espacio de -color con el soporte de TIFF. - -ISO/TC130/WG2 - -Especificación de Intercambio de Datos Digitales (DDES) - -ISO/TC130/WG2 - -Formato de intercambio de gráficos (GIF) - -CompuServe Inc. - -Procesamiento e intercambio de imágenes: Facilidad de intercambio de -Imagen ( IPI-IIF) - -ISO/IEC JTCI/SC24 - -Grupo de expertos fotográficos unidos(JPEG)\ -Grupo de imagen binivel conjunta (JBIG) - -ITU-T, ISO/IEC JTCI/SC29 - -Gráficos portátiles de red ( PNG) - -W3C - -Formato de archivo de imagen de Etiqueta (TIFF) - -Aldus Corporation Microsoft - -Disco compacto de fotos (Photo CD) - -Eastman Kodak Company - -Formato De Archivo De Imagen Etiquetada Para La Fotografía Electrónica -(TIFF/EP) - -ISO TC42/WG18 - -TIFF para la Tecnología de imagen (TIFF/IT) - -ISO TC130/WG2 - -Metarchivo Gráficos De Computadora (CGM)\ -Modelo de referencia de gráficos de computadora (CGRM) - -ISO/IEC JTCI/SC24 - -Formato de intercambio de Dibujo (DXF) - -Autodesk Inc - -. - -Sistemas de Gráfico Kerrel(Gks) - -ISO/IEC JTCI/SC24 - -Especificación Inicial De Intercambio De Gráficos ( IGES) - -Oficina Nacional de Normas de EE.UU. (NBS), ANSI - -OpenGL - -Junta de Revisión de la Arquitectura OpenGL - -Sistema Gráfico Interactivo Jerárquico De Programador (PHIGS) - -ISO/IEC JTCI/SC24 - -Gráficos De Vector Escalables (SVG) - -W3C Graphics WG - -Materiales de audio, video y Composiciones musicales digitales basadas -en notas - -Formato De Archivo De Intercambio De Audio (AIFF) - -International MIDI Assoc/MIDI Manufactures Assoc. - -Codificación De Imágenes En Movimiento Y Audio Asociado Para Medios De -Almacenamiento Digital (MPEG-1 Audio) Codificación genérica de imágenes -en movimiento y audio asociado (MPEC-2 Audio/MP3) Codificación -audiovisual de muy baja tasa de bits (MPEG-4 Audio) - -ISO/IEC JTCI/SC29 WG11(grupo de expertos en imágenes en movimiento) - -Lenguaje de marcado extensible de voz (VoiceXML) - -Voice XML, Forum - -Formato de archivo de audio de forma de onda(WAVE) - -Microsoft, IBM - -Intercalación de audio y vídeo (AVI) - -Microsoft - -JPEG en movimiento (M-JPEC) - -Motion Joint Picture Engineers Group - -Codificación De Imágenes En Movimiento Y Audio Asociado Para Medios De -Almacenamiento Digital (MPEG-1) - -ISO/IEC JTCI/SC29 WG11 - -Codificación audiovisual de muy baja tasa de bits ( MPEG-4 - -ISO/IEC JTC/SC29 WG11 - -Lenguaje De Realidad Virtual(VRML) - -ISO/IEC JTCI/SC24 - -Generic Coding Of Moving Pictures And Associated Audio (MPEC-2) - -ITU-T, ISO/IEC JTCI/SC29 WG11 - -Hipermedia / Lenguaje de Estructuración Basado en Tiempo (HyTime)) - -ISO/IEC JTCI/SC34 - -Sistemas Digitales Audiovisuales genéricos (DAVIC) - -ISO/IEC SC29 DAVIC - -Codificación de Información Multimedia e Hipermedia (MHEG) - -ISO/IEC JTCI/SC29 WG12 - -QUICKTIME - -Apple Computers - -Ambiente de Presentación para los objetos multimedia (PREMO) - -ISO/IEC JTCI/SC24 - -Lenguaje De Integración Multimedia Sincronizado (SMIL) - -W3C Audio Visual Working Group - -XMF, Formato de música extensible SMF, archivo MIDI estándar RMID, MIDI -archivos basado en RIFF - -MIDI Asociation - -Metadatos - -Clasificación - -Identificador de Objetos Digitales(DOI) - -ANSI.NISO - -Ubicación Uniforme de Recursos (URL) Identificador Uniforme De -Recursos(URI) - -IETF - -Tecnología - -Dublin Core metadata para el descubrimiento de recursos - -OCLC, IRTF - -ISO 11179 : Especificación y Normalización de Elementos de Datos - -ISO/IEC JTCI/SC32 - -Catalogación Legible De Máquina (MARC) - -ISO TC46/SC4, IFLA, Library of Congress British Library - -Codificación de metadatos y estándar de transmisión - -Digital Library Federation - -ISO 15398 : Interfaz De Descripción De Contenido Multimedia (MPEC-7) - -ISO/IEC JTCI/SC29 WG11 - -ISO 21000: Infraestructura Multimedia - -ISO/IEC JTCI/SC29 WG11 - -Plataforma Para La Selección De Los Contenidos De Internet (PICS) - -W3C PICS Working Party - -Iniciativa De Archivos Abiertos (OAI) - -OAI - -Plataforma de descripción de recursos (RDF) - -W3C PICS Working Party - -XML, Intercambio de Metadatos (XMI) - -Object Management Group - -Conservación de datos - -Tecnología - -Formato De Intercambio De Archivo(AIF) - -ISO/IEC 9171-2 : 1990, ISO/IEC 11560 : 1992 ANSI X3. 1911991, ANSI/AITM -MS59-1996, ANSI/AIM TR25-1995 - -Metadatos De Almacén Común (CWM) - -OMG - -Criterios De Diseño Estándar Para Aplicaciones de Software de Gestión de -Documentos Electrónicos (RMA)\ -Imagen Electrónica - -Departamento de Defensa de Tarea de Gestión de Registros EE.UU. (RMTF) - -ISO.IEC JTCI, ANSI - -Descripción Archivística Codificada(EAD) - -LC, Society of American (ICA) - -Recuperación de información - -ANSI - -Registro Internacional De Archivo Estándar Para Instituciones, Personas -Y Familias (ISAAR) - -Consejo Internacional de Archivos(ICA) - -Modelo de requisitos para la gestión de los documentos electrónicos -(MoReq) - -Intercambio de datos entre administraciones (LAD) - -Micrográficos - -ISO TC 171, ANSI - -Modelo de Referencia para un Sistema de Información de Archivo -Abierto(OAIS) - -CCSDS, ISO TC20/SC13 - -Aplicaciones - -Servicio de aplicaciones - -Sistemas de Tratamiento de Mensajes X400 - -ISO JTC2 ITU-T Study Group 7/Study Group 1 - -Protocolo Telnet\ -Extensiones Multipropósito De Correo Internet(MIME)\ -Protocolo de transferencia de hipertexto(HTTP)\ -Protocolo de transferencia de archivos (FTP)\ -Protocolo De Control De Transmisión / Protocolo De Internet(TCP/IP)\ -Protocolo De Transferencia De La Red De Noticias(NNTP)\ -Protocolo Simple De Transferencia De Correo (SMTP) - -IETF - -Procesamiento de transacciones(TP) - -ISO/TEC JTC1 - -Transferencia de archivos. Acceso y gestión (FTAM) - -Búsqueda - -Servicio de directorio integrado de internet - -IETF Domain NAME Server Operator - -ISO 8777: Comandos Para La Búsqueda De Texto Interactivo - -ISO TC46/SC4 - -ANSI Z-39.50- Recuperación De La Información De Definición De Servicio -De Aplicación Y Especificación Del Protocolo - -ANSI, NISO - -Lenguaje De Marcado De Servicios De Directorio(DSMI) - -OASIS - -Protocolo ligero de acceso a directorios (LDAP)\ -Directorio WHOIS\ -Servicios de páginas blancas\ -Protocolo De Indexación Común(CIP)\ -Uso de Internet para directorios X.500 - -IETF - -Modelo de Referencia para un Sistemas de Información de Archivos -Abiertos(OAIS) - -CCSDS, ISO TC20/SC13 - -El directorio X.500 - -ISO/IEC JTC1/SO6, ITU-T Study Group 17 - -Intercambio de Documentos Electrónicos Genéricos(GEDI) - -ISO TC46/SC4 WG4 - -Préstamos Interbibliotecarios (ILL) - -ISO TC46/SC4 - -ISO 12083 : Operación electrónica de manuscritos y marcado - -ISO TC46/SC4 - -::: {#cont6 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Arquitectura de información {#arquitectura-de-información .azul .semibold .centrar .mayusculas .interlineado1} -::: - -+-----------------+-----------------+-----------------+-----------------+ -| Por tipo de | Por tipo de | Por tipo de | Por tipo de | -| soporte | documento | instituciones | servicios | -+-----------------+-----------------+-----------------+-----------------+ -| - Imagen: | - Inéditos: | - Institucion | - Referencia | -| jpg, tiff, | Documentos | es | virtual | -| png | escritos a | o programas | - Basados en | -| - Audio: mp3, | mano. | del | georreferen | -| wav | Documentos | Distrito. | ciación | -| - Video: avi, | escritos en | Por | - Tutoriales | -| mpg, wmv, | máquina de | ejemplo: | - Formación | -| mp4 | escribir | - Cinemat | - Expositivos | -| - Texto: doc, | - Monografías | eca | - Colaborativ | -| txt, html, | : | - Cámara | os | -| xml | Libros. | de | con la | -| - Libros | Folletos. | comerci | comunidad | -| electrónico | Proclamas. | o | - Redes | -| s: | - Imágenes | - Rock al | sociales | -| epub, mobi, | - Pintura | parque | - Chat | -| pdf, pdf/A, | s. | - Jardín | - Herramienta | -| otros de | Dibujos | Botánic | s | -| acuerdo con | . | o | para | -| el cuadro | Grabado | - Bibliotecas | compartir | -| No. 8 | s. | - Bibliotecas | información | -| | Iconogr | - Privada | RSS, | -| | afía | s | Delicius. | -| | - Fotogra | - Persona | - Escritorios | -| | fías: | les | virtuales | -| | persona | - Museos | - Podcast | -| | s, | - Privado | - Youtube | -| | lugares | s | - Reconocimie | -| | , | - Persona | nto | -| | objetos | les | Óptico de | -| | . | - Archivos | Caracteres- | -| | - Cartografía | - Público | OCR | -| | : | s | - Reconocimie | -| | Mapas | - Privado | nto | -| | antiguos, | s | Óptico de | -| | actuales, | - Establecimi | la | -| | láminas de | entos | Música-OM | -| | aspectos | comerciales | - Interfaces | -| | geográficos | - Editori | de búsqueda | -| | . | ales | y | -| | - Publicacion | - Librerí | visualizaci | -| | es | as | ón | -| | seriadas: | - Otros, | adaptados | -| | Revistas, | Ej.: | (usuarios | -| | Periódicos. | anticua | en | -| | . | rios. | condición | -| | - Videograbac | | de | -| | iones | | discapacida | -| | - Material | | d) | -| | sonoro y | | - Música en | -| | musical | | streaming | -| | - Entrevi | | - Readspeaker | -| | stas | | s | -| | o | | - Herramienta | -| | confere | | s | -| | ncias | | de | -| | en | | investigaci | -| | audio; | | ón: | -| | Música: | | Refworks, | -| | Partitu | | citación. | -| | ras | | - Incorporaci | -| | musical | | ón | -| | es. | | de | -| | Cualqui | | contenidos | -| | er | | protegidos | -| | otra | | por | -| | grabaci | | derechos de | -| | ón | | autor. | -| | sonora | | - Requeridos | -| | en el | | por | -| | context | | regulación | -| | o | | de MinTIC | -| | de la | | para | -| | ciudad. | | accesibilid | -| | - Documentos | | ad | -| | de archivo: | | y | -| | cualquier | | usabilidad. | -| | tipo de | | | -| | documento | | | -| | que por sus | | | -| | característ | | | -| | icas | | | -| | no | | | -| | corresponda | | | -| | a material | | | -| | bibliográfi | | | -| | co. | | | -| | - Obras | | | -| | digitales | | | -| | para | | | -| | dispositivo | | | -| | s | | | -| | portátiles | | | -| | - Libros | | | -| | electró | | | -| | nicos | | | -| | - Audioli | | | -| | bros | | | -| | - Podcast | | | -| | y | | | -| | videopo | | | -| | dcast | | | -| | - Libros | | | -| | hablado | | | -| | s | | | -| | (para | | | -| | inviden | | | -| | tes) | | | -+-----------------+-----------------+-----------------+-----------------+ - -\ -::: - -::: {#cont7 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Políticas recomendadas para una biblioteca digital {#políticas-recomendadas-para-una-biblioteca-digital .azul .semibold .centrar .mayusculas .interlineado1} - -En cuanto a las políticas del portal de la Biblioteca Digital, es -importante que sean definidas desde el comienzo del proceso. A -continuación, un modelo de aspectos que debe contener dicha política: - -Título, introducción, objetivos general y específicos - -Participantes del portal de la Biblioteca Digital - -Usuarios de la Biblioteca Digital - -Modelo de trabajo: Se sugiere el modelo de trabajo cooperativo -interinstitucional. Este modelo implica que cada institución -participante gestiona sus propios repositorios digitales y comparte los -contenidos que alimenten el portal a partir del protocolo OAI-PMH. - -Servicios del portal: Establecer los principios que rigen los servicios -y el tipo de servicios. Se sugiere que funcionen como un sistema que use -las tecnologías Web 2.0 para permitir el desarrollo de servicios de -interacción con sus usuarios, y que estén también adaptados a las -tecnologías móviles, entre otros. Se recomienda la inclusión de -estrategias con las redes sociales más comunes, las cuales también -ayudarán a la difusión de contenidos y promoción del portal en la Web. -Este tipo de situaciones exige el desarrollo de estrategias de mercadeo -digital, las cuales pueden estar en cabeza de cada institución -participante, bajo una línea formulada por la Biblioteca Digital. - -Desarrollo de colecciones: Explicación del tipo de contenidos y -colecciones en el portal, basado en la arquitectura del mismo. Los -recursos digitales incluidos en el portal, deben ser analizados, -descritos y organizados siguiendo los estándares y tendencias -internacionales vigentes en las actividades relacionadas con: La -descripción bibliográfica y puntos de acceso de autor y título, la -indización o análisis de contenido, la clasificación temática y los -metadatos e infraestructuras semánticas. Se sugiere una visualización de -contenidos a modo de facetas, ya que esto permite la navegación -organizada para los usuarios. - -Condiciones para la selección y adquisición del contenido digital: En el -modelo agregador, cada institución es responsable del acceso, -descripción y calidad de los documentos. Esta condición obliga a que la -arquitectura de trabajo sea distribuida entre los diferentes -repositorios de información y contenga únicamente un repositorio central -de metadatos cosechados a través de una herramienta tecnológica. De -igual forma, obliga a que se tengan reglas claras y un responsable en -cada institución. - -Definición de los estándares mínimos de metadatos, de objetos e -interoperabilidad: En esta fase es importante que se establezca como -condición que todo documento que contenga texto deberá pasar por el -proceso de Reconocimiento Óptico de Caracteres (OCR), para facilitar la -indexación de documentos en motores de búsqueda como Google, y la -búsqueda y recuperación de información. - -Definición del modelo de interoperabilidad: este debe contemplar el -modelo de soporte tecnológico, las condiciones de acceso al portal, y -otros factores tales como: - -- La conectividad entre el software de gestión de recursos digitales - propio y la herramienta central de cosecha y metabúsqueda del portal - de la Biblioteca Digital -- El acceso permanente a Internet. -- El control de acceso consecutivo por parte de los usuarios. -- El control de accesibilidad a las colecciones, y una URI permanente - para cada recurso. - -Almacenamiento y preservación digital: En el modelo agregador, cada -institución participante deberá garantizar la preservación digital de -los documentos o información aportada. En el modelo de producción será -la institución a cargo de la Biblioteca Digital quien sea responsable de -los contenidos, y en ambos modelos, responsable de la administración del -repositorio central de la Biblioteca Digital. - -Para permitir el acceso permanente a los objetos digitales, se deberá -asignar un identificador persistente a cada ítem de la colección, y a -cada parte de la misma que sea susceptible de ser recuperada. - -Definición del modelo de derechos de autor. - -Definición de indicadores y el modelo de análisis. -::: -::: - -::: {#cont8 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Políticas de propiedad intelectual {#políticas-de-propiedad-intelectual .azul .semibold .centrar .mayusculas .interlineado1} - -Este es uno de los temas de mayor cuidado en el desarrollo de una -biblioteca digital. Bien en la fase como agregador o productor, la -Biblioteca Digital debe sentar sus políticas frente a la propiedad de -los recursos para el uso y circulación de los contenidos digitales y, en -especial, contar con la tecnología para la correcta visualización de los -contenidos, previendo cualquier violación o mal uso de los mismos. - -La primera instancia a resolver, si se trata de publicar contenidos -protegidos por Derechos de Autor, es gestionar las respectivas licencias -bajo modelos que legitimasen el uso y circulación de los contenidos en -la biblioteca. Esta situación también la deberán contemplar todas las -entidades vinculadas con la biblioteca. Se recomienda la gestión de -derechos a perpetuidad y no limitados en el tiempo, ya que la gestión es -de mayor cuidado. - -Dado que en los metadatos de los objetos digitales es necesario poner el -tipo de licencia que éste tiene, a continuación, se relaciona una -descripción de las diferentes formas de licencias, basadas en los -conceptos de la licencia de Creative Commons. -::: - - ------------------------------------ ------------------------------------ - Autorizaciones de uso de recursos Licencias de uso - digitales - - SÍ uso comercial de la obra\ Obra en dominio público. Puede - SÍ modificación de la obra\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que la obra la obra, incluso para fines - se encuentra en dominio público comerciales, todo ello sin pedir - desde su concepción o ya han permiso, siempre y cuando se cite el - expirado los plazos de protección de autor y la fuente. Fuente: - la obra. Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\ Atribución. Puede copiar, modificar, - SÍ modificación de la obra adaptar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, todo ello sin - pedir permiso, siempre y cuando se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - NO uso comercial de la obra\ Atribución. Puede copiar, modificar, - SÍ modificación de la obra adaptar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, todo ello sin - pedir permiso, siempre y cuando se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\ Atribución - No derivadas. Puede - NO modificación de la obra copiar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, siempre y cuando - ésta no se modifique, y se cite el - autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\ Atribución - Compartir igual. Puede - SÍ modificación de la obra\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que las la obra, incluso para fines - obras derivadas deben tener la misma comerciales, siempre y cuando se - licencia. cite el autor y la fuente y se - licencien las obras derivadas bajo - las mismas condiciones de la obra - original. Fuente: Biblioteca Digital - de Bogotá, por ejemplo. - - NO uso comercial de la obra\ No comercial-Compartir igual. Puede - SÍ modificación de la obra\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que las la obra, siempre y cuando se haga - obras derivadas deben tener la misma sin fines comerciales, se cite el - licencia. autor y la fuente y las obras - derivadas se mantengan sin fines - comerciales y se licencien bajo las - mismas condiciones de la obra - original. Fuente: Biblioteca Digital - de Bogotá, por ejemplo. - - NO uso comercial de la obra\ No comercial-Sin obra derivada. - NO modificación de la obra\ Puede copiar, distribuir y comunicar - Si el titular de derechos además públicamente la obra, siempre y - hace mención explícita a que las cuando se haga sin fines - obras pueden ser copiadas. comerciales, no se modifique y se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - NO uso comercial de la obra\ Todos los derechos reservados. Está - NO modificación de la obra\ prohibido todo tipo de reproducción - Si la obra no tiene ninguna nota de sin autorización del autor o de los - derecho de autor, también aplica derechohabientes. - esta licencia. - ------------------------------------ ------------------------------------ -::: - -::: {#cont9 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Infraestructura tecnológica y selección de plataforma {#infraestructura-tecnológica-y-selección-de-plataforma .azul .semibold .centrar .mayusculas .interlineado1} - -En relación con la selección de la infraestructura tecnológica, durante -la fase de operaciones se deberá realizar la selección de las -plataformas necesarias teniendo en cuenta: plataforma para gestión -digital, servidores de búsqueda, servidores para alojamiento, capacidad -de almacenamiento, soporte y sostenibilidad tecnológica. - -Las decisiones para la selección de la plataforma deberán partir del -alcance establecido para la Biblioteca Digital. La metodología más -recomendada es la de comparación a través de elementos clave cuyo -resultado facilite la decisión para obtener la mejor alternativa -tecnológica. Actualmente existen diferentes opciones de tecnologías de -código abierto o código propietario, a continuación, se relacionan las -más utilizadas: -::: - - -------------- ---------------------------------------------------------- ------------------------------------------------------------------------- - Código abierto Propietario - - Gestores de [Omeka](http://omeka.org){.gris .subrayado}\ [CONTENTdm](https://www.oclc.org/es-americalatina/contentdm.html){.gris - objetos [Fedora](http://www.fedora.info/){.gris .subrayado}\ .subrayado}\ - digitales [Dspace](http://www.dspace.org/){.gris .subrayado}\ [Alma-Primo](http://www.exlibrisgroup.com/){.gris .subrayado}\ - [Greenstone](http://www.greenstone.org/){.gris .subrayado} [Portfolio](http://www.sirsidynix.com/products/portfolio){.gris - .subrayado}\ - - Servidores de [ElasticSearch](http://solr-vs-elasticsearch.com/){.gris [Autonomy](http://www.autonomy.com){.gris .subrayado}\ - búsqueda .subrayado}\ - [Solr Apache Lucene](http://lucene.apache.org/solr/){.gris - .subrayado}\ - -------------- ---------------------------------------------------------- ------------------------------------------------------------------------- - -::: {.ajuste .descripcion .ancho1} -Los principales elementos de evaluación a realizar para las plataformas -de gestión de objetos digitales son: -::: - -::: {.padding4} - ------------------------------------ ------------------------------------ - Permite cargar los objetos digitales Despliegue de íconos para cada - uno a uno. tipología de objeto digital. - - Permite cargar los objetos digitales Administración de cambios de formato - en forma masiva y automática.¿Qué por obsolescencia. - cantidad? - - Permite al usuario externo la carga Comunicación con todos los módulos - de objetos digitales. que hacen parte de la plataforma. - - Existe integración de la gestión de Comunicación con el módulo de - recursos digitales con la de catalogación al registrar un recurso - recursos bibliográficos. digital. - - Parametrización de metadatos. Recuperación de información a través - de motores de búsqueda. - - Permite personalizar plantillas para Interfaz gráfica con posibilidades - la captura de metadatos. de previsualización de miniaturas - para exploración de las colecciones - digitales. - - Permite uso de RDF para descripción Conformación de colecciones - de metadatos. digitales. - - Esquema de metadatos MODS (Metadata Interfaz gráfica parametrizable. - Encoding Description Schema). - - Esquema de metadatos METS (Metadata Presentación automática de las - encoding and transmission standard). novedades digitales. - - Esquema de metadatos PREMIS para Gestor abierto para poderle - preservación digital. desarrollo de módulos. - - Protocolo OAI-PMH Posibilidad de línea de tiempo en la - interfaz gráfica. - - Alojar los objetos en un file system Posibilidad de georreferenciación en - en el servidor central con una URL los recursos digitales. - persistente. - - Parametrización de visibilidad de Posibilidad de búsqueda por rangos - los objetos digitales a los espaciales en la interfaz gráfica. - usuarios. - - Crear automáticamente las miniaturas Herramienta en línea para - para ser visualizadas por medio del adquisición de reproducciones - OPAC Web. digitales. - - Indexar automáticamente el texto Herramienta en línea para trámite de - completo que contiene el objeto derechos de reproducción. - digital para búsquedas de usuario. - - Permite hacer búsqueda y Gestor de exposiciones o galerías - recuperación por palabras (minería virtuales. - de texto) sobre el objeto si este - posee OCR. - - Importar/exportar objetos digitales Filtros de visualización - en bloque al ILS parametrizados en el visor de - recursos digitales. Ayudas a - usuarios con discapacidad visual y - auditiva. - - Recuperar libros y objetos digitales Convertidor HTML. - en la misma interfaz de búsqueda - OPAC Web por medio de una búsqueda - básica, avanzada y experta. - - Soportar objetos de audio/vídeo. Versión para dispositivos móviles. - - Contar con un visor propio para los Brinda la opción de calificar el - diferentes tipos de objetos material (Ranking). - digitales que posea zoom múltiple. - - Previsualización de inicio de 1 a 10 Permite enlazar registros - imágenes como mínimo en la descarga bibliográficos con gestores de - del recurso. referencia. - - Visor con múltiples ventanas de Permite enlazar registros - exploración. Mínimo 4. bibliográficos con redes sociales. - - Actualizador automático de las - estadísticas en cada colección - digital. - ------------------------------------ ------------------------------------ - - -# ¿Con qué aliados se puede hacer? - - - -::: {.anchopan .prueba .bloque .centrar .sombra} -::: {#inicio .flex .flexceh .titulo .ajuste .azulf} -# ¿CON QUÉ ALIADOS SE PUEDE HACER? {#con-qué-aliados-se-puede-hacer .tituloi} -::: - -::: {.flex .flexceh .ffinal} -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\. Volar y tejer la red: actores e instituciones claves para el -funcionamiento de la Biblioteca Digital de Bogotá - -2\. Servicios y proyectos digitales relevantes para la Biblioteca Digital -de Bogotá -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Volar y tejer la red: actores e instituciones claves para el funcionamiento de la Biblioteca Digital de Bogotá {#volar-y-tejer-la-red-actores-e-instituciones-claves-para-el-funcionamiento-de-la-biblioteca-digital-de-bogotá .azul .semibold .mayusculas .interlineado1} - -La BDB no podría funcionar adecuadamente sin su alianza y relación con -otros actores e instituciones de la ciudad y la nación. La justificación -de ello es muy sencilla: existen numerosas entidades que están -implicadas en el mejoramiento de la lectura y la escritura, que tienen -políticas, planes y acciones concretas en el campo, que han hecho y -continúan haciendo importantes esfuerzos para cumplir este propósito -nacional y distrital, que tienen inversiones humanas, económicas y -tecnológicas significativas. Por eso es decisivo conocer su existencia, -analizar sus objetivos y programas para que la BDB pueda priorizar sus -verdaderos campos de intervención que no signifiquen esfuerzos -ineficientes y desarticulados. Probablemente sea su naturaleza digital -la que determine su naturaleza, sus límites como también el orden de sus -alianzas con los otros actores de la lectura y la escritura en la ciudad -y en el país. - -Las relaciones pueden ser de dos clases: temáticas, es decir, -diferenciadas por campos, o áreas de intervención e institucionales, -determinadas por su naturaleza institucional. - -Sin ánimo de tener un inventario exhaustivo (que se deberá ir ampliando -y precisando), podrían estar las siguientes: - -- Ministerio de Cultura -- Ministerio de Educación -- Ministerio de Tecnologías de la Información y la Comunicación - -Los tres Ministerios mencionados son fundamentales puesto que -desarrollan planes de lectura y escritura siendo las instancias máximas -en su definición y gestión, llevan a cabo programas de promoción de -lectura, trabajan con mediadores, tienen inversiones en el área, -promueven investigaciones y evaluaciones y apoyan las bibliotecas -públicas, escolares y comunitarias en toda la nación. El Ministerio de -Tecnologías de la Información y la Comunicación ha participado en los -estudios nacionales sobre lectura, tiene proyectos destacados y -relacionados con la BDB como los Vive Digital y le da un papel destacado -a la apropiación social de la ciencia y el desarrollo de la -infraestructura digital en la ciudad y el país. - -- Gobernación de Cundinamarca -- Secretaría de Cultura, Recreación y Deportes de Bogotá -- Secretaría de Educación de Bogotá -- Alta Consejería de las TICs de Bogotá -- Comisión de Regulación de las Comunicaciones -- IDARTES - -Las Secretarías de Educación y Cultura son actores centrales como -organismos rectores de cada uno de sus sectores, promotores de planes de -lectura y escritura y en el caso de la Secretaría de Cultura garantizan -la dirección y funcionamiento de la BDB. El IDARTES es una institución -distrital importante para la BDB por sus diferentes gerencias de las -artes, la promoción de colectivos como los Clanes y el desarrollo de la -línea estratégica de "Artes, cultura científica, tecnologías y ciudad". - -Además del MinTICs es central para la BDB su relación con la Alta -Consejería de TICs de Bogotá que traza la política pública distrital en -este tema, desarrolla programas relacionados con la presencia web en las -entidades del Distrito, la conectividad, la participación de la -ciudadanía a través de las TICs, y es un mediador fundamental de la -relación de la lectura con la ciudad. - -- Red de Bibliotecas Públicas de Bogotá -- Fundalectura -- Facultades de Educación y de estudios de lenguaje de universidades - de Bogotá -- Biblioteca Nacional de Colombia -- Biblioteca virtual de la Luis Ángel Arango - -La Biblioteca Nacional tiene funciones preponderantes en el campo de las -bibliotecas públicas y ha llevado a cabo importantes acciones en la -infraestructura digital, las colecciones interactivas y la formación de -bibliotecarios, entre otros temas. Tanto la Biblioteca Nacional como -otras bibliotecas de la ciudad y del país tienen bibliotecas digitales -con las que debe interactuar la BDB en términos de metodologías, -programas, colecciones, trabajo con los lectores, sistemas de -catalogación y préstamo, etc. - -- Colciencias -- Centro ÁTICO Pontificia Universidad Javeriana -- Tadeo Lab -- Maloka -- Asociación para el Avance de la Ciencia (ACAC) - -La Asociación para el Avance de la Ciencia (ACAC), el Observatorio -Colombiano de Ciencia y Tecnología y la Corporación Colombia Digital -(CCD), son tres entidades privadas que pueden convertirse en aliadas de -la BDB. La primera tiene una larga y fructífera experiencia en el -acercamiento de la ciencia a los ciudadanos y en los procesos de -apropiación, el segundo contribuye sobre todo en la sistematización y -análisis de indicadores de la ciencia y la tecnología y la Corporación -Colombia Digital apoya el desarrollo digital de entidades, estudia las -relaciones entre políticas TIC y gobierno y hace seguimiento a la -incidencia de las tecnologías en la calidad de vida. - -- Observatorio Colombiano de Ciencia y Tecnología -- Corporación Colombia Digital (CCD) -- Observatorio Colombiano de Innovación Educativa con uso de TIC. - Universidad del Valle. Centro de Innovación Educativa Regional CIER - Sur -- Asociación Colombiana de Instituciones de Educación Superior - tecnológica ACIET -- Colombia Aprende -- Red Nacional Académica de Tecnología Avanzada. RENATA -- Red Universitaria de Alta Velocidad (Ruav) -- Red Universitaria Mutis -- Sistema Nacional de Ciencia, Tecnología e Innovación, SNCTI - -Las universidades son uno de los interlocutores fundamentales para la -BDB, sobre todo en sus centros de innovación y tecnologías, sus -facultades de educación y sus instancias de estudios de la lectura y la -escritura. Se están extendiendo en ellas los centros de escritura, con -objetivos de formación de profesores y estudiantes, que pueden ser de -gran provecho para la BDB. En algunas universidades se han creado -laboratorios de innovación y tecnologías para la formación, -investigación y extensión de las artes, la educación y el diseño con los -que resulta muy conveniente establecer alianzas. Entre ellos se pueden -destacar el Centro ÁTICO de la Pontificia Universidad Javeriana, -TadeoLab de la Universidad de Bogotá Jorge Tadeo Lozano, la -Especialización en Humanidades Digitales de la Universidad de los Andes, -además de la Universidad Nacional, la Universidad Pedagógica Nacional y -otras universidades. - -- Festival de la Imagen de la Universidad de Caldas -- Cinemateca Distrital -- Proimágenes -- Cámara de Comercio de Bogotá -- SENA -- Mesa de Audiovisuales de Bogotá -- Planetario Distrital -- Patrimonio Fílmico - -La Cinemateca Distrital y el Planetario son dos entidades distritales -que pueden tener sinergias con la BDB. El desarrollo de la primera -permitirá ampliar la creación de las imágenes a nuevas alternativas que -tienen que ver con el mundo digital y el segundo es un lugar de -apropiación ciudadana de la ciencia y un polo de la creación en la -ciudad. - -- Centro de Innovación Pública Digital -- Computadores para Educar -- Nodo Nacional de Innovación Social -- Proyecto Aulas Amigas - -Computadores para Educar se define como un programa gubernamental que -contribuye a la generación de oportunidades de desarrollo mediante el -acceso, apropiación y aprovechamiento de las TICs en las sedes -educativas oficiales. -::: -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Servicios y proyectos digitales relevantes para la Biblioteca Digital de Bogotá {#servicios-y-proyectos-digitales-relevantes-para-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas .interlineado1} -::: - - ---------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------- - Nombre de la institución Página web Tipo de servicio a - conectar - - Biblioteca Digital de la [bibliotecadigital.ccb.org.co](http://bibliotecadigital.ccb.org.co/){.gris .subrayado} Producción documental - Cámara de Comercio de Bogotá de la CCB - - Biblioteca Virtual Bogotá [www.bogotaemprende.com](http://www.bogotaemprende.com/biblioteca/cartillas.html){.gris .subrayado} Servicio de la Cámara - Emprende de Comercio de - Bogotá. Acceso a - recursos en .pdf - - Centro de Documentación de [www.ambientebogota.gov.co](http://www.ambientebogota.gov.co/web/sda/publicaciones-sda){.gris .subrayado} Biblioteca Virtual: - la Secretaría Distrital de acceso a - Ambiente. publicaciones - digitales. - - Observatorio Ambiental de [oab.ambientebogota.gov.co](http://oab.ambientebogota.gov.co/404.php){.gris .subrayado} Publicaciones de - Bogotá investigaciones y - trabajos técnicos - - Centro de Documentación del [www.idrd.gov.co](http://www.idrd.gov.co/sitio/idrd/?q=node/509){.gris .subrayado} Base de datos (Excel) - Instituto Distrital de de 2.217 registros - Recreación y Deporte temáticos. - - Centro de Documentación y [www.educacionbogota.edu.co](http://www.educacionbogota.edu.co/es/temas-estrategicos/mas-de-600-publicaciones-digitales-disponibles-en-el-centro-de-documentacion-sed){.gris 673 documentos del - Memoria SED de la Secretaría .subrayado} repositorio - de Educación del Distrito. institucional - representados en 15 - colecciones - temáticas. - - Centro de Documentación en [www.institutodeestudiosurbanos.info](http://www.institutodeestudiosurbanos.info/centrodocumentacion/centro-de-documentacion){.gris .subrayado} Producción académica - Políticas Públicas del especializada en - Distrito Capital estudios urbanos y - regionales de - Colombia. - Observatorios en - Engativá, Chapinero, - Teusaquillo, - Tunjuelito. - - Centro de Memoria, [centromemoria.gov.co](http://centromemoria.gov.co/){.gris .subrayado} Centro de - Reconciliación y Paz Documentación, - Publicaciones, aula - virtual, - exposiciones, - comunidades - Afrocolombianas y - Memoria, etc. - - Biblioteca Secretaría de [www.sdp.gov.co](http://www.sdp.gov.co/portal/page/portal/PortalSDP/ServiciosTramites/%0AGestion_Documental/Biblioteca%0A){.gris .subrayado} Préstamo - Planeación Distrital interbibliotecario - - Centro de Documentación del [documentacion.ideam.gov.co](http://documentacion.ideam.gov.co/){.gris .subrayado} Catálogo y Biblioteca - IDEAM virtual - - CINEP [www.cinep.org.co](http://www.cinep.org.co/Home2/publicacion/biblioteca-sede-cinep-ppp.html){.gris .subrayado} Catálogo, préstamo - interbibliotecario - - Biblioteca ambiental de la [www.observatorioambientalcar.co](http://www.observatorioambientalcar.co/biblioteca-ambiental.php){.gris .subrayado} Recursos - CAR - - Biblioteca Digital [repositorio.artesaniasdecolombia.com.co](http://repositorio.artesaniasdecolombia.com.co/){.gris .subrayado} Acceso al repositorio - institucional de Artesanías - de Colombia - - Colombia Digital [colombiadigital.net](https://colombiadigital.net/herramientas/nuestras-publicaciones.html){.gris .subrayado} Publicaciones sobre - nuevas tecnologías - - Cinemateca Distrital [www.cinematecadistrital.gov.co](http://www.cinematecadistrital.gov.co/mediateca){.gris .subrayado} Acceso a catálogo - Catálogo BECMA y - Catálogo BIBLIOCI. - - Rock al Parque [www.rockalparque.gov.co](http://www.rockalparque.gov.co/){.gris .subrayado} Componente académico - de la actividad. - Referenciar la página - - Canal Capital y emisoras de [www.canalcapital.gov.co](http://www.canalcapital.gov.co/senal-en-vivo){.gris .subrayado} Referenciar las - la ciudad páginas de medios de - comunicación de la - ciudad. - - Emisoras universitarias - ---------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------- -::: - - - -# Taller Intersectorial para Conceptualizar la Biblioteca Digital de Bogotá - -# TALLER INTERSECTORIAL PARA CONCEPTUALIZAR LA BIBLIOTECA DIGITAL DE BOGOTÁ {#taller-intersectorial-para-conceptualizar-la-biblioteca-digital-de-bogotá .tituloi} -::: - -::: {.imagencontenida .imgfondo5} -::: - -Taller intersectorial para conceptualizar la biblioteca digital de -Bogotá - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### DESCRIPCIÓN DEL TALLER {#descripción-del-taller .azul .semibold .mayusculas} - -La descentralización y la articulación de un proyecto de esta naturaleza -depende de factores tecnológicos, sin duda, pero también depende de -factores institucionales y de la voluntad de individuos. En ese sentido -clásico, una biblioteca digital es un núcleo que conecta y pone en -diálogo diversos repositorios de información estructurada. - -Una biblioteca digital en un espacio de acceso a conocimiento en sus -múltiples manifestaciones: sean textos, libros, revistas, videos, -archivos sonoros, e incluso videojuegos y software, reconociendo la -multiplicidad de maneras como se construye el conocimiento y como se -manifiesta la cultura hoy en día. En ese sentido, una biblioteca digital -debe dar cuenta de todo el rango de expresión humana, eliminando -barreras conceptuales tradicionales que separan a las personas y las -instituciones, a la alta cultura de la cultura popular. - -### ASISTENTES {#asistentes .azul .semibold .mayusculas} - -Biblored, Secretaría de Cultura, Recreación y Deporte, Secretaría de -Educación, Centro de Memoria Histórica, Universidad de los Andes, -Archivo Distrital de Bogotá, Biblioteca Luis Ángel Arango, Red de -Bibliotecas del Banco de la República, Red de Humanidades Digitales, -Alta Consejería TIC de Bogotá, Museo del Oro, Oficina de Apropiación y -Tecnología de la Secretaría de Educación de Bogotá -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -~[❝]{.comilla .cafe}~La biblioteca digital es "una herramienta que ocupa -el centro de la actividad intelectual y que no tiene fronteras o -barreras lógicas, conceptuales, físicas o temporales con respecto a la -información\".~[❞]{.comilla .cafe}~.\ -[DELOS. Citado en "Anexo 1: Hacia una biblioteca pública digital".]{.pie -.bloque} -::: -::: -::: - -::: {.imagencontenida .imgfondo6} -::: - -Taller intersectorial para conceptualizar la biblioteca digital de -Bogotá - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Conclusiones {#conclusiones .azul .semibold .centrar .mayusculas} - -~[»]{.azul .tamano1}~El entorno digital no solo permite, sino que exige -el trabajo en redes y a través de alianzas. Estas son favorables no solo -a la hora de agregar contenidos y construir colecciones, sino para -llegarle a comunidades locales o remotas, disminuir costos al hacer -compras o desarrollar tecnologías conjuntas, escalar servicios y dictar -(o modificar) políticas acordes a las nuevas lógicas y prácticas de una -sociedad interconectada. - -~[»]{.azul .tamano1}~El uso de las nuevas tecnologías de información en -la bibliotecas favorece y fomenta nuevos modelos de trabajo en los que -prevalecen la interdisciplinariedad y la colaboración. Con ellos se -nutren, crecen y cambian los servicios, y se nutren, crecen y cambian -los conocimientos y habilidades de los empleados. - -~[»]{.azul .tamano1}~Los ambientes colaborativos, que surgen al -aprovechar las TIC para fomentar la participación ciudadana en la -creación de servicios y contenidos, hacen que las funciones de empleados -y bibliotecarios cambien: de funcionarios cuyas tareas radican en suplir -la demanda (poner a disposición colecciones y ofrecer programaciones), -se pasa a la co-creación con el público, de la distribución de -contenidos acabados a la mediación de diversas expresiones culturales. -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 1\ -\"Culturizarte\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital de Bogotá que ayude a las personas a - programar y a conocer la agenda cultural de la ciudad, que trace las - prácticas culturales de la ciudad en toda su diversidad -- Una aplicación que pueda generar recorridos culturales para el - usuario en distintos escenarios, como restaurantes, parques y - exposiciones de arte. -- Un sistema que se alimente de las prácticas culturales en la ciudad - por parte de distintos ciudadanos -::: - -::: {.ancho2 .flex .flexcev .flexceh} -[![](images/grupo1.jpg){#img1 .ancho1 -.imgal}](images/grupo1.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 2\ -\"Micelio\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -Una biblioteca digital donde los ciudadanos puedan encontrar recursos de -información generales y producción de contenidos locales tanto para -usuarios del área rural como del área metropolitana. - -Se plantea una hoja de ruta para su desarrollo que contempla los -siguientes pasos: - -- Definición de contenidos, formatos y materiales que busca la - ciudadanía -- Generación de redes para el acceso y la producción de contenidos con - distintas entidades del distrito -- Asesoría para la gestión, creación y producción de contenidos - digitales para otras instituciones -- Desarrollo de herramientas tecnológicas para la publicación de - material digital por parte de la ciudadanía -::: - -::: {.ancho2 .flexv .flexcev .flexceh} -[![](images/grupo2-1.JPG){#img1 .ancho1 -.imgal}](images/grupo2-1.JPG){.example-image-link} -[![](images/grupo2.JPG){#img1 .ancho1 -.imgal}](images/grupo2.JPG){.example-image-link .margenes2} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 3\ -"El sistema local" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital debe estar compuesta por los siguientes - cuatro elementos fundamentales: una comunidad compuesta por - individuos y grupos, un depósito estructurado de información, - actividades transversales que los vinculan y mediadores. -- El entorno digital o virtual es un espacio propicio para potenciar - todas las iniciativas locales, para que puedan convertirse en - motores para el fortalecimiento de la identidad local. -- Este enfoque local debe fomentar la participación política y la - veeduría ciudadana así como potenciar los liderazgos locales que ya - existen en la ciudad. Así, cada grupo local podría construir su - propia biblioteca digital o "depósitos de información" para sus - propios fines con el apoyo y guía de los mediadores. -- Es importante que los usuarios puedan comentar y construir vínculos - y conversaciones en torno a los depósitos de información. -- Se deben romper las divisiones tradicionales de Museo, Archivo y - Biblioteca mediante la articulación de los catálogos de estas - entidades distritales a través de un metacatálogo. -- Hacer funcionar el servicio de referencia de las bibliotecas a - través de un chat virtual 24/7 -- Generar un mapa de proyectos locales para fomentar, con la ayuda de - la plataforma, la colaboración entre distintas comunidades. -::: - -::: {.ancho2 .flex .margen4 .flexceh} -[![](images/grupo3.jpg){#img1 .ancho1 -.imgal}](images/grupo3.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 4\ -\"Dream Machine\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Un gran repositorio de contenidos con alto contenido de - personalización pertinentes para el contexto bogotano, no - necesariamente sobre Bogotá. La personalización por medio de - herramientas tecnológicas supliría el rol del mediador. -- Un indexador de información de tal forma que no se aloje en la - biblioteca digital sino que la llame a través de un protocolo - estructurado y organizado. -- Es necesario iniciar con una etapa de planeación para la - estructuración de la información que contendría la biblioteca - digital, vinculando en esta etapa a todas las entidades del distrito - que producen contenidos pertinentes tales como Cinemateca, - Planetario, Biblored, Museo de Bogotá. Esta estructura de - información es fundamental para integrar la participación de los - ciudadanos. -- Construir un algoritmo eficaz de personalización que le permita a - los usuarios tener información en tiempo real sin necesariamente - estar en un espacio físico. Que la biblioteca digital se le - "atraviese" al usuario en el espacio urbano, de modo que la - información haga parte de la vida del usuario. También promover la - participación de los ciudadanos como creadores y como curadores de - la información ya existente. -- Buscar alianzas con las empresas de telefonía móvil con el fin de - proporcionar a los usuarios facilidad de acceso a la red sin que - impacte en su consumo de datos. -::: - -::: {.ancho2 .flex .flexceh .margen4} -[![](images/grupo4.jpg){#img1 .ancho1 -.imgal}](images/grupo4.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 5\ -¿Qué hay pa' hacer? - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital que propicie una cartografía participativa - retroalimentada por casas de la cultura, fundaciones y juntas de - acción comunal. -- Un espacio que relacione los eventos con los contenidos físicos o - virtuales de las bibliotecas de la ciudad para relacionar la - cotidianidad cultural de la ciudad con la información disponible en - las bibliotecas. -- El plan de trabajo se estructura desde instituciones hasta las - comunidades para construir una comunidad que genere una cartografía - participativa. Se debe apoyar este trabajo en la oficina de gestión - territorial de Biblored. -- La biblioteca digital tiene como intención generar nodos dentro de - una red de referentes virtuales para funcionar. -::: - -::: {.ancho2 .flexv .flexcev .flexceh} -[![](images/grupo5.jpg){#img1 .ancho1 -.imgal}](images/grupo5.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 6\ -"La biblioteca del caos" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -En busca de la definición de esa biblioteca digital se exploraron -metáforas o espacios análogos como: un restaurante con buffet -autoservicio, un parque temático de diversiones, una librería o un -espacio lúdico. - -Más allá de crear un espacio de consulta de información, esta biblioteca -digital busca generar una experiencia que genere una comunidad de -personas afines con el fin de generar un centro cultural que exceda la -definición clásica de la biblioteca - -Aliados importantes y sus aportes: - -- Museo del Oro: aportaría experiencia interactiva así como su - experiencia en la formación de "animadores culturales" como un nuevo - tipo de bibliotecario. -- Biblored aporta el territorio, memoria local, información local y, - principalmente, la red que ya tiene construida y las comunidades que - ya están vinculadas a las bibliotecas. -- Uniandes aportaría conceptos de cultura digital, pensamiento en - torno al nuevo concepto de la biblioteca y su transformación en el - tiempo, y la vinculación de la maestría en humanidades de la - Universidad. - -Es importante tener en cuenta el tema de los derechos de autor antes de -pensar en la estructuración de contenidos. - -También se debe contemplar el uso de software de uso libre para la -biblioteca digital de Bogotá. -::: - -::: {.ancho2 .flexceh .margen4} -[![](images/grupo6.jpg){#img1 .ancho1 -.imgal}](images/grupo6.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -Conclusiones de la jornada a cargo de Ana Roda, directora de Lectura y -BIbliotecas de la Secretaría de Cultura de Bogotá - -Palabras de cierre del taller intersectorial convocado el 20 de -diciembre de 2016 por la Dirección de Bibliotecas de la Secretaría de -Cultura de Bogotá para avanzar hacia la construcción de una futura -biblioteca digital para la ciudad de Bogotá. - - -# Créditos - -# CRÉDITOS {#créditos .tituloi} -::: - -::: {.ajuste .centrar .gris .ancho4 .creditos} -[Secretaria de Cultura, Recreación y Deporte]{.semibold}\ -María Claudia López - -[Directora de Lectura y Bibliotecas]{.semibold}\ -Ana Roda Fornaguera - -[Investigación "Pasos para una futura\ -Biblioteca Digital de Bogota", 2016]{.semibold}\ -Germán Rey\ -Sandra Angulo\ -María Alejandra Pautassi\ -Juan Saab\ -Andrés Echeverry -- [Manuvo Colombia](http://www.manuvo.com){.gris}\ -Catalina Holguín -- [Manuvo Colombia](http://www.manuvo.com){.gris} - -\ -\ - -[Taller intersectorial -- 20 diciembre 2016]{.semibold} - -[Líder y facilitador]{.semibold}\ -Elkin Garavito -- [Sikuani.net](http://sikuani.net/#){.gris} - -[Asistentes]{.semibold}\ -Catalina Holguín -- [Manuvo Colombia](http://www.manuvo.com){.gris}\ -Andrés Echeverry -- [Manuvo Colombia](http://www.manuvo.com){.gris} - -[Logística]{.semibold}\ -Gaelle Alcántara - -[Entidades asistentes]{.semibold}\ -Biblored, Secretaría de Cultura, Recreación y Deporte, Secretaría de -Educación, Centro de Memoria Histórica, Universidad de los Andes, -Archivo Distrital de Bogotá, Biblioteca Luis Ángel Arango, Red de -Bibliotecas del Banco de la República, Red de Humanidades Digitales, -Alta Consejería TIC de Bogotá, Museo del Oro, Oficina de Apropiación y -Tecnología de la Secretaría de Educación de Bogotá - - DELETED Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.ston Index: Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.ston ================================================================== --- Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.ston +++ Artefactos/BibliotecaDigitalBogota/pasos-para-bidibog.ston @@ -1,4959 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : '%metadata Pasos para una futura Biblioteca Digital de Bogotá', - #body : '| metadata | - -{ \'title\' -> \'Pasos para una futura Biblioteca Digital de Bogotá\'. -\'author\' -> \'Germán Rey\'. -\'pandocOptions\' -> \' --pdf-engine=lualatex \'. -\'originalUrl\' -> \'http://www.culturarecreacionydeporte.gov.co/biblioteca/\'. -\'license\' -> #(\'CC\' \'By\' \'NC\' \'SA\') } asOrderedDictionary.', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : 'Introducción', - #body : '# PASOS PARA UNA FUTURA BIBLIOTECA DIGITAL DE BOGOTÁ {#pasos-para-una-futura-biblioteca-digital-de-bogotá .tituloi} - -Foto Mario Carvajal - -Esta página web contiene el resultado del estudio realizado para la -conceptualización y acciones para la implementación de la Biblioteca -Digital de Bogotá a finales de 2016, las investigaciones anteriores, el -resultado del taller participativo intersectorial realizado el 20 de -diciembre de 2016. Todo esto con el ánimo de ampliar la discusión y -crear las redes necesarias para el desarrollo del proyecto. - -### Documentos de insumo {#documentos-de-insumo .mayusculas .gris} - -[![](images/doc1.png){.icon}](descargables/Plan%20de%20lectura_100217.pdf){.flexv .flexcev .padding1 .alicen .semibold .tamano2} -Plan Distrital de Lectura y Escritura “Leer es volar” - -[![](images/doc2.png){.icon}](descargables/UPN%20Lineamientos%20Plan%20Estrategico%202014-2018.pdf){.flexv.flexcev .padding1 .alicen .semibold .tamano2} -Lineamientos para el plan estratégico 2014 – 2018 - -[![](images/doc3.png){.icon}](descargables/Relatoria%20mesas%20construccion%20Plan%20de%20Lectura%202016.pdf){.flexv .flexcev .padding1 .alicen .semibold .tamano2} -Relatoría mesas para la construcción del plan de lectura y escritura - -### Documentos producidos por el equipo investigador {#documentos-producidos-por-el-equipo-investigador .mayusculas .gris} - -[![](images/doc4.png){.icon}](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf){.flexv .flexcev .padding1 .alicen .semibold .tamano2} -Bibliotecas digitales, conceptos, tendencias, alianzas y políticas - -[![](images/doc5.png){.icon}](descargables/Analisis%20internacional_Ma%20Alejandra%20Pautassi.pdf){.flexv .flexcev .padding1 .alicen .semibold .tamano2} -Análisis bibliotecas digitales internacionales - -[![](images/doc6.png){.icon}](descargables/Analisis%20nacional%20y%20de%20tecnologia_Sandra%20Angulo%20.pdf){.flexv -.flexcev .padding1 .alicen .semibold .tamano2} -Análisis nacional y de tecnología - -### Algunas definiciones de biblioteca digital {#algunas-definiciones-de-biblioteca-digital .semibold} - -- Una biblioteca digital es un proyecto público, de acceso al - conocimiento, donde actores con intereses similares actúan - des-centralizadamente en un proyecto con fines comunes y - articulados. -- La descentralización y la articulación de un proyecto de esta - naturaleza depende de factores tecnológicos, sin duda, pero también - depende de factores institucionales y de la voluntad de individuos. - En ese sentido clásico, una biblioteca digital es un núcleo que - conecta y pone en dialogo diversos repositorios de información - estructurada. -- Una biblioteca digital en un espacio de acceso a conocimiento en sus - múltiples manifestaciones: textos, libros, revistas, videos, - archivos sonoros, e incluso videojuegos y software, reconociendo la - multiplicidad de maneras como se construye el conocimiento y como se - manifiesta la cultura hoy en día. En ese sentido, una biblioteca - digital debe dar cuenta de todo el rango de expresión humana, - eliminando barreras conceptuales tradicionales que separan a las - personas y las instituciones, a la alta cultura de la cultura - popular. -- Una biblioteca digital debe dar cuenta de la información existente - en el dominio público, de la que se produce en el entorno académico, - de la producida por el sector editorial, audiovisual, y musical. -- Una biblioteca digital también es un espacio de intercambio de - información y de conocimiento construido de arriba para abajo y de - abajo para arriba. -- Una biblioteca digital puede ser una oportunidad de extender el - acceso a la lectura, al conocimiento y al entretenimiento, ampliando - las fronteras de lo público también al entorno digital. -- Una biblioteca digital puede ser una oportunidad para ampliar - programas de formación y educación a distancia, para multiplicar - acciones locales de recuperación de memoria y patrimonio, para - extender el impacto de proyectos que por su naturaleza local carecen - de divulgación. -- Una biblioteca digital es construida por seres humanos para seres - humanos, y por tanto, su vitalidad y relevancia depende de cómo esta - se articule con programas, acciones y proyectos que ocurren en el - mundo real. -- Una biblioteca digital se nutre de prácticas de trabajo del sector - tecnológico y de nuevos enfoques académicos, convoca fuerzas - laborales más amplias, diversas y exige nuevas formas de pensar el - rol de la biblioteca pública en la vida de un ciudadano. En ese - sentido, una biblioteca digital también es una práctica, un método - de trabajo, un organismo vivo que debe ser ágil y mutante, y que - pueda responder con más celeridad a las necesidades de la comunidad - que atiende. - -Catalina Holguín.\\ -Texto de apertura del taller intersectorial, diciembre 20, 2016 - -La información contenida en esta web está protegida por licencias de -Creative Commons. Eso quiere decir que se puede compartir libremente, -siempre y cuando se dé el crédito apropiado, no se modifique la -información y no se explote comercialmente. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/index.html' - ] - }, - GrafoscopioNode { - #header : '¿Una Biblioteca Digital de Bogotá? Definiciones y aproximaciones', - #body : '### Definiciones biblioteca digital de Bogotá {#definiciones-biblioteca-digital-de-bogotá .semibold .mayusculas .azul} - -La definición de la biblioteca virtual de Bogotá es mucho más compleja -que su simple enunciación. Y lo es por varios motivos. En primer lugar, -porque la forma biblioteca, que es una invención milenaria de la -humanidad, está replanteándose de manera muy profunda no sólo por las -transformaciones del libro, sino sobre todo por el lugar que este ha -ocupado en la cultura y por los cambios que se han producido en las -relaciones de las personas con él. En segundo lugar, porque el -calificativo "virtual" desborda la simple acepción tecnológica para -referirse a un nuevo ecosistema en que los significados son muy variados -y entrelazados y corresponden a dimensiones que conciernen nuevamente a -la cultura: la existencia de una inteligencia colectiva, la generación -de redes, el carácter colaborativo del conocimiento, la relación entre -técnicas y memoria o el fortalecimiento de la interactividad (todas -ellas dimensiones que definen el sentido de una biblioteca). Y, en -tercer lugar, porque hay una clara adscripción de la biblioteca a una -ciudad particular ---Bogotá--- que tiene una historia, unos modos de -vivir de sus habitantes, una comprensión del conocimiento y de la -sensibilidad, unos usos determinados de las tecnologías y una geografía -que no solamente se expresa en su ubicación territorial, sino también en -las percepciones de sus habitantes de lo que es una biblioteca y, sobre -todo, de lo que se espera de ella en el contexto de la vida corriente. - -Las bibliotecas son lugares extraños que guardan, por una parte, el -sentido venerable de una tradición (la conservación del conocimiento, la -clasificación y taxonomía de los saberes, la oportunidad de tener acceso -a libros, imágenes y documentos, el testimonio de los cambios que han -experimentado los seres humanos a lo largo del tiempo) y a la vez van -produciendo la sensación de algo detenido en el tiempo. Posiblemente sea -una figura injusta porque las bibliotecas hacen esfuerzos constantes por -remozarse, encontrar funcionalidades que mantengan su vitalidad, diseñar -programas de promoción que atraigan a los lectores e interactuar con -otras expresiones artísticas o corrientes que restablezcan de otro modo -su vigencia del pasado. - -El problema es que no cambian solo las bibliotecas sino que se -transforma severamente el entorno cultural y social que las rodea, como -lo observaremos más adelante en un análisis más detallado de lo que pasa -con la lectura y las bibliotecas en Colombia y, particularmente, en -Bogotá. Constatar estos cambios no es una tarea difícil. En efecto, los -libros disminuyen sus tirajes, la relación del conocimiento con la -biblioteca se desplaza hacia las tecnologías (ya sea a través de las -bases de datos, las aplicaciones, las plataformas digitales o la simple -exploración de la web en internet), el tiempo y su duración en relación -con las distancias y la movilidad urbana tienen otras connotaciones para -el habitante de la ciudad y redefinen sus conexiones con el espacio de -la biblioteca, la lectura compite con una oferta de consumo cultural que -se ha ampliado y que además se concentra en los mismos artefactos que -reemplazan, así sea parcialmente, las funciones de la biblioteca. El -significado de lo documental ha cambiado, como lo ha hecho la tarea de -consulta, y el conocimiento se ha expandido de tal forma que las -bibliotecas son lugares que apenas concentran una parte pequeña de los -materiales de lectura, y lo hacen en un lugar físico que demanda -desplazamientos e inclusive una cierta continuidad en el comportamiento -de los lectores. - -> Biblioteca Digital de Bogotá: las tres palabras que -componen el enunciado (biblioteca, virtual y Bogotá) expresan grandes -conmociones, que tienen correspondencias sociales, simbólicas y -culturales de enorme densidad. Por ello es fundamental que se tengan en -cuenta los cambios sobre los que está asentado el propósito de crear una -biblioteca digital, para que su diseño consulte un horizonte amplio que -pueda ser sometido a un análisis realista que facilite generar -prioridades, definir alcances, tamaño y funciones, prever posibles -relaciones, anticipar los usos por parte de los ciudadanos y garantizar -sus condiciones de sostenibilidad como también los desarrollos posibles -hacia el futuro. -[Germán Rey. Investigación BDB, 2016]{.pie .bloque} - -### Aproximaciones a la Biblioteca Digital de Bogotá {#aproximaciones-a-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas} - -- [Lugar de memoria de y en la ciudad:]{.semibold} La BDB deberá - promover desde su inicio un trabajo sistemático de la memoria - estableciendo relaciones con los referentes institucionales de la - memoria en la ciudad como el Archivo de Bogotá, el Instituto de - Patrimonio, el Museo de Bogotá, entre otros. -- [Lugar de encuentro de la creación en la ciudad:]{.semibold} Bogotá - está atravesada por expresiones musicales, visuales, teatrales o de - intervención en las tecnologías, para mencionar solamente algunas, - que componen su mapa creativo. Más que manifestaciones de la - creación, son modos de construir ciudad. Junto a los festivales de - música, como Rock al parque, está la distribución urbana de los - "ensayaderos" y sobre todo el desarrollo de las bandas de rock en - diferentes lugares de la ciudad, que articulan la expresión musical - con los sistemas de identificación y reconocimiento de los jóvenes. - Estos ejercicios de creación deberían tener un lugar en la BDB, en - nodos que los pusieran en contacto, que permitieran mezclas y - fusiones pero también alianzas y realizaciones prácticas conjuntas. -- [Lugar de articulación entre territorio, conocimiento y experiencia - lectora:]{.semibold} Un elemento fundamental de la BDB será, por una - parte, reconocer las prácticas lectoras en sus localidades, es - decir, las especificidades territoriales del leer y, por otra, - vincular a los habitantes de esas localidades al funcionamiento de - la biblioteca como un sistema virtual, cuyo uso ya no tiene que ver - con las distancias o el lugar sino con otras motivaciones de uso; la - capacidad de navegación, el atractivo de la oferta cultural, la - conexión con sus necesidades, etc. -- [Lugar de exploración de las diversas modalidades del - leer:]{.semibold} Una posibilidad de las bibliotecas digitales es la - de garantizar la recurrencia de diferentes formas de lectura, - inclusive aquellas que provienen de las nuevas experiencias - virtuales: lecturas intempestivas, de vínculos, de participación en - comunidades de lectores, con nuevas estructuras sintácticas, - definidas por los afectos y las emociones (todas esas formas que - desde la lectura tradicional se consideran como no lecturas, - lecturas superficiales e incluso lecturas aberrantes). Lo anterior, - junto a la lectura reposada y analítica, que se propone el recorrido - de textos amplios y en la que se invierte una buena cantidad de - tiempo. -- [Lugar de acceso a recursos que enriquezcan la vida en la - ciudad:]{.semibold} Cada vez es más frecuente entender la biblioteca - no solamente como el lugar de acceso a los libros o a los distintos - materiales impresos sino como un espacio dotado de numerosos - recursos que faciliten y estimulen los procesos de conocimiento. - Muchos de esos recursos son dispositivos o servicios digitales como - por ejemplo las bases de datos, portales y plataformas-e, los libros - electrónicos o en línea, la gama cada vez más grande de - aplicaciones, pero también los catálogos sonoros, los fondos - audiovisuales o los fondos de imágenes, las hemerotecas - digitalizadas. El leer se convierte en una tarea compleja en que - están involucrados diversos lenguajes, sistemas de signos y - experiencias culturales, que además precisan una diversidad de - competencias que sobrepasan al acontecimiento lector. La BDB debería - promover la formación de esas competencias por ejemplo a través de - MOCS o tutoriales, los usos creativos de estos recursos, su - circulación en la web y el diálogo entre los creadores. -- [Lugar-ágora para la deliberación socio-cultural en y desde la - ciudad:]{.semibold} Si bien hay sitios especializados para la - conversación social de los ciudadanos entre sí o con las diferentes - autoridades e instancias públicas, sería importante dotar a la BDB - de alguna posibilidad técnica para facilitar su expresión, diálogo y - debate sobre problemas relacionados con su vida cultural, el acceso - al conocimiento, su aplicación en la vida ciudadana y los vínculos - de la información con sus demandas personales y sociales. Una - dimensión importante de esta ágora digital-cultural es dotar a la - conversación social de información cualificada sobre lo que sucede - en la vida cultural de la ciudad y promover la participación y el - diálogo sobre los problemas y las realizaciones simbólicas de la - ciudad. La BDB debe diseñar estrategias para motivar esta - conversación que bien puede llevar a la lectura y a la deliberación - de la comunidad. -- [Lugar del aprendizaje colaborativo en la ciudad:]{.semibold} El uso - de las bibliotecas físicas tiene que ver con los procesos - educativos. La BDB debe tener en cuenta que una parte importante de - sus usuarios serán estudiantes y que deben promoverse conexiones - eficientes con las bibliotecas escolares, desarrollo de las - competencias de los profesores como acompañantes de los procesos de - lectura y promoción de las competencias lectoras de los estudiantes. -- [Lugar de repositorios y acceso a la información en y de la - ciudad:]{.semibold} Una biblioteca virtual es un espacio de acceso a - colecciones, bases de datos, obras digitalizadas, bancos de - información y diversos tipos de recursos seleccionados de acuerdo a - sus poblaciones prioritarias. Es fundamental la tarea de agregación - y clave la articulación con otras fuentes de generación y - circulación de conocimiento e información. La BDB debe tener una - identidad de ciudad y debe ser un lugar especializado en Bogotá, ya - sea proporcionando conocimiento propio y creativo sobre la ciudad, - ya sea integrando el conocimiento que sobre ella existe tanto a - nivel institucional como en colectivos y grupos sociales. - ->La biblioteca digital es "una herramienta que ocupa -el centro de la actividad intelectual y que no tiene fronteras o -barreras lógicas, conceptuales, físicas o temporales con respecto a la -información\\". Se ha generado un cambio [de un sistema centrado en el -contenido, que solo organiza y proporciona acceso a colecciones -particulares de datos e información, a un sistema centrado en las -personas]{.semibold} con el objeto de ofrecerles experiencias -interesantes, novedosas y personalizadas. Su principal función pasó del -almacenamiento estático y la recuperación de información a [propiciar la -comunicación, la colaboración y otras formas de interacción]{.semibold} -entre científicos, investigadores o el público en general en temas que -son pertinentes a la información almacenada en la biblioteca -digital. -[DELOS. Citado en "Anexo 1: Hacia una biblioteca pública digital".]{.pie -.bloque} - -Descargue el texto completo de\\ -la investigación realizada por [Germán Rey] - -[\\>](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf) - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/aproxdef.html' - ] - }, - GrafoscopioNode { - #header : 'Usuarios potenciales: recorrido de tendencias y cifras', - #body : '# Usuarios potenciales: recorrido de tendencias y cifras {#usuarios-potenciales-recorrido-de-tendencias-y-cifras .tituloi .mayusculas} - - -::: {.imagencontenida .imgfondo7} -::: - -[Recorrido por Biblored: retrato de una red en -2016](https://www.youtube.com/watch?v=svZOUneEgZ8){.gris} - -## ÍNDICE {#índice .azul .extrabold} - -1\\. Análisis de cifras - -2\\. Encuesta Bienal de Cultura - -3\\. Estudio del Observatorio de Desarrollo Económico - -4\\. Encuesta de consumo cultural del DANE (2016) - -## Análisis de cifras {#análisis-de-cifras .azul .semibold .mayusculas .interlineado1} - -Colombia y Bogotá cuentan con un conjunto de estudios sobre la lectura y -las bibliotecas de indudable importancia. Además de ser investigaciones -sobre diferentes aspectos del consumo de libros, la generación de -hábitos de lectura, la importancia de los mediadores del leer o los -contextos y lugares de la lectura, son también aproximaciones al consumo -cultural en el que se inscribe la lectura. Más recientemente han -aparecido otras preocupaciones como, por ejemplo, los análisis del -desarrollo de la cultura digital y el impacto de las tecnologías en la -educación como también en general en las sensibilidades y -particularmente en la lectura. - -En los tres estudios de hábitos de lectura y consumo de libros en -Colombia existen datos muy valiosos de carácter sectorial, pero también -de índole longitudinal. Si entre los primeros se puede constatar la -realidad de la lectura y de la no lectura, el desarrollo del leer en -diferentes niveles etarios, socioeconómicos, de género o de grado -educativo, en los segundos es posible confirmar lo que ha sucedido en el -país y en la ciudad en los últimos 15 años, en algunos temas relevantes, -como por ejemplo el surgimiento de lecturas emergentes que se realizan a -través de múltiples pantallas, ya sean las de los computadores, el -teléfono móvil o las tabletas electrónicas. Entre los instrumentos de -análisis cultural se deben destacar los estudios sobre consumo de -libros, asistencia a bibliotecas y hábitos de lectura realizados por el -DANE la encuesta de consumo cultural (DANE), la Encuesta Bienal de -Cultura del Observatorio de Cultura de la Secretaria de Cultura y la -Encuesta Regional del Observatorio de Desarrollo Económico de la -Secretaría de Desarrollo de Bogotá. - -Todos ellos permiten construir un perfil de la lectura y de las -bibliotecas en la ciudad que a la vez ayuda a pensar el sentido y -funcionamiento de su Biblioteca Digital. - -Existe un conjunto de tendencias en todos estos estudios que se pueden -constatar a través de sus mediciones en el tiempo. Entre ellas están la -fuerte presencia de los no lectores, el peso en las prácticas de lectura -de la edad, el nivel socioeconómico, las localidades de la ciudad, el -nivel educativo y el género, el bajo nivel de lectura de libros (1,9 de -promedio al año en Colombia), el incremento significativo de la lectura -en internet, la transformación del mobiliario cultural al que ahora se -integran el computador, el teléfono celular y las tabletas, el papel de -algunos mediadores claves de la aproximación a la lectura, el acceso a -bibliotecas, los temas más consultados, etc. - -Para el presente estudio se analizaron los estudios sobre consumo de -libros, asistencia a bibliotecas y hábitos de lectura realizados por el -DANE en la encuesta de consumo cultural (DANE), la Encuesta Bienal de -Cultura del Observatorio de Cultura de la Secretaria de Cultura y la -Encuesta Regional del Observatorio de Desarrollo Económico de la -Secretaría de Desarrollo de Bogotá. Todos ellos permiten construir un -perfil de la lectura y de las bibliotecas en la ciudad que a la vez -ayuda a pensar el sentido y funcionamiento de su Biblioteca Digital. - -### Conclusiones del análisis de cifras y tendencias {#conclusiones-del-análisis-de-cifras-y-tendencias .azul .semibold .mayusculas} - -Los datos de los estudios sobre Bogotá confirman varias tendencias -importantes que deben ser tenidas en cuenta para la construcción de una -política pública sobre la factibilidad de una Biblioteca Digital de -Bogotá. - -- Existe un contraste verificable entre el acceso a la lectura de los - bogotanos y el incremento de su cultura digital. -- Se ha modificado ya el mobiliario simbólico y cultural de los - bogotanos y bogotanas con un notable incremento de la - infraestructura y las prácticas de apropiación de las tecnologías, - que generan una realidad multi pantalla a través de la cual se ha - incentivado la lectura. -- Aún existen brechas entre las diversas localidades de la ciudad. Se - debe explorar la geografía de estas brechas. -- Las asimetrías frente al uso de las tecnologías están relacionadas - con el estrato socioeconómico, la edad, el nivel educativo y el - género. Tienen más apropiación de tecnologías las personas de clase - alta, los hombres, los más educados y los más jóvenes. -- Es muy determinante la influencia que tienen las tecnologías de - información y comunicación en los más jóvenes de la población de - Bogotá. -- El acceso a las tecnologías se hace particularmente desde las - viviendas, aunque son claves los esfuerzos que se están realizando - para convertir la escuela en un ámbito de expresión y funcionamiento - de las tecnologías. -- El computador y el teléfono móvil son los dos artefactos más - importantes en estos momentos en la vida cultural de los bogotanos. - La televisión está posicionada en un lugar preponderante del consumo - cultural bogotano desde hace años y seguramente empiezan a suceder - cosas con los Smart TV. -- El incremento del computador y su distribución por localidades es un - dato especialmente importante para la definición de políticas en - este campo. -- Una parte importante del consumo cultural de los bogotanos y - bogotanas está sucediendo a través de estos artefactos y en la - navegación por internet. Sobresale el escuchar música, el ver - videos, el participar en redes sociales, el enviar y recibir correos - e inclusive el leer. -- Hay un ascenso de la lectura en internet, aunque aún no hay altos - porcentajes de lectura de libros electrónicos. -- La frecuencia de acceso a internet es muy importante entre la - población joven de la ciudad, es decir, aquella que está entre los - 14 y 18 años. -- Es importante profundizar en la relación del ecosistema digital con - las artes y otras expresiones culturales como la lectura, la - apropiación del patrimonio, y la asistencia a museos y bibliotecas. -- Las culturas científicas y los saberes están circulando por - internet. Los jóvenes acceden a ellos, como soporte de su práctica - educativa y de su desempeño en la vida cotidiana. -- Otros estudios, como por ejemplo los de lectura y lectura digital de - las pruebas PISA, están indicando que Colombia tiene puntajes bajos, - entre otros temas, en las competencias y habilidades para navegar de - manera eficiente en la red y ubicar de manera rápida y correcta los - sitios que pueden proveer de información relevante a los niños y - jóvenes. -- Los recientes resultados colombianos de las Pruebas Saber 11 son - especialmente significativos. Colombia incrementó sus promedios de - 250 a 257 puntos siendo la lectura crítica el resultado pedagógico - más favorecido. -- El desnivel que se observa entre contenidos científicos, - divulgativos y formativos locales y los niveles de acceso a este - tipo de material por parte de los jóvenes es preocupante y de - especial interés para las políticas. -- No existen mediciones sobre las relaciones entre prácticas - artísticas y nuevas tecnologías, muy decisivas para la orientación - de las políticas culturales en la ciudad. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -~[❝]{.comilla .cafe}~A partir de la década de los años ochenta ---se lee -en el Documento de políticas del Distrito--- se han producido -transformaciones sustanciales en las prácticas de interpretación, -valoración y producción del arte y la cultura que fueron heredadas de la -modernidad. Estos cambios han estado motivados por profundos debates -académicos, por transformaciones radicales en las propias prácticas -culturales y artísticas, así como por las presiones ejercidas desde las -agendas culturales y políticas de los grupos y movimientos sociales que -las consideran como territorios de conflicto y negociación cultural y -política. \\[...\\] Es necesario mencionar el giro radical que marca el -paso de una definición del arte y la cultura como objetos para la -apreciación, la exhibición y el consumo a una que los considera como -prácticas sociales.~[❞]{.comilla .cafe}~\\ -[Nombre del documento]{.pie .bloque} - -## Encuesta bienal de cultura del 2015, realizada por el Observatorio de Culturas de la Secretaría de Cultura, Recreación y Deporte de Bogotá {#encuesta-bienal-de-cultura-del-2015-realizada-por-el-observatorio-de-culturas-de-la-secretaría-de-cultura-recreación-y-deporte-de-bogotá .azul .semibold .mayusculas .interlineado1} - -- En los últimos 12 meses los bogotanos y bogotanas ha leído - literatura (46,4%), prensa y publicaciones periódicas (35,4%) y un - 35, 3%. Cuando se discrimina esta información se constata que al - sector más bajo socioeconómicamente de la ciudad no le gusta leer en - un 42,4%, el medio en un 30,7% y el alto en un 23,6%. -- Un 10,8% de los ciudadanos y ciudadanas de Bogotá dicen leer un - libro al año, mientras que un 31,2% lo hacen de 2 a 5 libros. El - promedio nacional es muy similar. Los colombianos leemos 1,9 libros - al año. -- La frecuencia de lectura es otro dato importante. Diariamente lo - hace un 26,6% y una vez a la semana un 26,7%. La primera cifra se - distribuye así, según el estrato socio económico: alto un 35,8%, - medio un 30% y bajo un 21,3%. -- Los factores que limitan que se lea más son:\\ - Costo: 9,8%\\ - Tiempo: 36,7%\\ - Interés: 13,8%\\ - Dificultad de acceso: 0,8% -- El acceso al material de lectura se hace en:\\ - Biblioteca propia o familiar: 22, 1%\\ - Biblioteca escolar o universitaria 4%\\ - Biblioteca pública: 6,2 %\\ - Biblioteca comunitaria: 0,8%\\ - Paradero para libros para parque: 0,4%\\ - Préstamo entre amigos 6%\\ - Internet 9,5%\\ - Biblioteca estación 1,1%\\ - Librerías 8,0% -- El 59,7% de los encuestados afirman que tienen acceso a internet en - su vivienda. Las localidades que tienen mayor acceso a internet en - su vivienda son Usaquén (75,7%), Teusaquillo (74,3%), Engativá - (68,7%), Suba (68,4%) y Puente Aranda (64,8%), mientras las que - tienen menor acceso son Usme (41,6%), Bosa (46,2%), Rafael Uribe - Uribe (48,6%), San Cristóbal y Santa Fé. -- Los bogotanos usualmente acceden a internet a través de computador - con conexión wifi (21,1%), computador con conexión a red telefónica - conmutada (20.9%) y Smartphone (18%). -- El 33% de los bogotanos usa internet para escuchar música, el 26,9% - ve videos frecuentemente por la web, el 20,5% lee libros, el 30,9% - usa redes sociales, el 39,7% busca frecuentemente información, el - 29% envía y recibe correos electrónicos y el 24,7% frecuentemente - hace tareas utilizando internet. -- El promedio de uso de computador en la ciudad ya es de 63%, mientras - que 87 de cada 100 jóvenes entre 14 y 28 años entran a internet - frecuentemente. En Usme el uso de computador es de un 46%, en Ciudad - Bolívar de 51% y en Bosa de 54%. -- El 82% de personas entre 10 y 28 años usan computador con frecuencia - y en los mayores de 46 años el uso llega al 37%. - - -## Estudio del Observatorio de Desarrollo Económico (ODE), Noviembre del 2015 {#estudio-del-observatorio-de-desarrollo-económico-ode-noviembre-del-2015 .azul .mayusculas .semibold} - -En un estudio reciente del Observatorio de Desarrollo Económico (ODE), -se observan las siguientes tendencias, relevantes para la Biblioteca -Digital de Bogotá: - -- [Internet en las localidades:]{.semibold} - - Chapinero, Usaquén y Suba están por encima del promedio de - Bogotá respecto al uso de internet que es de 66%. - - El uso de computador en Usme es 46%, en Ciudad Bolívar de 51% y - en Bosa de 54%, ubicándolas por debajo del uso promedio de - computador en Bogotá. - - Las localidades con mayor uso de computador son Teusaquillo - (84%), Chapinero (82%), Usaquén (74%) y Barrios Unidos (71%). - - Las localidades con mayor tenencia de teléfonos móviles son - Teusaquillo (93,4%), Chapinero (92,6%), Usaquén (91,5%) y - Engativá (90,5%) -- [Edades en el uso de internet:]{.semibold} - - El promedio de uso de computador en la ciudad ya es de 63%. - - 87% de los jóvenes entre 14 y 28 años entran a internet - frecuentemente. - - El 63% de las personas mayores de 10 años en Bogotá usa - regularmente computador. Y el 39,3% de estos lo hace todos los - días de la semana. -- Las mujeres usan menos computador (60,2%) que los hombres (65%). -- El 75% de bogotanos y bogotanas acceden a internet desde su casa, - mientras que la media de celulares en la ciudad ya alcanza un 86% - del total de su población. - -## Encuesta de consumo cultural del DANE (2016) {#encuesta-de-consumo-cultural-del-dane-2016 .azul .mayusculas .semibold} - -- Usos del internet en Bogotá - - 68, 4% para descargar o escuchar música - - 24,9% para oír radio o ver televisión - - 27% para leer periódicos o revistas en línea - - 22,9% para visitar o acceder a servicios en línea en espacios - culturales virtuales (bibliotecas virtuales, museos, galerías) - - 25,8% para descargar o consultar libros en línea - - 25% para buscar, descargar o jugar videojuegos en línea, - - 57,3% para buscar, descargar o ver películas en línea. -- Número de libros leídos por año en Bogotá: - - Un (1) libro: 23% - - Dos (2) libros: 20,8% - - Tres (3) libros: 18,8% - - Cuatro (4) libros: 10,6% - - Cinco (5) libros: 7,1% - - Seis (6) libros: 8,3% - - Diez (10) o más libros: 11,3% - - El promedio de libros leídos en Bogotá por persona fue de 4,9. -- El 89,8 % de los bogotanos de 12 y más que saben leer y escribir - leyeron en cualquier formato; el 49,6% de esta misma población leyó - libros y el 46,4% revistas. -- Asistencia a espacios culturales - - Bibliotecas: 22,7% - - Teatro, danza u ópera: 19,7% - - Música en espacios abiertos o en espacios cerrados: 24,9% - - Exposiciones de artes visuales: 13,8% - - Exposiciones artesanales y ferias: 19,2% -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/usuarios.html' - ] - }, - GrafoscopioNode { - #header : 'Articulación con la Política Pública', - #body : '# Articulación con la política pública {#articulación-con-la-política-pública .tituloi .mayusculas} - -::: {.imagencontenida .imgfondo3} - - - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -"Leer es volar" nace como un esfuerzo concertado entre la Secretaria de -Educación y la Secretaría de Cultura, Recreación y Deporte de Bogotá. Se -trata por una parte de un plan que involucra a dos áreas fundamentales -de la gestión pública ---la educación y la cultura--- y que se dirige a -una diversidad poblacional conformada por niños y niñas, estudiantes, -jóvenes, maestros, cuidadores, artistas, gestores culturales e -instituciones como escuelas, bibliotecas, museos, entre otros. - -### Líneas estratégicas del Plan Distrital de Lectura y Bibliotecas "Leer es volar" y su relación con la Biblioteca Digital de Bogotá {#líneas-estratégicas-del-plan-distrital-de-lectura-y-bibliotecas-leer-es-volar-y-su-relación-con-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas} - -Promover la lectura y la escritura desde la primera infancia: - -Es importante pensar en la diversidad de las lecturas y las escrituras -que se está generando precisamente entre los niños y los jóvenes de la -ciudad al ingresar en el ecosistema digital. Se requieren, por tanto, -varias acciones que puede potencializar el Plan: - -- Transformación de las percepciones, especialmente de la escuela y - los maestros, sobre la participación de niños y jóvenes en el nuevo - entorno digital. En la Mesa de Cultura Digital del plan se propuso - con acierto el estímulo de etnografías que exploren las experiencias - tecnológicas de los nativos digitales, pero también las de aquellos - que sin serlo (por ejemplo, los maestros o los padres) se deben - enfrentar diariamente a los fenómenos que conforman la nueva cultura - digital. -- Incorporar a los procesos de enseñanza-aprendizaje de la - lectoescritura las competencias relacionadas con los contenidos y - prácticas digitales. -- Formar a profesores de lectura y escritura en el uso de tecnologías - para la activación del aprendizaje en la escuela (Tecnología para la - mejora de la educación: experiencias de éxito y expectativas de - futuro, Francesc Pedró). -- Ofrecer en la Biblioteca Digital de Bogotá contenidos digitales para - el aprendizaje de niños y jóvenes en los centros educativos, así - como posibilidades de creación de contenidos a través de recursos - como aplicaciones específicas. -- El Plan contempla la formación de bibliotecarios y maestros y la BDB - puede ampliar el acceso de niños y niñas a materiales infantiles - interactivos y en línea. También es explícito en recalcar que el - Plan desarrollará una política de textos escolares que fomente el - vínculo entre las competencias de lectoescritura y el gusto de la - lectura "desde diferentes temas, formatos y dispositivos". En el - Plan Nacional de Lectura y Escritura liderado por el Ministerio de - Educación se afirma que busca que todos los niños y jóvenes del país - cuenten con libros y materiales de lectura de calidad que les ayuden - a fortalecer sus procesos de aprendizaje y a mejorar sus - competencias en lectura y escritura. De ahí la entrega de su - Colección Semilla. - -Fortalecer, modernizar y articular las bibliotecas públicas y escolares - -En el Plan Nacional de Lectura y Escritura del Ministerio de Educación -se dice expresamente que se deben crear o fortalecer las Bibliotecas -escolares, entendidas no como lugares en el que se depositan los libros, -sino "como un espacio que se articula con el proyecto educativo de la -nación, con el proyecto educativo institucional y con el currículo -mismo". Se reconoce de ese modo que "la escuela y la biblioteca escolar -son los espacios ideales para incidir en el comportamiento lector y en -la comprensión lectora, así como en sus producciones escritas". Aunque -no se menciona específicamente la relación entre lectura, ecosistema -digital y educación, el Plan menciona la necesidad de tener una -"estrategia de redes sociales basadas en la web, que alimente -permanentemente comunidades de interés sobre el tema de lectura y -escritura". Un propósito fundamental de la BDB sería entonces: - -- Vincularse con las diversas modalidades de bibliotecas y desarrollar - servicios que puedan dirigirse hacia las escuelas y centros - educativos de la ciudad para tratar de superar la notable desventaja - que tiene un número importante de escuelas y colegios del Distrito - que no cuentan con biblioteca escolar. -- Generación de comunidades de lectores y sitios virtuales de - encuentro e intercambio de prácticas y experiencias de lectura -- Suministro de recursos tecnológicos para cualificar la lectura y la - escritura cuyos resultados puedan compartirse en la biblioteca - digital -- Programas de alfabetización y formación de competencias para - desempeñarse adecuadamente en el entorno digital -- Reconocimiento social de propuestas y experiencias educativas de - lectura y escritura, tutoriales y acompañamiento virtual de - prácticas de lectura y escritura, entre otros. - -Fomentar la investigación, la evaluación y el diálogo de saberes frente -a la cultura escrita. - -Será muy clave hacer el seguimiento de la relación de los nuevos modos -de leer con los nuevos modos de escribir que están surgiendo con el uso -de las tecnologías. Según los estudios nacionales y distritales aumenta -la lectura en internet, así como la utilización del correo electrónico, -los chats y los blogs. Como se señaló en la Mesa de Cultura Digital, -convocada por el Plan de lectura "Leer es volar": "No se trata solamente -de crear la Biblioteca Virtual de Bogotá. Esto es uno de los proyectos -importantes del plan y será abordado en la presente reflexión. Pero el -tema va más allá: ¿cómo garantizar desde las políticas públicas la -apropiación social del conocimiento en el entorno digital? ¿Cómo -contribuir al desarrollo de las capacidades digitales de los ciudadanos -para que puedan acceder a la información, construir contenidos -culturales, crear y compartir conocimientos y relacionarse de manera -activa con otros, próximos y lejanos? -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -"Leer es volar" nace como un esfuerzo concertado entre la Secretaria de -Educación y la Secretaría de Cultura, Recreación y Deporte de Bogotá. Se -trata, por una parte de un Plan que involucra a dos áreas fundamentales -de la gestión pública --la educación y la cultura- y que se dirige a una -diversidad poblacional conformada por niños y niñas, estudiantes, -jóvenes, maestros, cuidadores, artistas, gestores culturales e -instituciones como escuelas, bibliotecas, museos, entre otros. - -[](descargables/Bibliotecas%20digitales_conceptos_tendencias_alianzas_politica_German%20Rey.pdf) - -::: {.naranjaf .ancho4 .descargar .pointer .ajuste .margen5} -::: {.punteada .ajuste .des} -DESCARGAR -::: -::: -::: - -::: {.naranjaf1 .cita1 .ajuste .bloque .margenes2} -[Acciones digitales en el marco del Plan Nacional de Lectura "Leer es mi -cuento"]{.semibold}\\ -Un primer contacto con lo digital es el reconocimiento que hace el Plan -al acceso y circulación de la información y el conocimiento como un -objetivo del estímulo de la lectura y la escritura. - -- Un acción muy destacable en este sentido es la creación por parte - del Ministerio de dos portales: Maguaré para la primera infancia y - Maguared para los cuidadores, padres de familia y maestros. -- La BDB tiene en estos dos portales un ejemplo del uso de tecnologías - digitales para la promoción de la lectura y la escritura fuertemente - enraizado en diferentes manifestaciones del patrimonio inmaterial - del país, una estrategia de participación, y un conjunto de señas de - identidad que se relacionan con la vida simbólica de niños y niñas. - También es un ejemplo de conversación de la lectura y la escritura - con la música, los relatos populares, el medio ambiente y los - valores de la convivencia pacífica. -- A estas líneas de trabajo el Plan "Leer es mi cuento" suma programas - de formación para bibliotecarios, a través de la Biblioteca Nacional - de Colombia, que tienen en cuenta la formación tecnológica en - gestión bibliotecaria además de la formación virtual y digital. A - través del Proyecto uso y apropiación de TICs se busca dotar a las - bibliotecas públicas con computadores y tecnología complementaria - (tabletas, pantallas, proyectores, impresoras, etc) y software. -- La BDB deberá apoyar estas iniciativas en coordinación con las - entidades del sector que las llevan a cabo, posiblemente - especializando su labor para una mayor eficiencia. -::: -::: -::: - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Consideraciones para tener en cuenta de la Mesa de Cultura Digital del Plan "Leer es volar" {#consideraciones-para-tener-en-cuenta-de-la-mesa-de-cultura-digital-del-plan-leer-es-volar .azul .semibold .centrar .mayusculas} - -Las preocupaciones planteadas por la Mesa son legítimas y complementan -las relaciones particulares entre el Plan y la Biblioteca Digital de -Bogotá en la medida en que se interesa por el papel del nuevo ecosistema -digital en los procesos de conocimiento que se dan, circulan y se -apropian en la ciudad, no sólo por parte de los sujetos de la comunidad -educativa (maestros, bibliotecarios, niños, niñas, jóvenes y padres de -familia) sino también por todos los ciudadanos sin discriminación -ninguna. - -Hay una gran tarea educativa que rebasa a la institucionalidad educativa -distrital y que tiene en cuenta la relevancia del conocimiento y la -información en la vida cotidiana de los ciudadanos. En otras palabras: -ser ciudadano hoy significa poder tener autonomía, dominio y creatividad -frente a las tecnologías y lo que ellas permiten y facilitan. La BDB -debe proponerse contribuir a esta tarea que no se define explícitamente -en el Plan. A continuación se analizan algunas preocupaciones expresas -en la Mesa de Cultura Digital: - -- Existencia y complementación de diferentes modalidades de lectura y - la necesidad de abrir las puertas a otros contenidos que no sean - necesariamente literarios. Es lo que Bernard Lahire ha llamado la - "lectura de gestos", frente a la "lectura de interpretación". - Mientras en la segunda están los textos literarios, en la primera se - comprenden aquellas lecturas ancladas en realidades cotidianas. -- Fortalecimiento de la conectividad. Los datos que muestran una - permanencia de la brecha digital especialmente en los sectores - populares y en los niveles educativos bajos y la necesidad de una - alfabetización digital de los maestros como una política pública - consistente y urgente. "Hace falta pensar desde la política cómo - lograr que los profesores inicien la actualización frente a estos - cambios, esto no se le puede delegar a los esfuerzos individuales de - cada profesor. Desde la SED, se debe plantear una política pública - relacionada con la lectura digital". -- Interés por conocer y evaluar los recursos y contenidos digitales - que el Estado está ofreciendo al sector educativo y en general a los - ciudadanos. Como se afirma en la Mesa "la cultura digital exige una - participación activa del lector ya que está inmerso en la - hiperlectura. La mediación, el eje de las prácticas, debe ser la - producción del conocimiento. Lo digital transforma las prácticas y - vivifica las experiencias". -- La lectura digital o los nuevos modos de leer no son simplemente - prácticas que transcurren en soportes nuevos y diferentes. El mundo - digital propone un conjunto de conceptos nuevos que redimensionan el - acto de leer. Los asistentes a la Mesa del plan de Lectura de Bogotá - lo dicen así: "Leer dejó de ser posar los ojos, se pasó a una - lectura sensitiva. La prioridad está en sustentar la práctica en los - propios fundamentos del mundo digital que presupone fundamentos - epistemológicos propios de lo digital" y además confirman los - tránsitos y relaciones de la lectura y la escritura entre el mundo - analógico y el digital. "La promoción de la lectura debe ser - valorada desde lo análogo y lo digital, hay que ver que hay en uno y - otro, y cómo se complementan. Los promotores de lectura están siendo - exigidos por los nuevos formatos y se enfrentan a las necesidades de - los lectores. Cuando se tenga claro cómo es el lector se identifica - cómo se debe formar el promotor de la lectura". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -[Algunas ideas de la Mesa de biblioteca pública escolar para el Plan -\\"Leer es Volar\\":]{.semibold}\\ -Las bibliotecas deberían convertirse en lugares de transmisión de -sentidos (artísticos políticos culturales etc.,) promoviendo la cultura -informacional, esto es, la utilización de recursos de información de -toda índole para resolver problemas cotidianos ya sean académicos, -existenciales o de otro tipo. - -- Compartir saberes está asociado a comunidades de aprendizaje, lo - primordial de las bibliotecas es poner a la gente en diálogo. -- Generar intencionalmente desde la biblioteca los espacios que - generan conocimiento, que sean como laboratorios de creación. Sin - embargo, hay vacíos porque no se han tenido en cuenta las etapas - para llegar a esto, hace falta preparación. -- El tema de los laboratorios de creación artística es una gran - herramienta para que la biblioteca responda a la diversidad - cultural. Estos laboratorios permiten que la comunidad tenga la - posibilidad de investigación y de creación. La biblioteca como sitio - de experimentación. -- La biblioteca debe ser un centro de producción de contenidos. -- Facilitar el acceso, el préstamo a domicilio, el préstamo - interbibliotecario, el acceso remoto. -- En la Biblored no es visible el tema de la memoria. Los usuarios - quieren encontrar la historia de su localidad: estudios serios, - fotos de lo que fue su localidad, relatos. Debe haber un espacio - físico y concreto en la biblioteca que tenga recursos - bibliográficos, recursos informativos, registros auditivos. -- Hay que identificar entonces las prácticas de memoria de los niños y - jóvenes, su manera de registrar y fijar ciertos hechos. Las - bibliotecas públicas deben identificar esas prácticas de memoria y - cerrar las brechas: los youtubers tienen sus propias prácticas de - memoria, hay que crear lazos con ellos, por ejemplo. -::: -::: -::: - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Carácter de la mediación en los procesos de lectura y el papel de los mediadores en una biblioteca digital {#carácter-de-la-mediación-en-los-procesos-de-lectura-y-el-papel-de-los-mediadores-en-una-biblioteca-digital .azul .semibold .centrar .mayusculas} - -Hacer una Biblioteca Digital es operacionalizar un proceso mediador, en -este caso, en el campo de las lecturas y las escrituras en la ciudad. En -efecto la BDB es un nuevo mediador institucional y no simplemente una -estrategia de mediación. Las tecnologías de la información y la -comunicación configuran un área de mediación entre los ciudadanos, la -lectura y la escritura en el entorno de la ciudad. Mediación porque -facilitan su acceso a la información y el conocimiento, estimulan el -vínculo de la lectura y la escritura con los contenidos digitales, -generan oportunidades de ingreso a colecciones, portales interactivos, -tutoriales, aplicaciones y otros dispositivos y favorecen la -alfabetización y el desarrollo de competencias de la comprensión -digital. - -El tema de la mediación fue un tópico que apareció frecuentemente en la -mesa de cultura digital del Plan "Leer es volar" junto con otros -igualmente persistentes como la creación de contenidos y conocimiento, -la democratización, la relevancia de las redes, la diversidad de la -oferta y el significado de los entornos digitales para la educación. - -Sobre la mediación se puntualizó que el mediador debe tener la capacidad -de proporcionar las herramientas para búsquedas efectivas en Internet; -esto implica la formación de mediadores distintos o de otras maneras de -mediar. La biblioteca debe ayudar a encontrar los recursos y poner a -disposición dispositivos digitales de diferente índole; se busca un -sujeto prosumidor. Un mediador que abra la posibilidad de que haya -encuentros con los otros: creación de redes y relaciones con los demás -(no autistas). Lo digital requiere de una mediación para la construcción -del conocimiento, construcción de lectores críticos y argumentativos. - -La creación de contenidos resalta el papel activo y creativo de los -lectores. Como se afirmó en la Mesa de Cultura Digital, habitualmente se -cree que todo lo que tiene que ver con lo digital se concreta en el -manejo de las herramientas pero no se piensa en términos de contenidos y -en las prácticas de lectura y escritura que allí suceden. Incluso los -jóvenes tienen una visión restringida de lo que ofrece Internet: se -limita a las redes sociales. Aquí es clave la mediación para explorar -todas las posibilidades que ofrece lo digital porque el volumen de -información a la que se puede acceder es enorme: hay que desarrollar -capacidades para discriminar, para valorar la información que llega, -saber discernir. Con la mediación debe estar la medición: habría que -analizar qué prácticas de lectura hace la gente y cómo navega. No es -solamente curaduría de contenidos, es el papel de los ciudadanos en la -producción de información y la creación colectiva. - -Los mediadores de la lectura y la escritura son tradicionalmente los -maestros, los bibliotecarios, los padres de familia, los cuidadores, -entre otros. En la evaluación del Plan de lectura "Leer es mi cuento" -(2015) se lee que "La misión del bibliotecario como agente mediador -entre los libros y los niñas y las niñas es sin duda una de las razones -por las cuales el programa consigue generar los resultados que se han -evidenciado a lo largo de este capítulo. No es arriesgado pensar que el -auge de una biblioteca depende mucho del talante y la entrega del -bibliotecario, de las actividades que propone y el conocimiento que -tiene sobre los recursos de los que dispone. Por lo anterior es -importante lograr una mayor sensibilización para que los bibliotecarios -cada vez más entiendan que la población de la primera infancia es una de -las prioridades de su gestión". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -~[❝]{.comilla .cafe}~Sobre el enfoque de acceso y mejoramiento de los -hábitos de lectura de la población colombiana, debe admitirse que el -programa no ha logrado atraer a un conjunto significativo de nuevos -usuarios de bibliotecas. Esta realidad resulta preocupante por dos -motivos. Uno es que la inversión realizada para dotar a las bibliotecas -y formar a los bibliotecarios está siendo utilizada mayoritariamente por -personas que ya tenían contacto con la bibliotecas y en ese sentido, -está mejorando condiciones ya existentes pero no ampliando la base de -nuevos lectores. El otro motivo que causa preocupación es que los -impactos conseguidos son robustos y están concentrados mayoritaria y -precisamente en el grupo de nuevos usuarios de la biblioteca y de la -colección. Lo que esto significa es que los aportes positivos que -reciben las familias que ya son usuarias no son tan significativos y -que, por lo tanto, si no se logra ampliar la base de usuarios, el -programa nunca generará los efectos esperados. En ese sentido, si bien -el retorno obtenido es positivo, el programa tiene un enorme potencial -de crecimiento"... y que "se puede afirmar que Leer es mi Cuento no ha -sido eficaz para profundizar la apropiación social de las -bibliotecas.~[❞]{.comilla .cafe}~\\ -[Tomado de Leer es mi cuento. Libros para la primera infancia, retorno -de una inversión en el país, Claudia Rodríguez y otros seis -autores.]{.pie .bloque} -::: -::: -::: - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Creación de contenidos y otras formas de participación y generación de conocimiento. {#creación-de-contenidos-y-otras-formas-de-participación-y-generación-de-conocimiento. .azul .semibold .centrar .mayusculas} - -La política debe contribuir al fomento de iniciativas de creación y -conservación colectiva de la generación de conocimiento. Es necesario un -modelo abierto en el que haya corresponsabilidad en la preservación del -conocimiento. También el modelo debe propiciar la creación colectiva -tanto de las instituciones, como los ciudadanos. Desde la política -pública es necesario hacer la distinción entre el uso de la información -y generar conocimiento. Bajar y procesar no es lo mismo. El conocimiento -es una diversidad de informaciones, pasa por la interpretación que hace -un sujeto. No es solamente saber dónde está la información. - -La generación de redes es otro tema central para la BDB que está muy -respaldado por las opiniones de los integrantes de la Mesa de Cultura -Digital. Existen en educación muchas redes: ¿qué sucede en estas redes? -¿La cultura digital las facilita? ¿Hay aprendizaje colaborativo? ¿Hay -más innovación? ¿Son modelos exitosos? ¿Qué dificultades y aciertos -tienen? Hay algunas redes que tienen alcance internacional (red de -docentes, red de lectura, escritura y oralidad, red de danza, red de -investigadores). Hay que hacer un estado del arte de lo que ya hay. - -Los espacios propicios no solo son físicos, sino también digitales. -¿Cómo es un espacio digital propicio? Debe ser un espacio que facilite -el acceso a contenidos de calidad y a crear los propios contenidos. Debe -tener espacios para interacción social. Hay personas que muestran sus -capacidades más fácilmente a través de lo virtual (esto se ve claramente -en la formación virtual). Cuando se lee en un medio electrónico se puede -empezar a interactuar más fácilmente con otros. La lectura de un libro -físico en un espacio físico no implica la posibilidad de interacciones -de manera tan inmediata. Además, quien lee un libro electrónico puede -acceder a otros contenidos. Las prácticas claramente se transforman. -Quien es buen lector en lo físico tiene mayor oportunidad de ser un buen -lector digital. -::: -::: -::: -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/politpubli.html' - ] - }, - GrafoscopioNode { - #header : 'Bibliotecas Digitales en Colombia: ¿Qué están haciendo y cómo se están pensando?', - #body : ' -# Bibliotecas digitales en Colombia: ¿Qué están haciendo y cómo se están pensando? {#bibliotecas-digitales-en-colombia-qué-están-haciendo-y-cómo-se-están-pensando .tituloi .mayusculas} - -Por: Sandra Angulo -::: - -::: {.imagencontenida2 .imgfondo4} -::: - - - -::: {.flex} -::: {.ancho1 .descripcion .ajuste .flexv .flexceh} -::: - -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\\. Introducción - -2\\. Matriz comparativa de distintas bibliotecas nacionales - -3\\. Buenas prácticas para tener en cuenta en Bogotá - -4\\. Recomendaciones tecnológicas para tener en cuenta en Bogotá -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Introducción {#introducción .azul .semibold .centrar .mayusculas .interlineado1} - -El panorama de bibliotecas digitales en Bogotá y en Colombia es diverso. -Con excepción del proyecto Biblioteca Digital Colombiana, que agrupó -bajo una misma metodología y plataforma tecnológica los repositorios -digitales de 13 universidades del país y luego hizo apertura para -incluir otro tipo de contenidos culturales, los demás proyectos -digitales tienen características diversas, bien por las plataformas o -tecnología usadas, los servicios prestados, o los contenidos -desarrollados y publicados. Este ejercicio compara nueve bibliotecas -colombianas con desarrollo de servicios o contenidos digitales, y en tal -caso, las conclusiones sólo se enfocan en estos propósitos. Para efectos -de este estudio fueron analizadas las siguientes bibliotecas: Red de -Bibliotecas -- Programa de la Fundación EPM de Medellín, Red de -Bibliotecas del Banco de la República, Red Nacional de Bibliotecas -Públicas, Red Municipal de Bibliotecas de Cali, Biblioteca Departamental -del Valle del Cauca, Biblioteca Departamental de Norte de Santander, -Biblioteca Departamental del Meta, Biblioteca Digital Héctor Rojas -Herazo especializada en el Caribe Colombiano, y El libro total: la -biblioteca digital de América. Finalmente, este estudio propone -lineamientos generales para la implementación de una biblioteca digital, -los cuales pueden ser consultados en la sección "Orientaciones técnicas, -modelo de plan de trabajo y estándares". - -Los hallazgos de este estudio se pueden resumir en los siguientes -puntos: - -- La Red de Bibliotecas-EPM (Medellín) se destaca porque articula y - optimiza los servicios físicos y digitales de una región, siendo el - único caso en el país. -- La BibloRed (y el portal que lleva su nombre) no es la Biblioteca - Digital de Bogotá. -- Existe una tendencia en todos los proyectos por la generación de - contenidos patrimoniales a partir de colecciones físicas con énfasis - en proyectos digitales fotográficos. -- Las exposiciones virtuales son la modalidad de contenidos digitales - más usada. -- Existe un potencial de producción de contenidos digitales - colombianos que no estamos capitalizando en red. -- En el caso de Bogotá, existen al menos veinte instituciones - distritales que producen contenidos digitales culturales y - educativos pertinentes para integrarse en el concepto de una - biblioteca digital para la ciudad. -- Los proyectos digitales de las bibliotecas departamentales se - enfocan en fotografía y la comunidad participa en ellos. -- La comunidad también participa de otra manera en contenidos - digitales a partir de los planes de promoción de lectura, pero no - son visibles en las bibliotecas. -- Existe una preferencia por referenciar proyectos digitales - internacionales frente a los mismos nacionales. -- Existe una tendencia por el uso de repositorios digitales con - software Dspace y, en consecuencia, un camino ya transitado en la - estandarización de formatos, metadatos e infraestructura de - preservación digital. -::: -::: - -::: {.blancof} -Red de Bibliotecas -- Programa de la Fundación EPM de Medellín -::: -::: - -Red de Bibliotecas del Banco de la República - -BibloRed - -OverDrive - -Ebsco - -Bibliotechnia - -McGraw Hill - -Multilegis - -Leyes.info - -Enciclopedia Britannica - -Manuvo: libros interactivos; colecciones de [música]{.semibold} -Alexander Street Press: American Song, Classical Music Reference -Library, Classical Scores Library Contemporary World Music, Jazz Music -Library, Smithsonian Global Sound for Libraries, Popular Music Library, -The Garland Encyclopedia of World Music Online, Classical Music in -Video, Dance in Video y Opera in Video. - -Virtualplan Forestal\\ -Virtualplan Gastronomía\\ -Virtualplan Procesos industriales - -Enciclopedia Escolar - -Océano saber - -Enciclopedia Virtual Nat Geo - -Naxos Music Library - -Enciclopedia Virtual Nat Geo Kids - -Naxos Sheet Music - -Manuvo: libros interactivos - -[Cuadro 1:]{.semibold} Bases de datos por suscripción en las bibliotecas - - -------------------------------------------------------------------------------------------- - Bases de datos de acceso abierto usadas en la Red de Bibliotecas del Banco de la República - Dialnet - DOAJ (Directory of Open Access Journals) - Biomed Central - Biblioteca Virtual en Salud - PLoS Public Library of Science - -------------------------------------------------------------------------------------------- - -[Cuadro 2:]{.semibold} Solamente el Banco de la República vincula bases -de datos de acceso abierto. - -\\ - -::: {.ajuste .descripcion .ancho1} -Las plataformas de gestor de contenidos más usadas por la totalidad de -las bibliotecas es Drupal y Dspace. En relación con los formatos usados, -existe una estandarización en todas las bibliotecas, usando mayormente -formatos ePub, pdf, html, mp3 y mp4. Sólo una biblioteca, la Red de -Bibliotecas --EPM tiene en uso un App para acceso a servicios de la Red. -Cada red tiene definido un tipo de software diferente para el catálogo -bibliográfico: Janium (código propietario) para las bibliotecas de la -Red de Bibliotecas-EPM, Koha (Código abierto) para las bibliotecas de la -Red Nacional y AbsysNet (código propietario) para las bibliotecas del -Banco de la República. - -[Servicios y posicionamiento]{.semibold}\\ -El principal servicio de las bibliotecas es la circulación de los -contenidos digitales, bien a través del préstamo digital con condiciones -específicas, por ejemplo, en tiempo y unidad de préstamo, o los -contenidos de acceso abierto. En el caso de las bibliotecas -departamentales, municipal de Cali y la Biblioteca Digital Rojas Herazo, -los contenidos patrimoniales son en sí mismo un servicio. - -La principal herramienta para circulación y posicionamiento es la página -web a través de las noticias, la agenda cultural del momento y las redes -sociales. La Red de Medellín publicita o hace visible todas las -bibliotecas de su red a través de enlaces directos o sugerencias de -consulta, y en las páginas destacadas, a diferencia de las demás -bibliotecas, esta red destaca proyectos culturales y pedagógicos del -mismo ámbito geográfico, entre otros. Las demás bibliotecas, incluida -BibloRed, destacan otros proyectos y bibliotecas digitales tanto -nacionales como internacionales. - -Existen otros servicios digitales tales como: Catálogo en el celular, -tutorial de acceso y uso del catálogo bibliográfico en la Red de -Bibliotecas-EPM, el servicio de la Llave del Saber utilizada en las -bibliotecas de la Red Nacional y Municipal de Cali. -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## MATRIZ COMPARATIVA DE DISTINTAS BIBLIOTECAS DIGITALES NACIONALES {#matriz-comparativa-de-distintas-bibliotecas-digitales-nacionales .azul .semibold .centrar .mayusculas .interlineado1} -::: - -Red de Bibliotecas - Programa de la Fundación EPM -::: - -Url - -[www.reddebibliotecas.org.co/](http://www.reddebibliotecas.org.co/){.azul} - -Tipo de biblioteca - -Descripción del\\ -proyecto digital - -La Red de Bibliotecas, un programa Fundación EPM. En la versión digital -se trata de un portal web que agrupa servicios digitales para 115 -bibliotecas de Medellín, área metropolitana y Antioquia; y se ocupa de -apoyar, difundir y visibilizar la labor que realiza cada una de ellas en -beneficio de su entorno social. Además, cuenta con un conjunto de -servicios y contenidos digitales que propenden por la apropiación social -del conocimiento, la alfabetización e inclusión digital, y la promoción -de la memoria histórica local. - -Financiación y aliados (Redes de colaboración) - -Alianza de Empresas Públicas de Medellín, Fundación EPM, Área -Metropolitana, Alcaldía de Medellín y la Biblioteca Pública Piloto. - -Público - -General, teniendo en cuenta que ofrece contenidos académicos, -pedagógicos, locales, patrimoniales y de interés general que trascienden -el perfil de un público infantil y adolescente como es el llamado a las -bibliotecas públicas. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Cuenta con acceso limitado para usuarios de las bibliotecas de la Red en -cuanto a documentos en las plataformas licenciadas, y acceso abierto a -contenidos propios, como de otros proyectos nacionales a los que se -hipervíncula a través de la página web. - -Política de creación de colecciones digitales - -Sí. Los contenidos y servicios tienen tres líneas: apropiación social -del conocimiento, alfabetización e inclusión digital, y promoción de la -memoria histórica local. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sí para el caso de las multimedias de la Sala Interactiva, que usa -documentos originales patrimoniales de la colección fotográfica de la -Biblioteca Pública Piloto de Medellín. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -Drupal versión 2.6.2 para la página web. Plataforma de préstamo de -libros: OverDrive, e-books 24-7, Bibliotechnica, Britannica Escolar, -Enciclopedia Virtual Nat Geo y Nat Geo Kids. Catálogo bibliográfico: -Janium. - -Perfil de usuarios - -Jóvenes, niños y familias. - -Acceso a contenidos (¿personal carnetizado o todos?) - -El acceso es personal a las diferentes bibliotecas de la Red a través de -carné. En la página el usuario debe usar el número de tarjeta de la -biblioteca en donde se encuentra registrado. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -conformada por 8 secciones -(inicio-catálogo-agéndate-diario-bibliotecas-sala de lectura-sala -interactiva y páginas especiales). A través de la página de inicio se -accede también a las secciones de agéndate, diario, sala de lectura y -sala interactiva. La navegación en toda la página tiene un máximo de -tres niveles. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Los contenidos digitales se encuentran distribuidos en las secciones de -Sala de lectura y Sala interactiva. En la Sala de lectura y a través de -un tercer nivel de acceso, se llega a los siguientes contenidos: 600 -libros y audiolibros digitales entre novelas, cuentos, ciencia y -naturaleza, en formatos adaptativos para lectura en tabletas, teléfonos -inteligentes y computadores, disponibles para préstamo digital a través -de la plataforma OverDrive. 197 libros licenciados de la editorial Mc -Graw Hill con disponibilidad para lectura en línea de entre 1 y 10 -copias en la plataforma e-books 24-7. Libros licenciados en formato pdf -de la plataforma Bibliotechnica en temas de: Bellas artes, Ciencias -naturales y Matemáticas, Ciencias sociales, Filosofía y Psicología, -Geografía e Historia, Lenguas, Literatura, Religión y Tecnología. -Licencias para acceso a las enciclopedias: Britannica Escolar, -Enciclopedia Virtual Nat Geo y Nat Geo Kids. La Sala Interactiva: cuenta -12 exhibiciones virtuales en multimedia sobre temas históricos, -culturales y sociales de Medellín, desarrolladas a partir de documentos -patrimoniales del Archivo Fotográfico de la Biblioteca Pública Piloto de -Medellín en un lenguaje y diseño para un público general. -Adicionalmente, tres multimedias dirigidas a público infantil y juvenil, -trabajos en asocio con el programa Medellín Digital de la Alcaldía de -Medellín. Enlaza a 14 proyectos de libros digitales producidos por -entidades como Ministerio de Cultura, Ministerio de Educación, Instituto -de Bienestar Familiar y Biblioteca Nacional entre otros, los cuales -están en acceso gratuito y libre. De igual forma, enlaza al proyecto -Libro Total y a una selección de libros en español del proyecto -Gutenberg. Cada proyecto tiene una página de presentación con un leguaje -uniforme. - -Formatos - -ePub, pdf, html, mp3, multimedia. Cuenta con un App para acceso a -servicios de la Red - -Gestión de derechos de autor - -La entidad paga una licencia a las plataformas de préstamo. Los demás -contenidos están en dominio público. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -El catálogo de la firma Janium centraliza las búsquedas de las -bibliotecas que conforman la red: 29 bibliotecas del Sistema de -Bibliotecas Públicas de Medellín, 48 bibliotecas públicas de Antioquia, -8 de Comfenalco, 11 de Comfama, 13 bibliotecas del Área metropolitana -del Valle de Aburrá, 12 bibliotecas especializadas, 4 de la Fundación -Ratón de Biblioteca, Centros de documentación de ambiente, Planeación -Municipal, Buen Comienzo y repositorio digital de la Secretaría de -Salud, Archivo Histórico de Medellín y Biblioteca Pública Piloto de -Medellín. - -Estrategia de posicionamiento (mercadeo digital) - -En la última sección la página cuenta con contenidos generales enfocados -al fortalecimiento de capacidades de los usuarios: MOOCs-cursos en -línea, comunidad de bibliotecólogos, eventos del libro, Hay Festival, -Fundación Letra Verde y Comunidad de Cinéfilos. - -Otros servicios digitales (conocimiento colaborativos, chats virtuales, -aplicaciones, videojuegos, etc\\...) - -App, escaneo de código de barras o código ISBN y se accede a la -localización y disponibilidad del documento, tutoriales de acceso al -App, plataforma OverDrive, y catálogo. - -Contacto - -(57-4) 511 51 98 rflorez@fundacionepm.org.co - -Red de Bibliotecas del Banco de la República - -Url - - - -Tipo de biblioteca - -Red de bibliotecas. Institución pública. - -Descripción del\\ -proyecto digital - -La Red de Bibliotecas del Banco de la República está conformada por la -Biblioteca Luis Ángel Arango y 20 bibliotecas más. Además, cuenta con 5 -Centros de Documentación Regionales. - -Financiación y aliados (Redes de colaboración) - -Público - -General, teniendo en cuenta que ofrece contenidos académicos, -pedagógicos, locales, patrimoniales y de interés general que trasciende -el perfil de un público infantil y adolescente como es el llamado a las -bibliotecas públicas. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Cuenta con acceso limitado para afiliados de las bibliotecas de la Red, -en cuanto a documentos en las plataformas licenciadas, y acceso abierto -a contenidos propios y a catálogos para toda clase de público, socio o -no. - -Política de creación de colecciones digitales - -Sí. La Biblioteca Virtual se propone como una extensión de la biblioteca -física que promueve el conocimiento de su colección bibliográfica y -audiovisual. Las colecciones digitales tienen énfasis sobre Colombia o -de autores colombianos. Tiene colecciones para préstamo digital en los -campos generales del conocimiento, incluida la música, en donde hay una -oferta más concentrada. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sí. El proyecto Pacífico Colombiano incluye información sobre contenidos -tanto físicos como virtuales del Pacífico Colombiano; Fonoteca incluye -digitalizaciones de documentos analógicos; publicaciones monográficas y -revistas son representaciones digitales de la publicación en papel. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -CMS Drupal para la página web. Plataforma de préstamo de libros de -editoriales McGraw Hill, Bilineata Publishing, Manuvo, Digitalia -Hispánica y Pearson educación. Plataforma de biblioteca virtual: -Contentdm versión 1.0.0 de OCLC. Plataforma de catálogo bibliográfico: -Absys Net. - -Perfil de usuarios - -General. Niños, jóvenes, adultos. - -Acceso a contenidos (¿personal carnetizado o todos?) - -Acceso a los servicios a través del carné de las bibliotecas. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -Conformada por siete secciones (actividad cultural del Banco, áreas -culturales en el país, arte y numismática, bibliotecas, BVirtual, Museo -del Oro y música) en el front superior horizontal, y una taxonomía en -los laterales izquierdos que direccionan en cada sección a información -de interés. Los contenidos centrales son informativos. La sección de -Bibliotecas muestra un menú izquierdo con vínculos a secciones de -contenido de la página: noticias, servicios, colecciones, recursos -electrónicos y clubes de lectura. En la zona central direcciona al -catálogo, la biblioteca virtual y proyectos digitales. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Cuenta con tres tipos de contenidos: colecciones digitales, proyectos -digitales y recursos electrónicos. Están disponibles para consulta -online y préstamo digital con descarga en computadores y otros -dispositivos electrónicos: En la sección Biblioteca virtual se -concentran los contenidos digitales de acceso gratuito en colecciones y -proyectos digitales, así como los recursos electrónicos con consulta -restringida únicamente a socios de la Red. Las colecciones digitales -están conformadas por libros de títulos colombianos, latinoamericanos y -de diversas regiones del mundo tales como publicaciones de libros y -revistas del Banco de la República, Biblioteca Básica de pueblos -indígenas y Biblioteca de literatura Afrocolombiana del Ministerio de -Cultura, Biblioteca Familiar Colombiana, publicaciones del Centro de -Memoria, Paz y Reconciliación, del Centro de Memoria Histórica, Comisión -Colombiana del Océano, Fundación Ética Mundial, Leer el Caribe, Libro al -Viento, Monografías de FIAN, Observatorio de Discriminación Racial y -SENA. Otras colecciones son la Hemeroteca Digital Histórica, tesis y -artículos académicos, galería de imágenes, cartografía histórica y -videos producidos por el Banco de la República. Los proyectos digitales -incluyen exposiciones en línea de carácter cultural y educativo, en su -mayoría sobre Colombia o con temáticas y autores colombianos, la -Fonoteca, así como proyectos web orientados a público escolar: Ayuda de -tareas --- que apoya los procesos de aprendizaje de niños y jóvenes en -edad escolar con información sobre arte, música, literatura, historia, -política, economía y ciencias naturales--- y Biografías, que incluye la -biografía de más de 550 personajes colombianos. Los recursos -electrónicos están conformados por bases de datos por suscripción y -bases de datos de acceso abierto, revistas y libros electrónicos. - -Formatos - -ePub, pdf, jpg, mp3, multimedia. - -Gestión de derechos de autor - -La entidad paga una licencia a las plataformas de préstamo. El acceso a -los contenidos de la Biblioteca Virtual, así como el enlace a otras -páginas, es gratuito, siempre y cuando se realice en un solo ejemplar -para uso privado y sin fines de lucro. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -La plataforma Contentdm centraliza y es el repositorio de los contenidos -digitales de acceso gratuito. El catálogo bibliográfico es -respectivamente para las colecciones analógicas. - -Estrategia de posicionamiento (mercadeo digital) - -Se realiza a través de la página web haciendo relevancia de los -contenidos y la agenda cultural del momento. - -Otros servicios digitales (conocimiento colaborativos, chats virtuales, -aplicaciones, videojuegos, etc\\...) - -Catálogo en el celular, tutorial de acceso y uso del catálogo -bibliográfico. - -Contacto - -Natalia Ruiz Rodgers - Biblioteca Luis Ángel Arango: Calle 11 \\# 4-14, -teléfono: (571) 3431224 - -Red Nacional de Bibliotecas Públicas - -Url - -[www.bibliotecanacional.gov.co/rnbp/](http://www.bibliotecanacional.gov.co/rnbp/){.azul} - -Tipo de biblioteca - -Red de bibliotecas. Institución pública. - -Descripción del\\ -proyecto digital - -Red que articula e integra 1.444 bibliotecas públicas estatales del país -y sus servicios bibliotecarios en orden departamental, distrital, -municipal, rural, territorios indígenas y comunidades afrocolombianas, -bajo la coordinación del Ministerio de Cultura mediante la Biblioteca -Nacional de Colombia. En su versión digital cuenta con un portal web que -incluye dos secciones destinadas a: recursos digitales y al sistema de -información en línea para la red de bibliotecas afiliadas. - -Financiación y aliados (Redes de colaboración) - -Red del orden nacional. Funciona con presupuesto del Ministerio de -Cultura y las administraciones locales coordinan las bibliotecas a nivel -local. Las administraciones municipales y departamentales, adicional a -sus recursos propios, cuentan con fuentes de financiación con -destinación a proyectos culturales como las bibliotecas. Estos son: -Sistema General de participaciones, SGP, recursos de libre inversión, -SGP, Conpes de Primera Infancia, estampilla Procultura Municipal, -recursos del impuesto al consumo a la telefonía móvil. Otras fuentes de -financiación nacionales son: Plan Nacional de Lectura y Escritura, -Programa Nacional de Concertación Cultural, Programa Nacional de -Estímulos, comercialización de bienes y servicios (alquiler de espacios, -reprografía, entre otros), donaciones del sector privado, participación -en convocatorias locales, regionales, nacionales e internacionales, -presentación de proyectos a fundaciones u organismos internacionales, y -apoyo de proyectos de responsabilidad social empresarial. - -Público - -Comunidad en general a nivel nacional. - -Políticas de acceso y sistemas de datos (¿acceso libre y datos -abiertos?) - -Los servicios en línea del sistema de información SIISE, incluyen un -formulario único de registro y otro de estadísticas, están restringidos -a las bibliotecas de la Red. Los demás contenidos del portal son de -acceso abierto para el público de la Web. - -Política de creación de colecciones digitales - -Sí. Tiene tres enfoques: colecciones en la Caja Abierta de Herramientas -que contiene recursos enfocados en la administración, lineamientos y -políticas para la gestión en las bibliotecas públicas de la Red; -recursos para la lectura desarrollados por la Biblioteca Nacional; y el -manual de ideas inspiradoras, una micrositio dirigido a la formación de -comunidades rurales entorno a la biblioteca. Cuenta con 29 contenidos, o -ideas innovadoras, con temáticas diferentes. - -¿Existe una estrategia o relación entre la colecciones digitales y -analógicas? - -Sólo para algunos contenidos de la caja abierta de herramientas que han -sido elaborados inicialmente en forma analógica. - -Tipo de plataforma (nombre, desarrollador o implementador, última -actualización) - -CMS Drupal para la página web; sin embargo está en proceso de migración -a la plataforma SharePoint de Microsoft. Catálogo bibliográfico: Koha - -Perfil de usuarios - -Jóvenes, niños y familias. - -Acceso a contenidos (¿personal carnetizado o todos?) - -El acceso a contenidos del catálogo y del sistema SIISE está -condicionado a la vinculación y registro en la Red. Los demás contenidos -son de acceso abierto. - -Estructura de navegación o arquitectura de información (menú y niveles -de navegación) - -La página web puede encontrarse a través de la web de la Biblioteca -Nacional de Colombia en donde ocupa una sección en la página de inicio y -desde allí hace enlace al portal individual en el tercer clic de -búsqueda. Está conformada por 7 secciones (Quiénes somos, planes y -proyectos, recursos digitales, SIISE en línea, preguntas frecuentes y -contactos). Esta misma navegación es persistente en la columna izquierda -en todas las secciones, en donde al tiempo despliega los contenidos -específicos de cada sección seleccionada, siendo el cuarto clic de -búsqueda y un quinto para acceder a los recursos digitales. Los accesos -en la sección del Sistema SIISE son del tipo paso a paso. - -Tipos de contenido (digitalizado, propio-comunidad, comprado o -suscripción, institucional) - -Informativos y orientativos para la gestión bibliotecaria de la red: a -través de la Caja Abierta de Herramientas y el Sistema SIISE. Recursos -bibliográficos: a través del catálogo que despliega registros -bibliográficos y recursos digitales incorporados en el mismo -relacionados con los libros de la dotación básica que proporciona el -Ministerio de Cultura para las bibliotecas de la Red. Recursos para la -lectura en digital: acceso a algunos contenidos digitales desarrollados -por la Biblioteca Nacional: Gaboteca, Biblioteca Básica de la Cultura -Colombiana, Libros y Cartillas Digitales de la Biblioteca Nacional; y el -aparte de Recomendados digitales organizado a través de etiquetas: -compartir y transferir, crear, escuchar, formarse, informarse, -investigar, leer, usar tabletas, y ver, los cuales incluyen enlaces a -contenidos relacionados; sin embargo algunos de ellos repetidos. -Recursos para la formación: manual de ideas inspiradoras, una micrositio -dirigido a la formación de comunidades rurales en torno a la biblioteca. -Cuenta con 29 contenidos, o ideas innovadoras, con temáticas diferentes. - -Formatos - -ePub, pdf, html, mp3. - -Gestión de derechos de autor - -Los contenidos digitales de la plataforma están en dominio público. -Otros contenidos digitales ofrecidos a la red para la lectura en -tabletas tienen restricción de uso, el cual es limitado a la tableta. - -Integración a sistema de información (OPAC, catálogo colectivo, bases de -datos) - -Los sistemas con que cuenta la Red funcionan cada uno de forma -individual. En la página no existe un sistema que busque y recupere -información. - -Estrategia de posicionamiento (mercadeo digital) - -La principal estrategia de posicionamiento se hace a través de noticias -en la página web y redes de la Biblioteca Nacional. - -Otros servicios digitales (conocimiento colaborativo, chats virtuales, -aplicaciones, videojuegos, etc\\...) - -Servicio de la Llave del Saber utilizada por todas las bibliotecas de la -Red. Distribución de tabletas en las bibliotecas de la Red con -contenidos digitales para la lectura. - -Contacto - -Sandra Suescún Barrera, Coordinación Nacional de Servicios -Bibliotecarios -Coordinadora (57-1) 3816464 ext. 3270 - ------------------------------------------------------------------------- - -Biblioteca Departamental del Valle del Cauca - -Url - -[www.labibliotecadigital.com/inicio.html](http://www.labibliotecadigital.com/inicio.html){.azul}\\ -[Publicaciones](http://www.bibliovalle.gov.co/publicaciones.php/publicacion/titulo/Buscador-APFFVC){.azul}\\ -[Exposiciones -vitruales](http://expovirtuales.bibliovalle.gov.co/){.azul}\\ - -Tipo de biblioteca - -Pública Departamental, cabeza de la Red Departamental de Bibliotecas -Públicas del Valle del Cauca. - -Descripción del\\ -proyecto digital - -La Biblioteca Departamental del Valle promueve la identidad y diversidad -cultural, conservando y difundiendo el patrimonio del Valle del Cauca- -Es la cabeza de la Red Departamental de Bibliotecas Públicas del Valle -del Cauca. En su versión digital cuenta con una página web institucional -que muestra tres iniciativas digitales: Biblioteca Digital, una -herramienta que hace enlace a otros recursos digitales de diferente -orden y para todos los públicos. El repositorio del Archivo Fotográfico -del Valle del Cauca, y la aplicación sobre exposiciones virtuales con -temáticas del Valle del Cauca que usa los contenidos originales del -Archivo Fotográfico. - -Financiación y aliados (Redes de colaboración) - -Del Archivo fotográfico: Universidad ICESI\\ -De la herramienta Biblioteca Digital: Fundación Carvajal y Alcaldía de -Cali.\\ -De las exposiciones virtuales: Universidad Autónoma de Occidente, -Gobernación del Valle y MinCultura. - -Público - -General - -Plataforma y contenidos - -Nombre del producto digital - -Tipo de contenido - -Tipo de acceso - -Gestión de derechos - -Integrado a otros servicios - -Plataforma - -Relevancia del contenido - -Contacto - -Archivo del Patrimonio Fotográfico y Fílmico del Valle del Cauca - -Fotografías históricas y contemporáneas del Valle del Cauca. - -Abierto a través de la página de la Biblioteca Departamental. - -Biblioteca Departamental Calle 18 No. 122-135, Cali-Colombia Teléfono: -+57 (2) 555 2334 \\| Fax: +57 (2) 555 1441 - -No - -Dspace - -Sí. Para integrar a un repositorio local o nacional. - -Lisney Guayara - Calle 5 No. 24A - 91 Teléfono: 6200400 - -Biblioteca Digital - -Enlace 7.500.000 páginas a través de 9 temáticas. - -Abierto a través de la página de la Biblioteca Departamental. - -Fundación Carvajal - -No - -Desarrollo propio de la Fundación Carvajal - -No - -Exposiciones virtuales - -4 exposiciones virtuales sobre temas de Cali que usan documentos del -Archivo del Patrimonio Fotográfico y Fílmico del Valle. - -Abierto a través de la página de la Biblioteca Departamental. - -Universidad Autónoma de Occidente - -No - -Drupal - -Sí. Para integrar a un repositorio local o nacional. - ------------------------------------------------------------------------- - -Red de Bibliotecas públicas de Cali - -Url - -[http://www.cali.gov.co](%20http://www.cali.gov.co/cultura/publicaciones/110128/red_de_bibliotecas_publicas_de_cali_landing/){.azul}\\ -[Archivo fotográfico de -Cali](http://www.archivofotograficoymemoriahistorica.org/home_archivofotografico/){.azul}\\ -[Experiencias de Leer es una -nota](http://www.cali.gov.co/cultura/publicaciones/108473/programa_leer_es_una_nota/){.azul} - -Tipo de biblioteca - -Pública Municipal. Cabeza de la Red Municipal de Bibliotecas de Cali - -Descripción del\\ -proyecto digital - -La Red de Bibliotecas Públicas de Cali, la Casa de las Ideas, es un -programa de la Secretaría de Cultura y Turismo del municipio conformada -por 62 espacios, en su mayoría ubicados en sectores de prioridad social: -5 bibliotecas temáticas, 49 bibliotecas locales, 4 centrales didácticas -y 5 centros culturales, entre los que está el Centro Cultural de Cali. - -Financiación y aliados (Redes de colaboración) - -Alcaldía de Cali -- Secretaría de Cultura y Turismo de Cali -- Fundación -Carvajal. - -Público - -General - -Plataforma y contenidos - -Nombre del producto digital - -Tipo de contenido - -Tipo de acceso - -Gestión de derechos - -Integrado a otros servicios - -Plataforma - -Relevancia del contenido - -contacto - -Archivo Fotográfico de Cali -- imagen y memoria local - -Fotografías de álbumes familiares y personales; con la participación de -líderes juveniles de los sectores de prioridad social y la comunidad -misma. - -Abierto - -Red Municipal de Bibliotecas y Alcaldía de Cali - -No. Reposa en la página web institucional. - -Sí. Para integrar a un repositorio local o nacional. - -Luz Adriana Betancourt Lorza Dirección: Carrera 5 \\# 6-05 -Teléfono:(57+2) 8961965 - -Leer es una nota - -Experiencias del programa de lectura. - -Canal You Tube - -Red Municipal de Bibliotecas y Alcaldía de Cali - -No. Reposa en la página web institucional - -Exposiciones virtuales - -4 exposiciones virtuales sobre temas de Cali que usan documentos del -Archivo del Patrimonio Fotográfico y Fílmico del Valle. - -Abierto a través de la página de la Biblioteca Departamental. - -Universidad Autónoma de Occidente - -No - -Drupal - -Sí. Para integrar a un repositorio local o nacional. - ------------------------------------------------------------------------- - -Corporación Cultural Biblioteca Departamental Norte de Santander - -Url - -[http://www.bibliocucuta.org/](%20http://www.cali.gov.co/cultura/publicaciones/110128/red_de_bibliotecas_publicas_de_cali_landing/){.azul}\\ -[Archivo Fotográfico Norte de Santander y ciudad de -Cúcuta](http://www.archivofotograficoymemoriahistorica.org/home_archivofotografico/){.azul}\\ -[Red Departamental](https://www.facebook.com/RedBiblioNorte){.azul} - -Tipo de biblioteca - -Pública Departamental. Cabeza de la Red Departamental de Bibliotecas de -Norte de Santander. - -Descripción del\\ -proyecto digital - -La Biblioteca Departamental de Norte de Santander Julio Pérez Ferrero es -un centro cultural, social y educativo al servicio de la comunidad -nortesantandereana y fronteriza. Protagonista activa en la construcción -de la identidad a través de la conservación del patrimonio -arquitectónico, bibliográfico, hemerográfico, documental y fotográfico -de la región. Cuenta con una oferta de servicios bibliográficos, -alquiler de espacios y servicios en línea a través del Repositorio Norte -de Santander que tiene como objetivo facilitar y mejorar la visibilidad -y preservación del contenido fotográfico Histórico del departamento. - -Financiación y aliados (Redes de colaboración) - -Recursos propios, Gobernación de Norte de Santander, MinCultura, -Secretaría de Cultura de Cúcuta, Comfanorte, Secretaría de Despacho Área -Cultural y Turismo de Cúcuta - -Público - -General - -Plataforma y contenidos - - ----------------------------------------------------------- ------------------------------------------------------------------------------------------- ---------------------- ----------------------------------------------- -------------------------------------------- ------------------------ ------------------------------------------------------ ----------------------------------------------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - Archivo Fotográfico Norte de Santander y ciudad de Cúcuta Colección de fondos fotográficos seleccionados por temas, regiones, lugares y escritores. Abierto Biblioteca Departamental No. Reposa en la página web institucional. Dspace. Código abierto Sí. Para integrar a un repositorio local o nacional. Alix Xenaida Pérez\\ - Teléfono: 3124778166\\ - Correo electrónico:\\ - adminrepositorio@bibliocucuta - - Página Facebook de la Red Departamental @RedBiblionorte Promoción e información de actividades de la Red.C Abierto - invitación Política de contenidos y derechos de Facebook No Facebook No Avenida 1 No 12-35 Barrio la Playa -- CUCUTA\\ - 5723186\\ - soportecnico@bibliocucuta.org\\ - ----------------------------------------------------------- ------------------------------------------------------------------------------------------- ---------------------- ----------------------------------------------- -------------------------------------------- ------------------------ ------------------------------------------------------ ----------------------------------------------- - ------------------------------------------------------------------------- - -Biblioteca Departamental del Meta "Eduardo Carranza" - -Url - -[http://www.bibliotecaeduardocarranza.gov.co/](%20http://www.bibliotecaeduardocarranza.gov.co/){.azul}\\ -[Biblioteca -Digital](http://www.bibliotecaeduardocarranza.gov.co/#){.azul}\\ -[Red Departamental](https://www.facebook.com/RedBiblioNorte){.azul} - -Tipo de biblioteca - -Pública Departamental. Cabeza de la Red Departamental de Bibliotecas del -Meta. - -Descripción del\\ -proyecto digital - -La Biblioteca Digital es una de las secciones de la página web de la -Biblioteca Departamental. Tiene contenidos en diferentes formatos, -libros, fotografía y audiovisuales relacionados con temáticas sociales, -culturales y educativas representados por los municipios del -departamento. Rescata la producción de autores llaneros. La plataforma -hipervincula los contenidos con las bibliotecas que los ha producido o -temáticamente se relacionan. Se encuentra aún en construcción. - -Financiación y aliados (Redes de colaboración) - -Gobernación del Meta, Ministerio de Cultura. - -Público - -General - -Plataforma y contenidos - - ----------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------- ----------------------------------- ----------------------------- ---------------------- --------------------------------------------------------------------------------- ---------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido Contacto - Libros patrimoniales: 63 libros con su ficha de inventario de bien cultural mueble y descarga. Acceso a libros y fotografías relacionados con los municipios del Departamento, enlazados a las bibliotecas municipales de la Red. Abierto Biblioteca Departamental del Meta No JavaScript, XML- php Sí. Para integrar a un repositorio local o nacional. Requiere aún construcción. - ----------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------- ----------------------------------- ----------------------------- ---------------------- --------------------------------------------------------------------------------- ---------- - ------------------------------------------------------------------------- - -Biblioteca Digital Héctor Rojas Herazo especializada en el Caribe -Colombiano. Universidad del Norte de Barranquilla - -Url - -\\ -[http://guayacan.uninorte.edu.co/](http://guayacan.uninorte.edu.co/biblioteca_digital/index.asp){.azul} - -Tipo de biblioteca - -Desarrollo institucional de la Universidad del Norte de Barranquilla. - -Descripción del\\ -proyecto digital - -La Biblioteca Digital Héctor Rojas Herazo tiene como objetivo potenciar -la expansión de la cultura del Caribe colombiano a través de la -utilización y aplicación de los medios tecnológicos a obras relevantes -de carácter científico, social y humanístico representados en materiales -digitalizados de diferentes tipos (libros y documentos existentes -impresos, en forma digital, audiovisuales y otros). - -Financiación y aliados (Redes de colaboración) - -Universidad del Norte. - -Público - -General - -Plataforma y contenidos - - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------- ---------------------------------------- -------------------------------------------- ------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------- - Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - Memoria visual del caribe colombiano. Revistas digitales de la Universidad. Museo Virtual de Estética. Catálogo de realizadores audiovisuales de la costa caribe Abierto, Lectura en plataforma -repositorio institucional- y descarga de contenidos. Biblioteca Digital Héctor Rojas Herazo Los metadatos al repositorio institucional Repositorio Dspace y plataforma de la página web Microsoft Sí. Está recogiendo documentos patrimoniales y actuales bajo licencia de derechos de autor a cargo de la biblioteca sobre la memoria local del caribe. Marlem Uribe Marenco\\ - Coordinadora\\ - Colecciones Digitales\\ - Biblioteca Karl C. Parrish\\ - Teléfono: 3509224 extensión 4405\\ - Correo electrónico: mauribe@uninorte.edu.co - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------------------------------------------------------------------------------------- ---------------------------------------- -------------------------------------------- ------------------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------- - ------------------------------------------------------------------------- - -El libro total: la biblioteca digital de América - -Url - -[http://www.reddebibliotecas.org.co](http://www.reddebibliotecas.org.co/sala-lectura/el-libro-total){.azul}\\ -[Institución](http://www.ellibrototal.com/ltotal/newltotal/){.azul} - -Tipo de biblioteca - -Particular, para lectura online. - -Descripción del\\ -proyecto digital - -Conformada por diferentes colecciones de libros y audiolibros gratuitos -para lectura online sin permitir descarga: colección de clásicos, -literatura infantil, selección de obras hispanoamericanas (Argentina, -Chile, Colombia, Cuba, Ecuador, España, México, Perú, Uruguay, -Venezuela) y de otros países. - -Financiación y aliados (Redes de colaboración) - -Fundación El Libro Total. - -Público - -General - -Plataforma y contenidos - - ------------------------------------------------- ------------------------------------------------------------------------------------------------------- ---------------------- ----------------------- ----------------------------- -------------------------------------- -------------------------- ------------------------------------------------------------------- - Nombre del producto digital Tipo de contenido Tipo de acceso Gestión de derechos Integrado a otros servicios Plataforma Relevancia del contenido contacto - - El Libro Total la biblioteca digital de América Libros y audiolibros de clásicos de literatura, obras infantiles y selección obras hispanoamericanas. Consulta sólo online Fundación Libro Total No Propietaria de Fundación Libro Total Sí Calle 35 No 9-81, Casa del Libro Total, Bucaramanga - Santander.\\ - contactenos@syc.com.co;\\ - Teléfono: (7) 6343558. - ------------------------------------------------- ------------------------------------------------------------------------------------------------------- ---------------------- ----------------------- ----------------------------- -------------------------------------- -------------------------- ------------------------------------------------------------------- - ------------------------------------------------------------------------- - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Buenas prácticas para tener en cuenta en Bogotá {#buenas-prácticas-para-tener-en-cuenta-en-bogotá .azul .semibold .centrar .mayusculas .interlineado1} - -A la luz del ejercicio de comparación realizado, se puede decir sobre -BibloRed lo siguiente: - -- La BibloRed no es la Biblioteca Digital de Bogotá. -- La BibloRed se está estructurando para tener contenidos digitales y - servicios de préstamo digital. Es un trabajo en construcción y aún - no tiene mediciones de resultados. -- Los recursos y contenidos digitales producidos por algunos miembros - de la Red que incluyen la comunidad, no hacen parte de la oferta de - contenidos a mediano y largo plazo para la totalidad de la Red. - Éstos están claramente expuestos a pérdida en la medida que no - existe una estrategia de preservación definida y su circulación es - limitada. -- Los responsables en BibloRed coinciden en que el proyecto de una - Biblioteca Digital para Bogotá es de más largo aliento. Incluye a la - comunidad en sus intereses y producción de contenidos, y la oferta - de información es pertinente a Bogotá, en especial lo relacionado - con contenidos patrimoniales. -- Sobre la cooperación, BibloRed coopera en sí misma, pero no lo hace - con otras bibliotecas de la ciudad. -- La infraestructura tecnológica de BibloRed (área de sistemas) - trabaja con servicios tercerizados y su planta de personal es baja. -- No existen gestores digitales en la planta de personal, lo que - impacta en el seguimiento de la estrategia digital ya iniciada y en - la potencialización de los servicios, su planeación y futuro. - -BibloRed podría mejorar su capacidad revisando las siguientes prácticas -basadas esencialmente en la cooperación e integración. Por tanto, se -sugiere: - -- Ampliar la articulación de la Red para otras bibliotecas de la - ciudad con propósitos afines, es el caso de las bibliotecas de cajas - de compensación, bibliotecas escolares, Biblioteca Nacional, - Biblioteca Luis Ángel Arango, Archivo Distrital, centros de - documentación, bibliotecas digitales y bases de datos de y en la - ciudad . -- Aumentar la capacidad de bases de datos de acceso abierto como lo - hace la Red del Banco de la República. -- Capitalizar los contenidos desarrollados por la comunidad y en - especial generar una política de almacenamiento, seguridad y - preservación digital. -- Desarrollar contenidos locales a partir de las colecciones sobre la - ciudad, las experiencias de promoción de lectura y demás actividades - que involucren a la comunidad. -- Desarrollar estrategias o herramientas de formación en una - experiencia similar a la Red de Bibliotecas-EPM, MOOCs-cursos en - línea. -- Ampliar la estrategia de circulación y difusión de contenidos - digitales utilizando algunos espacios de la infraestructura de la - ciudad, tales como estaciones de transporte o centros de - información, entre otros. -- Incluir o destacar páginas de medios de comunicación (radio y - televisión) de la ciudad. -- Integrar en una sola interfaz de búsqueda los diferentes contenidos - que se presentan a través de la página web. -::: -::: - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Recomendaciones en la infraestructura tecnológica {#recomendaciones-en-la-infraestructura-tecnológica .azul .semibold .centrar .mayusculas .interlineado1} - -BibloRed ya ha iniciado una línea de infraestructura para la -organización de sus contenidos digitales. La primera indicación al -respecto es concluir el segundo año de implementación y hacer un estudio -de la pertinencia y uso, analizando estadísticas de uso de contenidos y -en especial, el análisis de la plataforma de préstamo como integrador. - -Dado que las sugerencias en el ítem anterior se enfocan en ampliar los -colaboradores en el plano digital de la red, se requerirá un trabajo -orientado a mejorar la integración de la información a través del CMS de -la página web y las plataformas que utiliza. - -Diferentes acciones pueden abordarse: - -- En términos del sistema de administración de contenidos --CMS- de - forma tal que se realicen cosechas globales o incrementales por - protocolo OAI. Como ejemplo, se puede consultar la nueva interfaz de - la Biblioteca Nacional de Chile que opera con un CMS propietario de - la empresa chilena Newtemberg, o el uso de SOLR, un motor de - búsqueda de código abierto basado en la biblioteca Java del proyecto - Lucene, con APIs en XML/HTTP y JSON, y el CMS Drupal como por - ejemplo: Islandora (http://islandora.ca/) que es una solución madura - Fedora + Solr + repositorio Drupal, utilizada en instituciones como - la Biblioteca Nacional de España. -- Mejorar los servicios de integración de recursos a través de las - búsquedas federadas, las cuales permiten, al lanzar una consulta - simultánea a los diferentes recursos de información, obtener un - acceso integrado a los recursos. Supone algo más que una simple - búsqueda cruzada. Comienza identificando el recurso y termina con la - disponibilidad de la información: tan fácil como Google pero mejor. - Al respecto se sugiere consultar el metabuscador de ExLibris, - teniendo en cuenta que es el proveedor de los servicios del catálogo - bibliográfico. Adicionalmente, otra herramienta para servidor de - enlaces que también puede revisarse a través del producto es SFX de - ExLibris. - -Por otra parte, un aspecto en el que BibloRed debe hacer especial -énfasis es en el equipo de gestión de contenidos digitales, actualmente -inexistente. Este equipo deberá tener las competencias para trabajar de -forma interdisciplinar de forma tal que pueda desarrollar actividades -como: - -- Producción, diseño y edición de contenidos y productos digitales -- Selección y evaluación de contenidos y productos digitales -- Construcción de taxonomías de contenidos -- Injerencia en las decisiones tecnológicas -- Un equipo así requerirá como mínimo un editor digital, diseñador web - digital, programador con experiencia en contenidos para web y - referencistas virtuales. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/nacional.html' - ] - }, - GrafoscopioNode { - #header : 'Bibliotecas Digitales Internacionales: ¿Qué están haciendo y cómo se están pensando?', - #body : ' -# BIBLIOTECAS DIGITALES INTERNACIONALES: ¿Qué están haciendo y cómo se están pensando? {#bibliotecas-digitales-internacionales-qué-están-haciendo-y-cómo-se-están-pensando .tituloi .mayusculas} - -Por: María Alejandra Pautassi -::: - -::: {.flex} -::: {.ancho1 .descripcion .ajuste .flexv .flexceh} -El objetivo del \'benchmarking\' internacional es conocer el estado del -arte y distintos modelos de biblioteca digital implementados por algunos -sistemas de bibliotecas públicas en el mundo, cuyos objetivos y -particularidades son similares o se pueden relacionar con los de -BibloRed. Para esto se tuvieron en cuenta las características de -Biblioteca Digital de Bogotá establecidas en el capítulo ["¿Una -biblioteca digital de Bogotá? Definiciones y -aproximaciones"](aproxdef.html){.azul}: un lugar de memoria, de -encuentro para la creación, de articulación y entre territorio, -conocimiento y experiencia lectora, de exploración de diversas -modalidades de leer, de acceso y repositorios, que fomenta la -deliberación y el aprendizaje colaborativo. - -Sin embargo, y a pesar de que estas instituciones se han dedicado cada -vez más a digitalizar sus colecciones y darles acceso en línea, no hay -un método estándar para evaluar las bibliotecas digitales. Por lo tanto, -partimos de la definición de biblioteca digital que aparece en el -"Manifiesto de las IFLA/Unesco sobre las bibliotecas digitales": - -"Una biblioteca digital es una colección en línea de objetos digitales -de buena calidad, creados o recopilados y administrados de conformidad -con principios aceptados en el plano internacional para la creación de -colecciones, y que se ponen a disposición de manera coherente y -perdurable y con el respaldo de los servicios necesarios para que los -usuarios puedan encontrar y utilizar esos recursos\\... - -La misión de las bibliotecas digitales consiste en proporcionar acceso -directo a recursos informativos, digitales y no digitales, de manera -estructurada y fiable, para de esa manera vincular la tecnología de la -información, la educación y la cultura en las bibliotecas actuales...". -Tomado del [Manifiesto de las IFLA/Unesco sobre las bibliotecas -digitales](http://www.ifla.org/ES/publications/manifiesto-de-las-ifla-unesco-sobre-las-bibliotecas-digitales.){.azul -.semibold} - -Nos guiamos, además, por la definición de DELOS.org: "Su principal -función \\[la de una biblioteca digital\\] pasó del almacenamiento -estático y la recuperación de información a propiciar la comunicación, -la colaboración y otras formas de interacción entre científicos, -investigadores o el público en general en temas que son pertinentes a la -información almacenada en la biblioteca digital". - -Tuvimos en cuenta sistemas de bibliotecas públicas con experiencias -enmarcadas en un ámbito local, que se entendieran como parte de un -territorio y como constructoras de identidades, bien fuera de ciudades o -países, que hubieran implementado una biblioteca digital (o incursionado -en la creación y diseminación de colecciones y servicios digitales), que -hubieran desarrollado una política de creación de colecciones digitales -con materiales de diverso tipo y/o hubieran desarrollado una estrategia -de producción de contenidos que involucre a la comunidad o de -recuperación de contenidos locales. - -Es de notar que el término \'biblioteca digital\' es usado de distintas -maneras por las instituciones analizadas. En la Biblioteca Pública de -Nueva York, por ejemplo, se hablaba hasta 2008 de \'Programa de -Biblioteca Digital\' para referirse a distintos procesos que se llevaban -a cabo dentro de la biblioteca: digitalización, creación de metadatos y -curaduría de colecciones y exposiciones virtuales. Para las bibliotecas -públicas de la Región Flamenca de Bélgica se trata de un sistema central -de bibliotecas interoperables (catálogos, servicios, colecciones -digitales, etc.). El Sistema de Bibliotecas Públicas de Chile bautizó -\'Biblioteca Pública Digital\' a su plataforma de préstamo de libros -digitales, aunque tiene además colecciones digitales de documentos -patrimoniales y un Archivo Colaborativo de Contenidos Locales digitales. -La Biblioteca Pública Digital de América es la única en la que el -término describe tanto sus servicios como su plataforma ---quizá porque -de todas, es la única que desde sus inicios fue pensada para un ámbito -puramente digital---. Todas estas instituciones, sin embargo, cuentan -con uno o varios espacios digitales con contenidos y servicios que -surgen de las necesidades específicas de sus usuarios, ciudadanos o -público objetivo. -::: - -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\\. Digital Public Library of America (DPLA): la biblioteca como -agregadora de contenidos - -2\\. Biblioteca Pública de Nueva York (NYPL Labs): la biblioteca como -laboratorio de innovación - -3\\. Sistema de Bibliotecas Públicas de Flandes: la biblioteca en red -(visión regional y participación local) - -4\\. Sistema de Bibliotecas Públicas de Chile: la biblioteca como -productora de contenidos, un espacio para la memoria - -5\\. Algunas conclusiones -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Digital Public Library of America (DPLA): la biblioteca como agregadora de contenidos {#digital-public-library-of-america-dpla-la-biblioteca-como-agregadora-de-contenidos .azul .semibold .centrar .mayusculas .interlineado1} - -La Biblioteca Pública Digital de América (DPLA, por sus siglas en -inglés) es el resultado de un proceso de planeación que comenzó en -octubre de 2010, cuando un grupo de 40 líderes de bibliotecas, -fundaciones, académicos y expertos en tecnología de Estados Unidos -acordaron trabajar juntos para crear "una red abierta de recursos en -línea que alberga el patrimonio vivo de la nación custodiado por -universidades, bibliotecas, archivos y museos, con el fin de educar, -informar y capacitar a todos los miembros de las generaciones actuales y -futuras". Para ellos, las colecciones digitales que hasta entonces -existían en silos debían existir en un solo lugar con el fin de -facilitar el libre acceso al patrimonio cultural digitalizado -estadounidense de manera coherente. Dos meses después, el Berkman Center -for Internet and Society de la Universidad de Harvard, con recursos de -la Fundación Alfred P. Sloan, convocó a un grupo interdisciplinario de -expertos (bibliotecarios y curadores, humanistas digitales y -programadores) para darle un alcance, diseñar y construir el ambicioso -proyecto. - -El portal de descubrimiento y la plataforma de búsqueda de la DPLA fue -lanzada en abril de 2013. En ese momento contaba con 2.4 millones de -objetos digitales del patrimonio cultural estadounidense, provenientes -de 500 instituciones (bibliotecas, museos, archivos, centros -culturales). Un año después, en abril de 2014, la DPLA ya contenía más -de 7 millones de objetos digitales, provenientes de 1,200 instituciones ----un logro en términos de colaboración interinstitucional pocas veces -visto en el ámbito de las bibliotecas---. Estas instituciones incluyen -tanto pequeñas sociedades históricas locales y bibliotecas públicas -rurales hasta algunos de los museos, archivos y bibliotecas de -investigación más grandes de los Estados Unidos. - -Financiada con dineros públicos y privados, los valores que guían el -trabajo de la DPLA son: - -- Darle la [mayor apertura al patrimonio compartido de los - estadounidenses]{.semibold} (datos, contenidos y colecciones). -- Promover [un fuerte espíritu público, que se basa en la acción - colectiva y la colaboración]{.semibold} de diversas instituciones e - individuos. -- Brindar [acceso libre, gratuito y democrático]{.semibold} por el que - son conocidas las bibliotecas públicas. - -Por otro lado, uno de los principios que ha guiado su estructura -organizacional ha sido el trabajo interdisciplinario y que todos sus -miembros trabajen hacia unos objetivos comunes: "La mayoría de nuestras -actividades requieren necesariamente el trabajo colaborativo de -programadores, expertos en contenido y divulgación". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -### DPLA {#dpla .cafe .extrabold} - -[](http://www.dp.la){.cafe .bloque .margen3} - -*www.dp.la* - -Más de 7 millones de objetos digitales, provenientes de 1,200 -instituciones, desde pequeñas sociedades históricas locales y -bibliotecas públicas rurales hasta algunos de los museos, archivos y -bibliotecas de investigación más grandes de los Estados Unidos. -::: -::: -::: - -::: {.blancof} -![pantalla](images/inter1.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -### Los centros de servicio y contenidos {#los-centros-de-servicio-y-contenidos .azul .semibold .centrar .mayusculas} - -Una de las características fundamentales del funcionamiento de la DPLA -es que está conformada por una de red de más de 40 centros (bibliotecas, -archivos, museos u otras instituciones culturales) a nivel regional o -estatal. Estas instituciones han digitalizado sus colecciones, cumplen -con los estándares de metadatos establecidos por la DPLA y pueden -cosechar los datos de otras instituciones. Para este fin, la DPLA creó -su propia estructura de metadatos (Metadata Application Profile). Este -esquema se diseñó para aprovechar la experiencia del Modelo de Datos -Europeana (EDM, por sus siglas en inglés) y para cruzar con otros -estándares internacionales de metadatos: Dublin Core, ORE y una variedad -de vocabularios controlados y tesauros. También está disponible una -versión preliminar del esquema RDF. En este sentido, los centros son -"agregadores de metadatos", pues los archivos digitales permanecen en el -servidor de la institución madre, aunque estén asociados al catálogo de -la DPLA. -::: - -::: {.blancof} -![pantalla](images/inter2.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -Estos centros se dividen en dos tipos: - -[Centros de contenido (17 en total):]{.semibold} Son grandes -bibliotecas, museos, archivos, entre otros tipo de repositorios -digitales que se relacionan directamente con la DPLA. Por regla general, -estos centros deben estar en la capacidad de aportarle a la DPLA al -menos 200.000 registros de objetos digitales y están obligados a -construir y administrar esos registros, según las políticas de metadatos -establecida por la DPLA. - -[Centros de servicio (20 en total):]{.semibold} Los centros de servicio -son instituciones que albergan y agregan objetos digitales de pequeñas -bibliotecas, museos y otras instituciones culturales de una región o -estado. Estos centros se encargan de recuperar contenidos que describen -la historia e identidad local de su región. Ofrecen servicios de -digitalización, asesorías en la creación de metadatos, y almacenamiento -y preservación digital a las instituciones que cobijan. - -### DPLA apps {#dpla-apps .azul .semibold .centrar .mayusculas} - -Además de ser un portal de contenido para estudiantes, profesores, -investigadores y el público general, DPLA también permite transformar y -darle nuevos usos a los documentos de sus colecciones. Una interfaz de -programación de aplicaciones (API) de datos abiertos (todas sus bases de -datos se pueden descargar sin restricciones), les permite a -desarrolladores, investigadores y bibliotecarios utilizar los contenidos -de la biblioteca para construir nuevos entornos de aprendizaje, -herramientas de descubrimiento y aplicaciones. El código sobre el cual -está construida la plataforma de la biblioteca está disponible en -GitHub. La participación de desarrolladores independientes ha sido -promovida a través de eventos de programación que se llevan a cabo en -distintas bibliotecas, \'newsletters\', foros de programadores, -hackatones, formatos para compartir ideas y talleres. - -La biblioteca de \'apps\' en este momento contiene 34 aplicaciones -desarrolladas por laboratorios de universidades estadounidenses o -europeas, pequeñas y medianas empresas, colectivos y desarrolladores -independientes. Entre los proyectos destacan las visualizaciones de -datos, los videojuegos, los buscadores y los Twitterbots. - -### Otros servicios: OpenEbook {#otros-servicios-openebook .azul .semibold .centrar .mayusculas} - -En tanto agregadora de contenidos de algunas de las bibliotecas y -archivos digitales más prestigiosos de Estados Unidos, la DPLA se ha -hecho a una rica colección de libros digitales (más de 2 millones de -libros en formato PDF e EPUB). Sin embargo, uno de sus principales -aportes para el acceso de los libros digitales en Estados Unidos es el -programa OpenEbook. Fruto de una alianza con la Biblioteca Pública de -Nueva York y la organización sin ánimo de lucro First Book, se trata de -una aplicación con libros de diversos tipos (lanzamientos recientes, -títulos premiados y populares, educativos, de ficción y no-ficción) que -puede ser utilizada de manera gratuita por niños de bajos recursos a -través de la escuela o las bibliotecas. Su objetivo es fomentar el gusto -por la lectura. -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Biblioteca Pública de Nueva York (NYPL Labs): la biblioteca como laboratorio de innovación {#biblioteca-pública-de-nueva-york-nypl-labs-la-biblioteca-como-laboratorio-de-innovación .azul .semibold .centrar .mayusculas .interlineado1} - -La Biblioteca Pública de Nueva York tiene una doble misión. Por una -parte, conforma una de la redes de bibliotecas públicas más grandes en -el mundo (con 88 sedes en tres de los cinco distritos de Nueva York, -atiende a más de 17 millones de usuarios al año). Y, por otra, es una -biblioteca patrimonial que, con cuatro centros de investigación, no -tiene nada que envidiarle a las grandes bibliotecas nacionales del -mundo. Las colecciones de investigación y circulación suman más de 51 -millones de ítems, incluyendo libros digitales y materiales para -personas con discapacidad visual. NYPL Labs, el laboratorio digital de -la biblioteca, ha jugado en los últimos cinco años un papel fundamental -para la difusión de sus colecciones, al igual que para el uso y -apropiación de las mismas. - -Un área independiente de la Biblioteca desde 2011, NYPL Labs es la -sucesora del Programa de Biblioteca Digital (Digital Library Program) -que entre 2000 y 2008 se encargó de digitalizar, producir metadatos y -curar exposiciones digitales, y cuyo legado es la Galería Digital de la -Biblioteca Pública de Nueva York (que contiene más de 800.000 de objetos -digitales). Desde un inicio, su enfoque fue el de experimentar (aunque -con un acceso mínimo a la infraestructura digital de la biblioteca y sin -injerencia en la digitalización de nuevas colecciones) y se centró en -traducir la misión pública de la biblioteca al entorno digital, -aprovechando sus colecciones digitales. La unidad de trabajo fue -concebida como una productora \'in-house\' de proyectos curatoriales -colaborativos y su trabajo pensado de manera transdisciplinar, buscando -que "los curadores empezaran a pensar como diseñadores y programadores, -y viceversa". -::: - -::: {.blancof} -![pantalla](images/inter3.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -Para 2016 NYPL Labs, que en sus inicios estaba compuesto por cuatro -personas, contaba con un equipo de treinta personas y centralizaba las -principales operaciones de una biblioteca digital (15 se ocupaban de la -digitalización, 5 de la creación metadatos, 3 de nuevos desarrollos y -visualización de producto, 2 de permisos y reproducciones, 4 -exclusivamente del proyecto de préstamos de libros digitales y una -dedicada a trabajar con la comunidad). Por otro lado, sus proyectos son -transversales a distintas áreas de la biblioteca: en ellos se trabaja de -la mano con los curadores de las 26 áreas de investigación, los -catalogadores, un abogado especializado en derechos de autor y el equipo -encargado de la página web y las comunicaciones. En palabras de su -director durante 5 años, Ben Vershbow, "la digitalización ahora es -pensada como un principio y no un fin en sí mismo, el comienzo de un -proceso de transformación e interacción por parte de los usuarios que -termina en nuevas colecciones y series de datos nacidos en un entorno -digital". - -### Curaduría colaborativa y datos abiertos {#curaduría-colaborativa-y-datos-abiertos .azul .semibold .centrar .mayusculas .interlineado1} - -Unas de las primeras necesidades de las que se ocupó [NYPL -Labs]{.semibold} fue propiciar el descubrimiento, uso y apropiación de -los miles de objetos que componían la Galería Digital de la biblioteca. -Partiendo de la pregunta ¿qué pasa luego de que digitalizamos un -documento y lo ponemos al acceso del público? y convencidos de que los -metadatos convencionales no terminaban de describir mapas, fotografías y -manuscritos, entre otro tipo de materiales, el equipo se propuso -desarrollar herramientas que permitieran la descripción, corrección y -transcripción colaborativa de millones de objetos. De esta manera, -varios cientos de usuarios podrían asumir una carga de trabajo que a los -catalogadores de la biblioteca les llevaría décadas terminar (la -biblioteca alberga colecciones que llegan a 100.000 ítems), mientras -conocían, modificaban y reutilizaban sus colecciones. - -El primero de estos proyectos fue el Mapwarper, una herramienta en -código abierto que permite georectificar las imágenes de los mapas -históricos de Nueva York en las colecciones de la Biblioteca. Con ella, -los usuarios pudieron empezar a agregarle a los mapas datos (nombres de -calles, puntos de referencia y locaciones patrimoniales)que no eran -inmediatamente reconocibles en su versión digitalizada, facilitando su -búsqueda en el catálogo. La página web, que fue lanzada en 2012, sigue -recibiendo visitas y tiene una activa comunidad de usuarios. Por su -parte, la herramienta ha sido implementada desde entonces en diversas -bibliotecas y archivos del mundo, entre ellos Wikipedia y la Biblioteca -del Congreso. - -A este le siguieron Building Inspector que se vale de Mapwarper para -identificar datos sobre los edificios de Nueva York (direcciones, -materiales con los que fueron construidos, colores, etc.) y los vincula -con otros documentos de la biblioteca (recortes de prensa, fotografías, -directorios telefónicos); What\'s on the Menu, que con una herramienta de -transcripción colaborativa extrae los textos de una colección de menús -históricos que la biblioteca ha digitalizado, lo que permite rastrear la -evolución de las tradiciones gastronómicas de la ciudad (al día de hoy -hay más de un millón de platos transcritos de 17.545 menús); y -Stereogranimator, una herramienta que permite transformar imágenes -estereográficas históricas en las colecciones de la biblioteca y otras -organizaciones a formatos web 3D. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -Colecciones digitales con cerca de un millón de ítems digitalizados, -muchos de ellos de uso libre y sin restricciones: - - -Portal institucional de la Biblioteca Pública de Nueva York que sirve -para informar de eventos, noticias, servicios: - -Catálogo unificado de colecciones digitales: - - -Proyectos más destacados de los laboratorios de innovación: - - -[http://stereo.nypl.org/](http://menus.nypl.org/){.gris} -::: -::: -::: - -::: {.negrof} -![](images/inter4.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -### Library Simplified (software de código abierto para préstamo de libros digitales y app) {#library-simplified-software-de-código-abierto-para-préstamo-de-libros-digitales-y-app .azul .semibold .centrar .mayusculas .interlineado1} - -Hace tres años, el Equipo de NYPL Labs empezó a trabajar en un -desarrollo propio para el préstamo de libros digitales, con apoyo -financiero de la agencia federal estadounidense Institute of Museum & -Library Services. La Biblioteca, que es el mayor comprador de libros -digitales en Estados Unidos y que desde 2010 cuenta con el servicio de -préstamo digital a través del distribuidor OverDrive, se había dado -cuenta de que, pese a las grandes inversiones, pocos usuarios estaban -usando el servicio. Según el programador de NYPL Labs Leonard -Richardson, los usuarios debían realizar 13 pasos para tomar en préstamo -un libro, además de descargar tres aplicaciones distintas para leerlo. -Por otro lado, que las plataformas comerciales de distribución no -incluyeran algunas funcionalidades, ni estándares de accesibilidad y -usabilidad, iba en detrimento de la misión pública de la biblioteca. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -Desde el lanzamiento oficial del app Library Simplified, el préstamo de -libros digitales por parte de la Biblioteca Pública de Nueva York ha -aumentado en 25% (para algunos de los catálogos la cifra llega al 40%). -La comunidad de desarrolladores asciende a 43 y el equipo que se encarga -del proyecto dentro la biblioteca cuenta con siete empleados de tiempo -completo. -::: -::: -::: - -::: {.blancof} -![](images/inter5.jpg){.ancho1 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -La aplicación Library Simplified fue lanzada en versión beta en -septiembre de 2014, en febrero de 2015 entró a producción bajo la marca -Open eBooks y desde mediados de 2016 está disponible para dispositivos -iOS y Android. La app, cuyo diseño está centrado en el usuario, integra -tecnologías y sistemas de información propios de las bibliotecas (ILS, -LMS), OPAC, registro de usuarios, al igual que el catálogo de OverDrive -y otras dos distribuidoras de libros digitales. Dentro de sus -funcionalidades se cuentan la visualización de EPUB 3, audio, video, -utilidades de accesibilidad (OneVoice y lector de gestos), subrayados y -notas. Fue desarrollada, además, con el software de código abierto -Readium, por lo que es gratuita, libre (11 instituciones se unieron al -desarrollo) y customizable. En palabras de James English, quien dirige -el proyecto "las ventajas del código abierto es que permite inspeccionar -la calidad y mejorar las funcionalidades sin restricciones, según las -necesidades de bibliotecas. En mi experiencia personal, las licencias -cerradas oscurecen la calidad de los servicios o buscan mantener alguna -ventaja comercial --- lo que en ningún momento satisface las necesidades -de una biblioteca pública". - -Desde su lanzamiento oficial, el préstamo de libros digitales por parte -de la Biblioteca Pública de Nueva York ha aumentado en 25% (para algunos -de los catálogos la cifra llega al 40%). La comunidad de desarrolladores -asciende a 43 y el equipo que se encarga del proyecto dentro la -biblioteca cuenta con siete empleados de tiempo completo. -::: -::: - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Sistema de Bibliotecas Públicas de Flandes: la biblioteca en red (visión regional y participación local) {#sistema-de-bibliotecas-públicas-de-flandes-la-biblioteca-en-red-visión-regional-y-participación-local .azul .semibold .centrar .mayusculas .interlineado1} - -La región de Flandes (una de las tres regiones políticas y -administrativas de Bélgica) cuenta con 308 bibliotecas públicas -(provinciales, municipales o locales). En la primera década del 2000, -las bibliotecas empezaron a entender las posibilidades que las TIC les -ofrecían (llegarle a nuevos públicos, automatización e innovación en -servicios, y mayor acceso). Con lo que también surgió la necesidad de -unificar sus sistemas (ILS, catálogos, páginas web, etc.): no había una -sola visión o política, lo que imposibilitaba la interoperabilidad de -los sistemas. En 2009, el Ministerio de Cultura de Flandes, creó Bibnet, -una institución cuyo objetivo era "desarrollar la infraestructura y los -servicios de las bibliotecas públicas flamencas acorde con las nuevas -tecnologías de la información... darles las herramientas para llegar al -público en los nuevos medios y redes sociales... enfocarse en la -búsqueda conjunta, la interoperabilidad y el enriquecimiento de -metadatos tanto de sus colecciones digitales como físicas... y darle -sentido al término \'Biblioteca Digital de Flandes\'". -::: - -::: {.blancof} -![](images/inter6.jpg){.ancho1 .centrar .bloque} -::: - -::: {.ajuste .descripcion .ancho1} -Pese a que el gobierno flamenco la financia, Bibnet (conocida desde 2015 -como Cultuurconnect) es una institución con autonomía de gestión y -acción. Su misión es "trabajar con las bibliotecas y centros culturales -locales para crear un ambiente de experimentación, tipo laboratorio, en -el que se puedan probar soluciones a los desafíos digitales\\". Su meta -es innovar los servicios y gestionar proyectos digitales a gran escala. -Con 30 empleados, su estructura es horizontal y lo suficientemente -flexible como para trabajar de la mano con las comunidades locales y -tener representación y voz en el gobierno regional, moverse a nivel -intergubernamental (distintas provincias) y facilitar la cooperación con -otros sectores. -::: - -::: {.blancof} -![](images/inter7.jpg){.ancho1 .centrar .bloque} -::: - -::: {.ajuste .descripcion .ancho1} -En sus inicios (2009-2015), la organización tuvo a su cargo cuatro -tareas fundamentales: - -[1. Dictar la política digital para la biblioteca públicas de -Flandes]{.semibold}\\ -La creación de Bibnet supuso desde un principio una redefinición de las -bibliotecas desde el punto de vista administrativo: dejaron de ser -vistas como instituciones aisladas para ser concebidas como una pieza -dentro una red descentralizada. Esto favoreció la articulación del -trabajo a nivel regional, provincial y local, con el fin de producir -nuevos desarrollos y aplicaciones digitales de manera conjunta, tales -como la construcción de un catálogo de libros digitales flamencos; -encarar grandes inversiones en tecnología (catálogo colectivo y páginas -web), y proponer y ajustar políticas de acuerdo a las nuevas lógicas y -prácticas del entorno digital (derechos de autor, compra y distribución -de libros digitales, entre otras). - -[2. Hacer de las bibliotecas públicas de Flandes un referente digital en -la comunidad]{.semibold}\\ -Esto también implicó darle un nuevo valor al trabajo de las bibliotecas -a nivel local y modificar su modelo de servicios: en tanto centros -cercanos a la comunidad y a las personas (base de la sociedad), éstas -pasaron a ser lugares privilegiados para el acceso a la información, la -creación de colecciones digitales diversas y únicas, al igual que el uso -y apropiación de estas colecciones a través de las nuevas tecnologías. -Por otro lado y conscientes de que las TIC permiten mayor participación -en diversos procesos ciudadanos, Bibnet empezó a fomentar la -intervención de bibliotecarios y usuarios en la creación de servicios y -a fomentar el emprendimiento local. A través de hackatones, -convocatorias para proponer proyectos, talleres para desarrollar -propuestas (modelo de negocio, presupuestos, tiempos de ejecución) y -concursos, distintos ciudadanos empezaron a tener una participación -directa en la creación de servicios bibliotecarios y culturales. En este -momento, por ejemplo, Cultuurconnect está desarrollando y probando con -la comunidad un prototipo de aplicación para encontrar libros, a partir -de los perfiles y preferencias de los usuarios en redes sociales como -Facebook. - -[3. Organizar y enriquecer las colecciones]{.semibold}\\ -Una de las principales tareas de Bibnet fue asumir la titánica tarea de -desarrollar e implementar un catálogo colectivo para las 308 bibliotecas -de Flandes. Esto implicó definir una política de metadatos, desarrollar -una infraestructura tecnológica (backend) lo suficientemente robusta y -flexible como para soportar miles de registros, y un diseño (frontend) -que se ajustara a las necesidades los diversos usuarios de las -bibliotecas de las cinco provincias y su capital. El [catálogo -colectivo](http://zoeken.bibliotheek.be/){.gris .subrayado .italica}, -que se ha ido implementando de manera escalonada, funciona hoy con un -software de catalogación propio (Open Vlacc) que permite la catalogación -colaborativa, la actualización de los registros automatizada, incluye -reseñas, resúmenes y portadas, y vincula bases de datos, colecciones de -revistas, periódicos y algunos libros digitales. - -[4. Construir y administrar ambientes digitales\\ -orientados hacia el usuario]{.semibold}\\ -Esta tarea incluyó diseñar páginas web para las bibliotecas, un -[portal](http://www.bibliotheek.be/){.gris .subrayado .italica} que -contuviera la información de todas éstas (portal de portales) y -gestionar el desarrollo de diversos servicios digitales partiendo de las -necesidades particulares de las instituciones. Para hacer que estos -ambientes digitales funcionaran en red, se desarrolló un buscador propio -(Aquabrowser) que vincula la información de todas las bibliotecas a -través de datos abiertos enlazados y un Content Management System (CMS) -que les permite a los bibliotecarios gestionar y actualizar la -información de la institución en la que trabajan. También fue necesario -crear un registro único de usuario (tanto para la afiliación a las -bibliotecas físicas como para acceder a los diversos servicios -digitales). Esta funcionalidad, conocida como MiBiblioteca y que se -valida con el número de identificación nacional, permite hacer reservas, -crear listas de favoritos, acceso a historial de préstamos y a otros -servicios digitales. - -Entre estos últimos se cuentan un servicio de préstamo de libros -interactivos para niños llamado Fundels . La colección, desarrollada en -conjunto con una editorial digital local, incluye más de 75 títulos (25 -educativos, 50 generales), que están disponibles para préstamo (7 -títulos al año por cada usuario de la biblioteca) o para compra (3 euros -cada uno). Además de que los libros están enriquecidos con audio, video -y animación, incluyen funcionalidades de lectura sincronizada en varios -idiomas, juegos con los personajes de las historias, contenido adicional -y creación de multimedia. -::: -::: - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Sistema de Bibliotecas Públicas de Chile: la biblioteca como productora de contenidos, un espacio para la memoria {#sistema-de-bibliotecas-públicas-de-chile-la-biblioteca-como-productora-de-contenidos-un-espacio-para-la-memoria .azul .semibold .centrar .mayusculas .interlineado1} - -El Sistema Nacional de Bibliotecas Públicas de Chile (creado en 1978, -bajo el nombre Coordinación Nacional de Bibliotecas como parte de la -Dirección de Bibliotecas, Archivos y Museos, DIBAM) es el eje -articulador de más de 450 bibliotecas públicas a lo largo de todo el -territorio chileno. Además de ser uno de los tres coordinadores del Plan -Nacional de Lectura de Chile, entre sus principales funciones está la -creación y administración de colecciones físicas y digitales, la -construcción y modernización de los edificios de las bibliotecas y la -automatización de las bibliotecas públicas a través del proyecto \\"la -Optimización tecnológica de servicios y gestión de bibliotecas públicas" -que se encarga de la creación de un catálogo colectivo en línea, -adquisición de licencias de software y capacitación a los bibliotecarios -en el manejo de las TIC. - -La creación de una biblioteca digital (y sus componentes) responde a las -necesidades de ésta última función. Chile cuenta con una Biblioteca -Nacional Digital (colecciones de documentos patrimoniales -digitalizados), una Biblioteca Pública Digital (préstamo de libros -digitales) y un archivo colaborativo de Contenidos Locales producidos -por los habitantes de las distintas regiones de Chile. Cada uno de estos -servicios tiene misiones distintas y, aunque todos hacen parte de DIBAM, -están a cargo de diferentes coordinaciones. -::: - -::: {.blancof} -![](images/inter8.jpg){.ancho1 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -### Biblioteca Nacional Digital y colecciones digitales {#biblioteca-nacional-digital-y-colecciones-digitales .azul .semibold .centrar .mayusculas} - -El objetivo de la Biblioteca Nacional digital es, según lo expresado por -su coordinadora Daniela Schutte, "traspasar las fronteras geográficas y -temporales, asumiendo la impronta de las nuevas formas de crear, -preservar, utilizar y publicar el conocimiento, a través de las nuevas -tecnologías de la información. Ofrece una plataforma unificada de -servicios digitales que les permite a los usuarios de Chile y el mundo -la consulta remota de las colecciones de la Biblioteca Nacional de -Chile, el depósito de obras de creación digital y la asistencia de -bibliotecarios especializados". Cuenta con acceso para descarga gratuita -de 243 mil objetos digitales de la Biblioteca Nacional (organizados por -Fondos y Colecciones, bibliotecas temáticas, bibliotecas territoriales, -curadurías bajo el nombre de Memoria Chilena), visitas virtuales al -edificio de la Biblioteca, acceso a servicio de bibliotecario en línea, -mapas patrimoniales, depósito legal electrónico, entre otros. - -### Biblioteca Pública Digital {#biblioteca-pública-digital .azul .semibold .centrar .mayusculas} - -A finales de 2013, el Sistema de Bibliotecas Públicas de Chile lanzó su -servicio de préstamo de libros digitales a través de la plataforma de -préstamo y distribución Odilo, con el nombre Biblioteca Pública Digital. -Sin embargo, solo desde enero de 2016, la BP Digital empezó a vivir un -momento de esplendor, al lanzar una app disponible para sistemas -operativos iOS y Android que integra catálogo y DRM. Para diciembre de -2016, el servicio ya contaba con 65.000 usuarios registrados, un -incremento del 400%, frente al 2015 cuando apenas tenía 13.000. En el -año se habían realizado más 107.000 préstamos y había tenido más de un -millón de vistas. - -El éxito de la Biblioteca Pública Digital de Chile, que en 2016 recibió -el Premio Nacional a la Innovación, ha sido el resultado de un proceso -lento, en el que su equipo ha tenido que sortear diversas dificultades. -Según lo expresado por Florencia García Oyandel, quien ha estado a cargo -del proyecto desde sus inicios, muy pronto en su proceso de -implementación se hizo evidente que el público de la Biblioteca Pública -Digital era distinto al de las bibliotecas públicas del sistema, "un -público cautivo, que es fiel, pero que cuesta mucho ampliar". Fue -entonces que decidieron abrir el sistema a otros usuarios: todos los -chilenos residentes en Chile y en el extranjero (su registro solo pide -el número de identificación nacional). Hoy en día, los usuarios de las -bibliotecas públicas solo representan el 10% del número total de -usuarios de la BP Digital. - -Por otro lado, el sistema de inscripción representaba problemas tanto a -nivel administrativo como desde la perspectiva del usuario. Para -empezar, el proceso de autenticación era muy dispendioso (solo después -de que un funcionario validara y autorizara los datos, se emitía una -contraseña) y ésta solo se podía recuperar si el usuario lo hacía -inmediatamente después de emitida. La solución fue generar un sistema de -autenticación automática, simplificar los campos que debía llenar el -usuario a la hora de inscribirse (en este momento solo piden nombre -completo, correo y número de identificación nacional). Y, como la -plataforma estaba integrada con el sistema de información de las -bibliotecas públicas, apenas un usuario hacía su afiliación al sistema, -quedaba automáticamente inscrito en la BP Digital. Según Florencia -García: "sacrificamos estadísticas, en pro del préstamo. Nos encantaría -saber el rango etario de los usuarios, si son mujeres u hombres, pero -como nuestro objetivo es facilitar el acceso, esta información pierde -relevancia frente al número de préstamos y qué se está prestando". - -Finalmente, el proceso de descarga y préstamo era muy complicado. Los -usuarios debían inscribirse, solicitar un libro, descargar la aplicación -de DRM (de distintas empresas, dependiendo si se conectaba desde un PC, -tableta o celular) y esperar a que abriera el libro. La solución fue -diseñar junto con Odilo y una empresa de tecnología local una aplicación -que integrara el lector, el DRM y el sistema de información de las -bibliotecas. En febrero de 2016, tan solo un mes después de lanzada la -aplicación, ya se habían hecho 7000 préstamos. -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -La Biblioteca Nacional ofrece al público 244 mil objetos digitales de -descarga libre: -[www.bibliotecanacionaldigital.cl](http://www.bibliotecanacionaldigital.cl/bnd/612/w3-channel.html){.gris -.subrayado .italica} - -Portal de Contenidos locales: - -Servicio de préstamo de libros digitales, con 65.000 usuarios -registrados y 107.000 préstamos. Recibió el Premio Nacional a la -Innovación. Disponible solo para ciudadanos chilenos. - -Los usuarios de las bibliotecas públicas solo representan el 10% del -número total de usuarios de la BP Digital. -::: -::: -::: - -::: {.blancof} -![](images/inter9.jpg){.ancho5 .bloque .centrar} -::: - -::: {.flex} -::: {.ajuste .descripcion .ancho1} -Uno de los principales retos que aún enfrenta este servicio es el modelo -de compras de libros digitales establecido por las editoriales y los -distribuidores. Según éste, la bibliotecas compran licencias (permisos -de uso) de uno o varios títulos, que permiten 24 préstamos no -concurrentes (es decir, que no permite prestar el mismo título de manera -simultánea a más de un usuario). Este último aspecto es especialmente -problemático, ya que un usuario que esté buscando un libro que ya esté -prestado, debe esperar a que el otro usuario lo devuelva y reservarlo. -Según García Oyandel, "sabemos que hay una pérdida de usuarios en las -reservas ---algunos de nuestros títulos tienen 200 reservas---, además -de un número que no conocemos de usuarios que se van sin llegar a -reservar." Solucionar esto es particularmente apremiante, ya que el -Sistema de Bibliotecas tiene proyectado inaugurar a inicios de 2017 una -estación de préstamo de libros digitales en el aeropuerto internacional -de Santiago, cuya población es flotante (por lo que no hay posibilidad -de reservar). Según ella, la solución estaría en que las bibliotecas le -puedan comprar a las editoriales el acceso total a su catálogo y que las -licencias no estén asociadas a títulos. De esa manera, la construcción -de una lista de lectura dependería completamente del usuario. - -### Archivo colaborativo de Contenidos Locales {#archivo-colaborativo-de-contenidos-locales .azul .semibold .centrar .mayusculas} - -El programa Biblioredes, que hoy es responsable del archivo colaborativo -de Contenidos Locales, nació en 2002 como un proyecto de la DIBAM -financiado por la Fundación Bill & Melinda Gates con el fin de disminuir -la brecha digital y fomentar el desarrollo de las comunidades de Chile a -través de sus bibliotecas públicas. Entre sus objetivos específicos -están: 1. Desarrollar competencias para la participación y expresión -social digital de las Bibliotecas y comunidades locales, 2. Desarrollar -e implementar servicios virtuales focalizados en la participación y el -aumento del capital social y cultural de las comunidades locales y, 3. -Asegurar, mejorar y ampliar el acceso y uso gratuito de Internet y otros -recursos digitales a las comunidades asociadas al sistema de Bibliotecas -Públicas. - -El programa incluye alfabetización digital básica, alfabetización -digital avanzada y la creación de contenidos locales, que inició en -2004, se consolidó como comunidad virtual en 2009 y ahora se conoce como -un archivo digital colaborativo del patrimonio cultural chileno. La -filosofía que sostiene el programa es que la apropiación social de la -tecnología pasa por la creación y recreación de las identidades locales -en internet. En este sentido, un contenido local es una expresión -cultural, artística o patrimonial, registrada por los habitantes de cada -territorio bajo sus propios criterios estéticos y publicados en formato -digital. En palabras del exdirector de Bibliotecas Públicas de Chile, -Enzo Abbliagati: "creemos que ---en un mundo hiperconectado--- la -biblioteca pública tiene que, cada vez más, convertirse en un medio para -que sus usuarios no solo reciban sino aporten contenidos a la web. Pero -ese aportar, en el caso nuestro, no es neutro: nos interesan las -culturas locales, esas que difícilmente aparecen en los grandes medios y -que son apenas una cita a pie de página en los versiones oficiales de -Chile, que las personas se encuentren retratadas en internet\\". -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -El programa de Contenidos Locales de Chile, uno de los primeros de su -tipo y de mayor continuidad en América Latina, cuenta con un [nutrido -repositorio]{.semibold} de páginas web, blogs, videos, fotografías, -\'podcasts\' y revistas digitales. Para enero de 2016 tenía en total 6.218 -contenidos, 72.916 vistas anuales al sitio, 62.388 usuarios únicos. - -La difusión y la [participación de la comunidad]{.semibold} se hace a -través de convocatorias, concursos, seminarios-taller, ferias y, desde -2014, se celebra un encuentro anual al que asisten las 50 bibliotecas -que hacen parte de la red de Contenidos Locales, los creadores y la -ciudadanía en general. -::: -::: -::: - -::: {.blancof} -![](images/inter10.jpg){.ancho5 .bloque .centrar} -::: - -::: {.ajuste .descripcion .ancho1} -La implementación del programa ---y su éxito--- hizo que el rol de las -bibliotecas públicas chilenas al igual que las funciones de sus -bibliotecarios cambiara, pues ahora se debían asumir como un articulador -o mediador cultural e informacional de su comunidad. La biblioteca -pública pasó a ser un espacio para acoger, elaborar, generar, enseñar y -difundir las prácticas socioculturales de las comunidades; su patrimonio -en el sentido más amplio, aquello que las identifica. Más aún, la -biblioteca empezó a constituirse como un espacio para la memoria, de -identidad. En palabras de la bibliotecaria chilena Lucía Abello Abello: - -"Contenidos Locales ha facilitado el intercambio de experiencias y -prácticas de personas anónimas, comunes y corrientes, que nos permite -reconocernos como parte de un territorio común, como miembros de una -misma comunidad, lo que contribuye a fortalecer nuestra identidad, -nuestro sentido de pertenencia. Permite reconocernos en nuestra cultura -con todo lo que ello implica y en donde, quien tiene el control de lo -que se publica en la Web es el propio usuario, pues es él o ella quien -gestiona, crea y difunde lo que estima pertinente o según sus -necesidades, preocupaciones o intereses". - -El proceso de creación de contenidos, que inicia con convocatorias de -las bibliotecas locales, depende totalmente del creador (si los que se -postulan no saben de computadores o internet, son capacitados; si no -tienen equipos, la biblioteca se los presta). Para subir el contenido, -éste debe registarse en la página de Contenidos Locales con sus datos -básicos y correo electrónico. Una vez un contenido es ingresado pasa por -dos filtros de selección. El primero es el encargado regional de la -biblioteca, quien es responsable de revisar la forma y el formato. Luego -pasa a manos de la responsable del programa, quien revisa el contenido -(que sea pertinente, se vincule con la cultura o patrimonio local y que -presente una mirada particular del fenómeno). - -Uno de los grandes desafíos que enfrenta el programa a futuro es la -preservación digital de los contenidos y mantenerse actualizado en -términos tecnológicos. En este momento, los productores no están en la -obligación de entregarle los archivos madre al Sistema de Bibliotecas -Públicas de Chile, con lo que el mantenimiento y preservación de las -páginas no es controlado. El programa, sin embargo, ya ha hecho -contactos con la Biblioteca Nacional Digital, para recibir asesoría en -preservación y para ver cuáles de sus contenidos pueden entrar por -depósito digital. -::: -::: - -::: {#cont5 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## CONCLUSIONES {#conclusiones .semibold .azul .mayusculas} - -~[»]{.azul .tamano1}~El entorno digital no solo permite, sino que exige -el trabajo en redes y a través de alianzas. Estas son favorables no solo -a la hora de agregar contenidos y construir colecciones, sino para -llegarle a comunidades locales o remotas, disminuir costos al hacer -compras o desarrollar tecnologías conjuntas, escalar servicios y dictar -(o modificar) políticas acordes a las nuevas lógicas y prácticas de una -sociedad interconectada. - -~[»]{.azul .tamano1}~El uso de las nuevas tecnologías de información en -las bibliotecas favorece y fomenta nuevos modelos de trabajo en los que -prevalecen la interdisciplinariedad y la colaboración. Con ellos se -nutren, crecen y cambian los servicios, y los conocimientos y -habilidades de los empleados. - -~[»]{.azul .tamano1}~Los ambientes colaborativos, que surgen al -aprovechar las TIC para fomentar la participación ciudadana en la -creación de servicios y contenidos, hacen que las funciones de empleados -y bibliotecarios cambien: de funcionarios cuyas tareas radican en suplir -la demanda (poner a disposición colecciones y ofrecer programaciones) se -pasa a la co-creación con el público, de la distribución de contenidos -acabados a la mediación de diversas expresiones culturales. - -~[»]{.azul .tamano1}~De lo anterior se desprenden (y se hacen -necesarias) nuevas formas de relacionarse con los usuarios, quienes -empiezan a tener un rol de creadores, colaboradores y no simples -espectadores o consumidores. Muchas veces los usuarios no solo tienen -voz, sino que también tienen voto y participación en el desarrollo de -los productos y servicios ofrecidos por las bibliotecas. - -~[»]{.azul .tamano1}~El entorno digital no solo favorece sino que -también hace recomendable crear ambientes de experimentación en los que -se puedan probar prototipos de servicios, plataformas y contenidos -digitales. Por tratarse de nuevos desarrollos es necesario probar, -mejorar y volver a probar antes de invertir grandes sumas de dinero en -el desarrollo de nuevas tecnologías. De esta manera se reducen costos y -se minimiza el riesgo. En palabras de Koen Vandendriessche, gerente de -proyectos para el Sistema de Bibliotecas Públicas de Flandes: "es -preferible hacer muchas pruebas y fracasar pronto en el proceso". - -~[»]{.azul .tamano1}~Las plataformas de préstamo de libros que ofrecen -las distribuidoras comerciales siguen siendo deficientes para las -bibliotecas públicas: manejan interfaces poco usables y no incluyen -funciones de accesibilidad, entre otras, por lo que varios sistemas de -bibliotecas públicas se han visto en la obligación de tomar rutas -alternativas; bien sea desarrollando su propio software o negociando con -las empresas soluciones más acordes con las necesidades de sus usuarios -y la misión pública de las bibliotecas. - -~[»]{.azul .tamano1}~Se recomienda el uso y desarrollo de \'software -libre\' y de código abierto, no solo por tratarse soportes gratuitos que -permiten hacer correcciones, modificaciones y actualizaciones, lo que -ayuda a superar ciertas imposiciones comerciales de grandes -distribuidores, sino porque también facilita la interoperabilidad entre -varios sistemas de información y es afín a la misión pública de las -bibliotecas de dar acceso libre y abierto a la información. - -~[»]{.azul .tamano1}~Una de las características de las bibliotecas, -servicios y contenidos digitales es que permiten traspasar las fronteras -geográficas y temporales. Por lo tanto, los usuarios de algunos -servicios digitales proveídos por las bibliotecas públicas no son los -mismos usuarios de la bibliotecas físicas. Hay que tener en cuenta que -para llegarle a estos nuevos usuarios se está compitiendo por su -atención con medios de comunicación y entretenimiento que son más -rápidos. En este sentido, la usabilidad de los servicios debería ser una -de las prioridades en su desarrollo. - -~[»]{.azul .tamano1}~Las redes de bibliotecas de distintas ciudades del -mundo enfrentan los mismos retos en torno a la prestación de servicios y -creación de contenidos digitales: oferta desventajosa en la compra y -distribución de libros digitales; modelos de derechos de autor que no -están pensados para el ámbito digital; la preservación de contenidos y -productos digitales en un entorno tecnológico cambiante; la percepción -de que la biblioteca digital es una competencia de la biblioteca física; -asumirse como agentes en un entorno de cambio cultural (digital) que es -lento. Es fundamental seguir investigando, explorando y estudiando, para -seguir actualizados, pues el entorno digital es cambiante. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/internacional.html' - ] - }, - GrafoscopioNode { - #header : 'Orientaciones Técnicas, Modelo de Plan de Trabajo y Estándares para crear una Biblioteca Digital', - #body : ' -# ORIENTACIONES TÉCNICAS, MODELO DE PLAN DE TRABAJO Y ESTÁNDARES PARA CREAR UNA BIBLIOTECA DIGITAL {#orientaciones-técnicas-modelo-de-plan-de-trabajo-y-estándares-para-crear-una-biblioteca-digital .tituloi .mayusculas} - -Por: Sandra Angulo -::: - -::: {.imagencontenida2 .imgfondo4} -::: - - - -::: {.flex} -::: {.ancho6 .descripcion .ajuste .flexv .flexceh} -::: - -::: {.ajuste .indice .ancho4 .partido} -## ÍNDICE {#índice .azul .extrabold} - -1\\. Introducción - -2\\. Esquema de plan de trabajo en el modelo de agregación - -3\\. Esquema del plan de trabajo en el modelo de producción - -4\\. Estándares de metadatos: el modelo Dublin Core - -\\ -\\ -\\ - -5\\. Estandarización de formatos - -6\\. Arquitectura de información - -7\\. Políticas recomendadas para una biblioteca digital - -8\\. Políticas de propiedad intelectual - -9\\. Infraestructura tecnológica y selección de plataforma -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Introducción {#introducción .azul .semibold .centrar .mayusculas .interlineado1} - -Las bibliotecas digitales se desenvuelven como sistemas de información -documental en red, en donde a partir del uso de las tecnologías de -información y comunicación, se realizan las diferentes operaciones -propias del ciclo de entrada y salida de la información digital. De esta -manera se proponen las orientaciones para el diseño y plan de trabajo -que requerirá la Biblioteca Digital de Bogotá, entendiéndola como un -organismo propio y específico que requiere desarrollarse en el entorno -de una situación en donde existen ya otras entidades del Distrito -Capital que vienen desarrollando contenidos y servicios digitales, lo -que la pone en una condición de [modelo de agregación]{.semibold}, pero -que también puede tener la oportunidad de generar contenidos propios, lo -que la pone en una condición de [modelo de producción.]{.semibold} En -ambos casos, los diseños a realizar deberán ser flexibles y acomodados -al tiempo de desarrollo y madurez del proyecto. - -De otra parte, ver la Biblioteca Digital como sistema de información en -red requerirá un plan de trabajo y la definición de un equipo de -personas con roles y tareas definidas, que igualmente puede graduarse de -acuerdo con la evolución del proyecto. -::: -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Esquema del plan de trabajo en el modelo de agregación {#esquema-del-plan-de-trabajo-en-el-modelo-de-agregación .azul .semibold .centrar .mayusculas .interlineado1} -::: - - ------------------ ------------------ ------------------ ------------------ - Aquí estamos Fase 1 -- Fase 2 - Fase 3 - - Identificación Administrativa Operaciones - - Inscripción de la -Conformación de \\- Identificación -Diseño del modelo - iniciativa en el equipo de trabajo de los tipos de de arquitectura de - plan de la general y recursos digitales contenidos, - ciudad.\\ contratación del de las entidades colecciones y usos - \\ inicial. seleccionadas, que se pretende - Desarrollo de una -Inventario de bien sea primarios para la Biblioteca - consultoría.\\ instituciones con o secundarios. Digital como - \\ desarrollos -Identificación de agregadora. - Taller de digitales, la estructura de -Diseño de modelos - prospectiva partiendo de la organización de de metadatos. - selección sus metadatos y el -Diseño de - realizada en el sistema de bases políticas y - anexo No. 2, así de datos usadas. lineamientos de - como del alcance Esto porque si participación en - establecido para bien la la Biblioteca - la biblioteca generalidad de las Digital. - digital que se instituciones del -Selección y - pretende. Distrito utiliza funcionamiento de - -Selección y sistemas de las plataformas - contacto con las administración de web de agregación, - entidades contenidos, otras visualización y - pertinentes a cuentan con almacenamiento. - vincularse de información - acuerdo con el relevante - alcance, función y organizada en - misión de la bases de datos - Biblioteca Digital tipo Excel que - de Bogotá. requieren - estructurarse. - ------------------ ------------------ ------------------ ------------------ - -::: {.ajuste .descripcion .ancho1} -#### Identificación {#identificación .azul .semibold .centrar .mayusculas} - -La fase de identificación y administrativa es realizable en seis meses a -partir de la definición de un cronograma de trabajo. El equipo de -trabajo inicial puede estar conformado por un líder de proceso, y dos -profesionales en el campo de la ingeniería de sistemas y/o ciencias de -la información con experiencia en proyectos de bibliotecas o -repositorios digitales. - -La tarea fundamental en esta fase tiene que ver con el contacto y -levantamiento discriminado de las instituciones del Distrito que tienen -contenidos digitales desarrollados y que puedan ser pertinentes a los -intereses y alcance de la Biblioteca Digital. Esta fase es muy -importante en la medida que pone el discurso de la Biblioteca Digital en -las agendas de las demás entidades del Distrito. Como resultado deberá -obtenerse el croquis de instituciones como insumo para el inicio de la -fase dos. - -#### Fase Administrativa {#fase-administrativa .azul .semibold .mayusculas} - -Con base en el croquis de instituciones, una primera acción será la -identificación de los tipos de recursos digitales, bien sea primarios o -secundarios. Los primarios son los objetos de investigación, tales como -libros, fotos, mapas, etc., mientras que los secundarios se utilizan -para realizar la investigación, tales como bases de datos, motores de -búsqueda, catálogos, páginas web. (Galina, 2012). Esta identificación -deberá acompañarse de un esquema que defina temas clave, como por -ejemplo afinidades temáticas: ¿Qué tienen en común los contenidos de la -CAR y del IDEAM, o los de la Cámara de Comercio con los de Artesanías de -Colombia?. El resultado o el esquema elaborado, deberá servir como -insumo para la fase de operaciones relacionada con la definición de la -arquitectura de la biblioteca digital y la conexión entre metadatos -basados en web semántica. - -#### Fase de Operaciones {#fase-de-operaciones .azul .semibold .mayusculas} - -La fase de operaciones es realizable en dos pasos: 1) en el diseño de -estructuras de contenidos, metadatos, colecciones, y políticas de -participación, y 2) en la implementación de éstas a partir de la -selección de la plataforma seleccionada. - -Esta fase deberá tener en cuenta un principio orientador y es la -estandarización, ya que se trata de reunir información que debe ser -disponible de forma ágil, coherente y organizada. Los "estándares deben -desarrollarse de manera paralela hacia normas flexibles de estructura -que permitan desarrollar un web semántico" (Méndez Rodríguez; Merlo -Vega, 2000). Para ello deberá tenerse en cuenta como mínimo el uso de: - -- Metadatos basados en lenguajes xml. -- Uso de estándares interoperables basados OAI-PMH. -- Lenguajes controlados -- Definición de la propiedad intelectual -::: -::: - -::: {#cont3 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Esquema del plan de trabajo en el modelo de producción {#esquema-del-plan-de-trabajo-en-el-modelo-de-producción .azul .semibold .centrar .mayusculas .interlineado1} - -En el modelo de producción, la Biblioteca Digital produce contenidos y -otro tipo de desarrollos aplicados a la biblioteca y los incorpora a la -misma a través de un modelo de gestión. En tal caso, debe desarrollar un -ciclo de trabajo y ajustar su equipo de trabajo. Los contenidos pueden -ser: digitalización, edición de libros digitales, producción de -aplicaciones, API, servicios virtuales y virtualización de contenidos y -servicios, entre otros. -::: - -Gestión de conservación y digitalización -::: - -Catalogación - -Gestión de contenidos - -Gestión de plataforma y tecnologías - -Responsable de digitalizar a partir de parámetros técnicos y conservar -los recursos digitales con normas de seguridad. Puede optar por el -modelo de digitalizar bajo gestión propia, digitalizar en conjunto con -las entidades participantes o tercerizar. - -Responsable de la catalogación de los recursos, de la revisión de -metadatos y bases de datos agregadas, así como de la metodología de -enlazado de metadatos para semántica. - -Responsable de mantener, gestionar y visualizar los contenidos del -portal Web de la Biblioteca Digital. - -Responsable del funcionamiento y mantenimiento de las plataformas, -además de la investigación y desarrollo de nueva infraestructura para la -gestión y servicios de la Biblioteca Digital. - -Gestión de recursos digitales: Responsable por el desarrollo de las -colecciones a partir de los recursos digitales. Implica la gestión en -cada momento del ciclo de vida del documento en la biblioteca digital, a -partir de los procesos de selección, adquisición y organización con -metadatos. Dicta las pautas para la negociación de los derechos de -autor, inclusión de colecciones a digitalizar o agregar. - -::: {#cont4 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Estándares de metadatos: el modelo Dublin Core {#estándares-de-metadatos-el-modelo-dublin-core .azul .semibold .centrar .mayusculas .interlineado1} - -El siguiente cuadro muestra el esquema Dublin Core y la definición de -campos para tener en cuenta tanto en la fase de agregación como en la de -producción de contenidos digitales: -::: - -CAMPOS DE METADATOS - DUBLIN CORE -::: - -Contenido - -Título de la publicación (Etiqueta: DC. Title)\\ -Corresponde al nombre dado a un recurso, habitualmente por el autor. - -Materias (Etiqueta: DC. Subject)\\ -Corresponde a las palabras claves normalizadas asociadas al contenido de -un recurso. Esta etiqueta puede integrar descriptores personales, -corporativos, temáticos, geográficos y taxonómicos. Se fomentará el uso -de vocabularios controlados y de sistemas de clasificación formales. - -Descripción (DC. Description)\\ -Corresponde a una descripción textual del recurso. Puede ser un resumen -en el caso de un documento o una descripción del contenido en el caso de -un documento visual. - -Fuente (Etiqueta: DC.Source)\\ -Corresponde a una secuencia de caracteres usados para identificar -unívocamente la fuente de la catalogación, o en otras palabras, la -institución que genera el registro. Una opción es usar el código que se -genera en la Biblioteca del Congreso y que se usa en el formato MARC21, -en el campo 040 (Fuente de catalogación). - -Lengua/Idioma (Etiqueta: DC. Language)\\ -Corresponde a la lengua o idioma del contenido intelectual del recurso. - -Relación (Etiqueta: DC. Relation)\\ -Es un identificador de un segundo recurso y su relación con el recurso -actual. Este elemento permite enlazar los recursos relacionados y las -descripciones de los recursos. Es importante tenerlo en cuenta para los -procesos de organización semántica y enlazada de la información entre -colecciones. - -Cobertura (Etiqueta: DC. Coverage)\\ -Es la característica de cobertura espacial y/o temporal del contenido -intelectual del recurso. La cobertura espacial se refiere a una región -física, utilizando por ejemplo puntos o coordenadas. La cobertura -temporal se refiere al contenido del recurso, no a cuándo fue creado -(que ya lo encontramos en el elemento Date), la cobertura geográfica -(sitios geográficos) o jurisdiccional (entidades jurídicas) que describa -el contenido de la información. - -Propiedad intelectual - -Autor o creador (Etiqueta: DC. Creator)\\ -Corresponde a la persona u organización responsable de la creación del -contenido intelectual del recurso. Por ejemplo, los autores en el caso -de documentos escritos; artistas, fotógrafos e ilustradores en el caso -de recursos visuales. - -Otros colaboradores (Etiqueta: DC. Contributor)\\ -Corresponde a las personas o entidades que tienen una contribución -intelectual significativa, es decir, que implique un aporte intelectual -pero que ésta sea secundaria en comparación con las de las personas u -organizaciones especificadas en el elemento Creator. Tradicionalmente, -esta colaboración se refiere a los ilustradores, directores, -traductores, compiladores, etc. - -Editor (Etiqueta: DC. Publisher)\\ -Corresponde a la entidad responsable de hacer que el recurso se -encuentre disponible en la red en su formato actual. Este elemento puede -utilizarse para la identificación de la entidad que aporta el recurso -digital. - -Derechos (Etiqueta: DC. Rights)\\ -Corresponde a una referencia (por ejemplo, una URL) para una nota sobre -derechos de autor, para un servicio de gestión de derechos o para un -servicio que dará información sobre términos y condiciones de acceso a -un recurso. (derechos de propiedad, uso, acceso, transformación, -explotación comercial, etc.). - -Aspectos formales - -Fecha (Etiqueta: DC. Date)\\ -Corresponde a una fecha en la cual el recurso se puso a disposición del -usuario en su forma actual. Esta fecha no se tiene que confundir con la -que pertenece al elemento Coverage, que estaría asociada con el recurso -en la medida que el contenido intelectual está de alguna manera -relacionado con aquella fecha. - -Tipo del Recurso ( DC.Type )\\ -Corresponde a la categoría del recurso. Por ejemplo, página personal, -romance, poema, diccionario, etc. - -Formato (Etiqueta: DC. Format)\\ -Es el formato de datos de un recurso usado para identificar el software -y, posiblemente, el hardware que se necesitaría para mostrar el recurso. - -Identificador del documento digital (Etiqueta: DC. Identifier)\\ -Secuencia de caracteres utilizados para identificar unívocamente un -recurso. Ejemplos para recursos en línea pueden ser URLs y URNs. Para -otros recursos pueden ser usados otros formatos de identificadores, como -por ejemplo ISBN (\\"International Standard Book Number\\"). - -::: {#cont5 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Estandarización de formatos {#estandarización-de-formatos .azul .semibold .centrar .mayusculas .interlineado1} - -La estandarización también es aplicable a los tipos de formatos. De esta -forma es importante establecer una política de formatos de forma tal que -la Biblioteca Digital pueda generar lineamientos para las instituciones -que desarrollan y le aportan contenidos. De esta forma deberán -preferirse los formatos abiertos que apoyan la inclusión de metadatos -descriptivos, técnicos y administrativos, favoreciendo metadatos en -formatos estandarizados. - -El término formato es muy amplio y abarca los siguientes conjuntos -superpuestos de entidades: - -- A nivel indicado por extensiones de archivo, por ejemplo, .mp3 -- Como se indica por los tipos de medios de Internet (también conocido - como tipo MIME), por ejemplo , text/html -- Las versiones que se desarrollan a través del tiempo, por ejemplo, - el formato TIFF versión 5.0 fue reemplazado por la versión de Adobe - 6.0 -- Refinamientos que están diseñados para reducir, con fines - específicos, por ejemplo, TIFF/EP para fotografía electrónica y - TIFF/IT para requisitos de impresiones preliminares, establecidos - como estándares ISO. -- Instancias con funciones opcionales significativas para la - sostenibilidad en el tiempo, por ejemplo, los programas descargados - de Audible, Inc., están en formatos que impiden \\" que un cliente - pase duplicados de archivos de audio digital a otro usuario\\" -- Bitstream, codificaciones que subyacen a ciertos formatos de - archivo, por ejemplo, el código de pulso modulado lineal (LPCM) que - se puede encontrar en WAVE o AIFF o vídeo H.264 que se pueden - encontrar en QuickTime o MPEG -4. -- Agrupación de formatos que incluyen ejemplos que van de TIFF a ZIP - para MXF a METS. -- Clases de formatos relacionados cuyas características familiares son - importantes, por ejemplo, el formato de audio WAVE es una instancia - de la clase de formato RIFF. - -El cuadro a continuación relaciona los tipos de formatos recomendados -que pueden circular en la biblioteca digital, bien en el escenario de -agregación o de producción, y es importante reconocerlos desde la fase -administrativa para facilitar el diseño y la toma de decisiones en la -fase de operaciones. -::: - -::: {.blancof .padding2} -TIPO -::: -::: - -ESTÁNDAR - -SOPORTE - -Intercambio de datos - -Texto con marcadores estructurales - -SGML utilizando DTD o un esquema estándar o conocido apropiado para un -género textual particular. Lenguaje estándar de descripción de páginas -(SPDL) - -ISO/IEC JTCI/SC34 - -Lenguaje de marcado extensible XML - -W3C - -PostScript - -Adobe Systems Inc - -OEBPS\\_1\\_2, Estructura de publicación Open eBook, versión 1.2 (para las -novelas, libros de texto, monografías académicas, etc.) - -OEBPS container format - -DTB, Digital Talking Book, con transcripción completa del texto (para -novelas, libros de texto, monografías académicas, etc.) Document Type -Definition (DTD). Para artículos y revistas electrónicas - -ANSI/NISO Z39.86-2005 - -Formato de arquitectura de documento abierto ODA - -ISO/IEC JTC, ITU, ECMA - -Formato de texto enriquecido RTF - -Microsoft - -Formato de archivo independiente de dispositivo TeX DVI - -American Mathematical Society - -PDF/A Otros subtipos PDF creados a partir de texto legible por la -máquina (en lugar de imágenes de la página) - -Adobe System Inc - -HTML (solo si se publica de esta forma). - -W3C - -Imágenes digitales de mapas de bits - -TIFF\\_UNC (TIFF, mapa de bits sin comprimir) en cualquier espacio de -color con el soporte de TIFF. - -ISO/TC130/WG2 - -Especificación de Intercambio de Datos Digitales (DDES) - -ISO/TC130/WG2 - -Formato de intercambio de gráficos (GIF) - -CompuServe Inc. - -Procesamiento e intercambio de imágenes: Facilidad de intercambio de -Imagen ( IPI-IIF) - -ISO/IEC JTCI/SC24 - -Grupo de expertos fotográficos unidos(JPEG)\\ -Grupo de imagen binivel conjunta (JBIG) - -ITU-T, ISO/IEC JTCI/SC29 - -Gráficos portátiles de red ( PNG) - -W3C - -Formato de archivo de imagen de Etiqueta (TIFF) - -Aldus Corporation Microsoft - -Disco compacto de fotos (Photo CD) - -Eastman Kodak Company - -Formato De Archivo De Imagen Etiquetada Para La Fotografía Electrónica -(TIFF/EP) - -ISO TC42/WG18 - -TIFF para la Tecnología de imagen (TIFF/IT) - -ISO TC130/WG2 - -Metarchivo Gráficos De Computadora (CGM)\\ -Modelo de referencia de gráficos de computadora (CGRM) - -ISO/IEC JTCI/SC24 - -Formato de intercambio de Dibujo (DXF) - -Autodesk Inc - -. - -Sistemas de Gráfico Kerrel(Gks) - -ISO/IEC JTCI/SC24 - -Especificación Inicial De Intercambio De Gráficos ( IGES) - -Oficina Nacional de Normas de EE.UU. (NBS), ANSI - -OpenGL - -Junta de Revisión de la Arquitectura OpenGL - -Sistema Gráfico Interactivo Jerárquico De Programador (PHIGS) - -ISO/IEC JTCI/SC24 - -Gráficos De Vector Escalables (SVG) - -W3C Graphics WG - -Materiales de audio, video y Composiciones musicales digitales basadas -en notas - -Formato De Archivo De Intercambio De Audio (AIFF) - -International MIDI Assoc/MIDI Manufactures Assoc. - -Codificación De Imágenes En Movimiento Y Audio Asociado Para Medios De -Almacenamiento Digital (MPEG-1 Audio) Codificación genérica de imágenes -en movimiento y audio asociado (MPEC-2 Audio/MP3) Codificación -audiovisual de muy baja tasa de bits (MPEG-4 Audio) - -ISO/IEC JTCI/SC29 WG11(grupo de expertos en imágenes en movimiento) - -Lenguaje de marcado extensible de voz (VoiceXML) - -Voice XML, Forum - -Formato de archivo de audio de forma de onda(WAVE) - -Microsoft, IBM - -Intercalación de audio y vídeo (AVI) - -Microsoft - -JPEG en movimiento (M-JPEC) - -Motion Joint Picture Engineers Group - -Codificación De Imágenes En Movimiento Y Audio Asociado Para Medios De -Almacenamiento Digital (MPEG-1) - -ISO/IEC JTCI/SC29 WG11 - -Codificación audiovisual de muy baja tasa de bits ( MPEG-4 - -ISO/IEC JTC/SC29 WG11 - -Lenguaje De Realidad Virtual(VRML) - -ISO/IEC JTCI/SC24 - -Generic Coding Of Moving Pictures And Associated Audio (MPEC-2) - -ITU-T, ISO/IEC JTCI/SC29 WG11 - -Hipermedia / Lenguaje de Estructuración Basado en Tiempo (HyTime)) - -ISO/IEC JTCI/SC34 - -Sistemas Digitales Audiovisuales genéricos (DAVIC) - -ISO/IEC SC29 DAVIC - -Codificación de Información Multimedia e Hipermedia (MHEG) - -ISO/IEC JTCI/SC29 WG12 - -QUICKTIME - -Apple Computers - -Ambiente de Presentación para los objetos multimedia (PREMO) - -ISO/IEC JTCI/SC24 - -Lenguaje De Integración Multimedia Sincronizado (SMIL) - -W3C Audio Visual Working Group - -XMF, Formato de música extensible SMF, archivo MIDI estándar RMID, MIDI -archivos basado en RIFF - -MIDI Asociation - -Metadatos - -Clasificación - -Identificador de Objetos Digitales(DOI) - -ANSI.NISO - -Ubicación Uniforme de Recursos (URL) Identificador Uniforme De -Recursos(URI) - -IETF - -Tecnología - -Dublin Core metadata para el descubrimiento de recursos - -OCLC, IRTF - -ISO 11179 : Especificación y Normalización de Elementos de Datos - -ISO/IEC JTCI/SC32 - -Catalogación Legible De Máquina (MARC) - -ISO TC46/SC4, IFLA, Library of Congress British Library - -Codificación de metadatos y estándar de transmisión - -Digital Library Federation - -ISO 15398 : Interfaz De Descripción De Contenido Multimedia (MPEC-7) - -ISO/IEC JTCI/SC29 WG11 - -ISO 21000: Infraestructura Multimedia - -ISO/IEC JTCI/SC29 WG11 - -Plataforma Para La Selección De Los Contenidos De Internet (PICS) - -W3C PICS Working Party - -Iniciativa De Archivos Abiertos (OAI) - -OAI - -Plataforma de descripción de recursos (RDF) - -W3C PICS Working Party - -XML, Intercambio de Metadatos (XMI) - -Object Management Group - -Conservación de datos - -Tecnología - -Formato De Intercambio De Archivo(AIF) - -ISO/IEC 9171-2 : 1990, ISO/IEC 11560 : 1992 ANSI X3. 1911991, ANSI/AITM -MS59-1996, ANSI/AIM TR25-1995 - -Metadatos De Almacén Común (CWM) - -OMG - -Criterios De Diseño Estándar Para Aplicaciones de Software de Gestión de -Documentos Electrónicos (RMA)\\ -Imagen Electrónica - -Departamento de Defensa de Tarea de Gestión de Registros EE.UU. (RMTF) - -ISO.IEC JTCI, ANSI - -Descripción Archivística Codificada(EAD) - -LC, Society of American (ICA) - -Recuperación de información - -ANSI - -Registro Internacional De Archivo Estándar Para Instituciones, Personas -Y Familias (ISAAR) - -Consejo Internacional de Archivos(ICA) - -Modelo de requisitos para la gestión de los documentos electrónicos -(MoReq) - -Intercambio de datos entre administraciones (LAD) - -Micrográficos - -ISO TC 171, ANSI - -Modelo de Referencia para un Sistema de Información de Archivo -Abierto(OAIS) - -CCSDS, ISO TC20/SC13 - -Aplicaciones - -Servicio de aplicaciones - -Sistemas de Tratamiento de Mensajes X400 - -ISO JTC2 ITU-T Study Group 7/Study Group 1 - -Protocolo Telnet\\ -Extensiones Multipropósito De Correo Internet(MIME)\\ -Protocolo de transferencia de hipertexto(HTTP)\\ -Protocolo de transferencia de archivos (FTP)\\ -Protocolo De Control De Transmisión / Protocolo De Internet(TCP/IP)\\ -Protocolo De Transferencia De La Red De Noticias(NNTP)\\ -Protocolo Simple De Transferencia De Correo (SMTP) - -IETF - -Procesamiento de transacciones(TP) - -ISO/TEC JTC1 - -Transferencia de archivos. Acceso y gestión (FTAM) - -Búsqueda - -Servicio de directorio integrado de internet - -IETF Domain NAME Server Operator - -ISO 8777: Comandos Para La Búsqueda De Texto Interactivo - -ISO TC46/SC4 - -ANSI Z-39.50- Recuperación De La Información De Definición De Servicio -De Aplicación Y Especificación Del Protocolo - -ANSI, NISO - -Lenguaje De Marcado De Servicios De Directorio(DSMI) - -OASIS - -Protocolo ligero de acceso a directorios (LDAP)\\ -Directorio WHOIS\\ -Servicios de páginas blancas\\ -Protocolo De Indexación Común(CIP)\\ -Uso de Internet para directorios X.500 - -IETF - -Modelo de Referencia para un Sistemas de Información de Archivos -Abiertos(OAIS) - -CCSDS, ISO TC20/SC13 - -El directorio X.500 - -ISO/IEC JTC1/SO6, ITU-T Study Group 17 - -Intercambio de Documentos Electrónicos Genéricos(GEDI) - -ISO TC46/SC4 WG4 - -Préstamos Interbibliotecarios (ILL) - -ISO TC46/SC4 - -ISO 12083 : Operación electrónica de manuscritos y marcado - -ISO TC46/SC4 - -::: {#cont6 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Arquitectura de información {#arquitectura-de-información .azul .semibold .centrar .mayusculas .interlineado1} -::: - -+-----------------+-----------------+-----------------+-----------------+ -| Por tipo de | Por tipo de | Por tipo de | Por tipo de | -| soporte | documento | instituciones | servicios | -+-----------------+-----------------+-----------------+-----------------+ -| - Imagen: | - Inéditos: | - Institucion | - Referencia | -| jpg, tiff, | Documentos | es | virtual | -| png | escritos a | o programas | - Basados en | -| - Audio: mp3, | mano. | del | georreferen | -| wav | Documentos | Distrito. | ciación | -| - Video: avi, | escritos en | Por | - Tutoriales | -| mpg, wmv, | máquina de | ejemplo: | - Formación | -| mp4 | escribir | - Cinemat | - Expositivos | -| - Texto: doc, | - Monografías | eca | - Colaborativ | -| txt, html, | : | - Cámara | os | -| xml | Libros. | de | con la | -| - Libros | Folletos. | comerci | comunidad | -| electrónico | Proclamas. | o | - Redes | -| s: | - Imágenes | - Rock al | sociales | -| epub, mobi, | - Pintura | parque | - Chat | -| pdf, pdf/A, | s. | - Jardín | - Herramienta | -| otros de | Dibujos | Botánic | s | -| acuerdo con | . | o | para | -| el cuadro | Grabado | - Bibliotecas | compartir | -| No. 8 | s. | - Bibliotecas | información | -| | Iconogr | - Privada | RSS, | -| | afía | s | Delicius. | -| | - Fotogra | - Persona | - Escritorios | -| | fías: | les | virtuales | -| | persona | - Museos | - Podcast | -| | s, | - Privado | - Youtube | -| | lugares | s | - Reconocimie | -| | , | - Persona | nto | -| | objetos | les | Óptico de | -| | . | - Archivos | Caracteres- | -| | - Cartografía | - Público | OCR | -| | : | s | - Reconocimie | -| | Mapas | - Privado | nto | -| | antiguos, | s | Óptico de | -| | actuales, | - Establecimi | la | -| | láminas de | entos | Música-OM | -| | aspectos | comerciales | - Interfaces | -| | geográficos | - Editori | de búsqueda | -| | . | ales | y | -| | - Publicacion | - Librerí | visualizaci | -| | es | as | ón | -| | seriadas: | - Otros, | adaptados | -| | Revistas, | Ej.: | (usuarios | -| | Periódicos. | anticua | en | -| | . | rios. | condición | -| | - Videograbac | | de | -| | iones | | discapacida | -| | - Material | | d) | -| | sonoro y | | - Música en | -| | musical | | streaming | -| | - Entrevi | | - Readspeaker | -| | stas | | s | -| | o | | - Herramienta | -| | confere | | s | -| | ncias | | de | -| | en | | investigaci | -| | audio; | | ón: | -| | Música: | | Refworks, | -| | Partitu | | citación. | -| | ras | | - Incorporaci | -| | musical | | ón | -| | es. | | de | -| | Cualqui | | contenidos | -| | er | | protegidos | -| | otra | | por | -| | grabaci | | derechos de | -| | ón | | autor. | -| | sonora | | - Requeridos | -| | en el | | por | -| | context | | regulación | -| | o | | de MinTIC | -| | de la | | para | -| | ciudad. | | accesibilid | -| | - Documentos | | ad | -| | de archivo: | | y | -| | cualquier | | usabilidad. | -| | tipo de | | | -| | documento | | | -| | que por sus | | | -| | característ | | | -| | icas | | | -| | no | | | -| | corresponda | | | -| | a material | | | -| | bibliográfi | | | -| | co. | | | -| | - Obras | | | -| | digitales | | | -| | para | | | -| | dispositivo | | | -| | s | | | -| | portátiles | | | -| | - Libros | | | -| | electró | | | -| | nicos | | | -| | - Audioli | | | -| | bros | | | -| | - Podcast | | | -| | y | | | -| | videopo | | | -| | dcast | | | -| | - Libros | | | -| | hablado | | | -| | s | | | -| | (para | | | -| | inviden | | | -| | tes) | | | -+-----------------+-----------------+-----------------+-----------------+ - -\\ -::: - -::: {#cont7 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Políticas recomendadas para una biblioteca digital {#políticas-recomendadas-para-una-biblioteca-digital .azul .semibold .centrar .mayusculas .interlineado1} - -En cuanto a las políticas del portal de la Biblioteca Digital, es -importante que sean definidas desde el comienzo del proceso. A -continuación, un modelo de aspectos que debe contener dicha política: - -Título, introducción, objetivos general y específicos - -Participantes del portal de la Biblioteca Digital - -Usuarios de la Biblioteca Digital - -Modelo de trabajo: Se sugiere el modelo de trabajo cooperativo -interinstitucional. Este modelo implica que cada institución -participante gestiona sus propios repositorios digitales y comparte los -contenidos que alimenten el portal a partir del protocolo OAI-PMH. - -Servicios del portal: Establecer los principios que rigen los servicios -y el tipo de servicios. Se sugiere que funcionen como un sistema que use -las tecnologías Web 2.0 para permitir el desarrollo de servicios de -interacción con sus usuarios, y que estén también adaptados a las -tecnologías móviles, entre otros. Se recomienda la inclusión de -estrategias con las redes sociales más comunes, las cuales también -ayudarán a la difusión de contenidos y promoción del portal en la Web. -Este tipo de situaciones exige el desarrollo de estrategias de mercadeo -digital, las cuales pueden estar en cabeza de cada institución -participante, bajo una línea formulada por la Biblioteca Digital. - -Desarrollo de colecciones: Explicación del tipo de contenidos y -colecciones en el portal, basado en la arquitectura del mismo. Los -recursos digitales incluidos en el portal, deben ser analizados, -descritos y organizados siguiendo los estándares y tendencias -internacionales vigentes en las actividades relacionadas con: La -descripción bibliográfica y puntos de acceso de autor y título, la -indización o análisis de contenido, la clasificación temática y los -metadatos e infraestructuras semánticas. Se sugiere una visualización de -contenidos a modo de facetas, ya que esto permite la navegación -organizada para los usuarios. - -Condiciones para la selección y adquisición del contenido digital: En el -modelo agregador, cada institución es responsable del acceso, -descripción y calidad de los documentos. Esta condición obliga a que la -arquitectura de trabajo sea distribuida entre los diferentes -repositorios de información y contenga únicamente un repositorio central -de metadatos cosechados a través de una herramienta tecnológica. De -igual forma, obliga a que se tengan reglas claras y un responsable en -cada institución. - -Definición de los estándares mínimos de metadatos, de objetos e -interoperabilidad: En esta fase es importante que se establezca como -condición que todo documento que contenga texto deberá pasar por el -proceso de Reconocimiento Óptico de Caracteres (OCR), para facilitar la -indexación de documentos en motores de búsqueda como Google, y la -búsqueda y recuperación de información. - -Definición del modelo de interoperabilidad: este debe contemplar el -modelo de soporte tecnológico, las condiciones de acceso al portal, y -otros factores tales como: - -- La conectividad entre el software de gestión de recursos digitales - propio y la herramienta central de cosecha y metabúsqueda del portal - de la Biblioteca Digital -- El acceso permanente a Internet. -- El control de acceso consecutivo por parte de los usuarios. -- El control de accesibilidad a las colecciones, y una URI permanente - para cada recurso. - -Almacenamiento y preservación digital: En el modelo agregador, cada -institución participante deberá garantizar la preservación digital de -los documentos o información aportada. En el modelo de producción será -la institución a cargo de la Biblioteca Digital quien sea responsable de -los contenidos, y en ambos modelos, responsable de la administración del -repositorio central de la Biblioteca Digital. - -Para permitir el acceso permanente a los objetos digitales, se deberá -asignar un identificador persistente a cada ítem de la colección, y a -cada parte de la misma que sea susceptible de ser recuperada. - -Definición del modelo de derechos de autor. - -Definición de indicadores y el modelo de análisis. -::: -::: - -::: {#cont8 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Políticas de propiedad intelectual {#políticas-de-propiedad-intelectual .azul .semibold .centrar .mayusculas .interlineado1} - -Este es uno de los temas de mayor cuidado en el desarrollo de una -biblioteca digital. Bien en la fase como agregador o productor, la -Biblioteca Digital debe sentar sus políticas frente a la propiedad de -los recursos para el uso y circulación de los contenidos digitales y, en -especial, contar con la tecnología para la correcta visualización de los -contenidos, previendo cualquier violación o mal uso de los mismos. - -La primera instancia a resolver, si se trata de publicar contenidos -protegidos por Derechos de Autor, es gestionar las respectivas licencias -bajo modelos que legitimasen el uso y circulación de los contenidos en -la biblioteca. Esta situación también la deberán contemplar todas las -entidades vinculadas con la biblioteca. Se recomienda la gestión de -derechos a perpetuidad y no limitados en el tiempo, ya que la gestión es -de mayor cuidado. - -Dado que en los metadatos de los objetos digitales es necesario poner el -tipo de licencia que éste tiene, a continuación, se relaciona una -descripción de las diferentes formas de licencias, basadas en los -conceptos de la licencia de Creative Commons. -::: - - ------------------------------------ ------------------------------------ - Autorizaciones de uso de recursos Licencias de uso - digitales - - SÍ uso comercial de la obra\\ Obra en dominio público. Puede - SÍ modificación de la obra\\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que la obra la obra, incluso para fines - se encuentra en dominio público comerciales, todo ello sin pedir - desde su concepción o ya han permiso, siempre y cuando se cite el - expirado los plazos de protección de autor y la fuente. Fuente: - la obra. Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\\ Atribución. Puede copiar, modificar, - SÍ modificación de la obra adaptar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, todo ello sin - pedir permiso, siempre y cuando se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - NO uso comercial de la obra\\ Atribución. Puede copiar, modificar, - SÍ modificación de la obra adaptar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, todo ello sin - pedir permiso, siempre y cuando se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\\ Atribución - No derivadas. Puede - NO modificación de la obra copiar, distribuir y comunicar - públicamente la obra, incluso para - fines comerciales, siempre y cuando - ésta no se modifique, y se cite el - autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - SÍ uso comercial de la obra\\ Atribución - Compartir igual. Puede - SÍ modificación de la obra\\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que las la obra, incluso para fines - obras derivadas deben tener la misma comerciales, siempre y cuando se - licencia. cite el autor y la fuente y se - licencien las obras derivadas bajo - las mismas condiciones de la obra - original. Fuente: Biblioteca Digital - de Bogotá, por ejemplo. - - NO uso comercial de la obra\\ No comercial-Compartir igual. Puede - SÍ modificación de la obra\\ copiar, modificar, adaptar, - Si el titular de derechos además distribuir y comunicar públicamente - hace mención explícita a que las la obra, siempre y cuando se haga - obras derivadas deben tener la misma sin fines comerciales, se cite el - licencia. autor y la fuente y las obras - derivadas se mantengan sin fines - comerciales y se licencien bajo las - mismas condiciones de la obra - original. Fuente: Biblioteca Digital - de Bogotá, por ejemplo. - - NO uso comercial de la obra\\ No comercial-Sin obra derivada. - NO modificación de la obra\\ Puede copiar, distribuir y comunicar - Si el titular de derechos además públicamente la obra, siempre y - hace mención explícita a que las cuando se haga sin fines - obras pueden ser copiadas. comerciales, no se modifique y se - cite el autor y la fuente. Fuente: - Biblioteca Digital de Bogotá, por - ejemplo. - - NO uso comercial de la obra\\ Todos los derechos reservados. Está - NO modificación de la obra\\ prohibido todo tipo de reproducción - Si la obra no tiene ninguna nota de sin autorización del autor o de los - derecho de autor, también aplica derechohabientes. - esta licencia. - ------------------------------------ ------------------------------------ -::: - -::: {#cont9 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Infraestructura tecnológica y selección de plataforma {#infraestructura-tecnológica-y-selección-de-plataforma .azul .semibold .centrar .mayusculas .interlineado1} - -En relación con la selección de la infraestructura tecnológica, durante -la fase de operaciones se deberá realizar la selección de las -plataformas necesarias teniendo en cuenta: plataforma para gestión -digital, servidores de búsqueda, servidores para alojamiento, capacidad -de almacenamiento, soporte y sostenibilidad tecnológica. - -Las decisiones para la selección de la plataforma deberán partir del -alcance establecido para la Biblioteca Digital. La metodología más -recomendada es la de comparación a través de elementos clave cuyo -resultado facilite la decisión para obtener la mejor alternativa -tecnológica. Actualmente existen diferentes opciones de tecnologías de -código abierto o código propietario, a continuación, se relacionan las -más utilizadas: -::: - - -------------- ---------------------------------------------------------- ------------------------------------------------------------------------- - Código abierto Propietario - - Gestores de [Omeka](http://omeka.org){.gris .subrayado}\\ [CONTENTdm](https://www.oclc.org/es-americalatina/contentdm.html){.gris - objetos [Fedora](http://www.fedora.info/){.gris .subrayado}\\ .subrayado}\\ - digitales [Dspace](http://www.dspace.org/){.gris .subrayado}\\ [Alma-Primo](http://www.exlibrisgroup.com/){.gris .subrayado}\\ - [Greenstone](http://www.greenstone.org/){.gris .subrayado} [Portfolio](http://www.sirsidynix.com/products/portfolio){.gris - .subrayado}\\ - - Servidores de [ElasticSearch](http://solr-vs-elasticsearch.com/){.gris [Autonomy](http://www.autonomy.com){.gris .subrayado}\\ - búsqueda .subrayado}\\ - [Solr Apache Lucene](http://lucene.apache.org/solr/){.gris - .subrayado}\\ - -------------- ---------------------------------------------------------- ------------------------------------------------------------------------- - -::: {.ajuste .descripcion .ancho1} -Los principales elementos de evaluación a realizar para las plataformas -de gestión de objetos digitales son: -::: - -::: {.padding4} - ------------------------------------ ------------------------------------ - Permite cargar los objetos digitales Despliegue de íconos para cada - uno a uno. tipología de objeto digital. - - Permite cargar los objetos digitales Administración de cambios de formato - en forma masiva y automática.¿Qué por obsolescencia. - cantidad? - - Permite al usuario externo la carga Comunicación con todos los módulos - de objetos digitales. que hacen parte de la plataforma. - - Existe integración de la gestión de Comunicación con el módulo de - recursos digitales con la de catalogación al registrar un recurso - recursos bibliográficos. digital. - - Parametrización de metadatos. Recuperación de información a través - de motores de búsqueda. - - Permite personalizar plantillas para Interfaz gráfica con posibilidades - la captura de metadatos. de previsualización de miniaturas - para exploración de las colecciones - digitales. - - Permite uso de RDF para descripción Conformación de colecciones - de metadatos. digitales. - - Esquema de metadatos MODS (Metadata Interfaz gráfica parametrizable. - Encoding Description Schema). - - Esquema de metadatos METS (Metadata Presentación automática de las - encoding and transmission standard). novedades digitales. - - Esquema de metadatos PREMIS para Gestor abierto para poderle - preservación digital. desarrollo de módulos. - - Protocolo OAI-PMH Posibilidad de línea de tiempo en la - interfaz gráfica. - - Alojar los objetos en un file system Posibilidad de georreferenciación en - en el servidor central con una URL los recursos digitales. - persistente. - - Parametrización de visibilidad de Posibilidad de búsqueda por rangos - los objetos digitales a los espaciales en la interfaz gráfica. - usuarios. - - Crear automáticamente las miniaturas Herramienta en línea para - para ser visualizadas por medio del adquisición de reproducciones - OPAC Web. digitales. - - Indexar automáticamente el texto Herramienta en línea para trámite de - completo que contiene el objeto derechos de reproducción. - digital para búsquedas de usuario. - - Permite hacer búsqueda y Gestor de exposiciones o galerías - recuperación por palabras (minería virtuales. - de texto) sobre el objeto si este - posee OCR. - - Importar/exportar objetos digitales Filtros de visualización - en bloque al ILS parametrizados en el visor de - recursos digitales. Ayudas a - usuarios con discapacidad visual y - auditiva. - - Recuperar libros y objetos digitales Convertidor HTML. - en la misma interfaz de búsqueda - OPAC Web por medio de una búsqueda - básica, avanzada y experta. - - Soportar objetos de audio/vídeo. Versión para dispositivos móviles. - - Contar con un visor propio para los Brinda la opción de calificar el - diferentes tipos de objetos material (Ranking). - digitales que posea zoom múltiple. - - Previsualización de inicio de 1 a 10 Permite enlazar registros - imágenes como mínimo en la descarga bibliográficos con gestores de - del recurso. referencia. - - Visor con múltiples ventanas de Permite enlazar registros - exploración. Mínimo 4. bibliográficos con redes sociales. - - Actualizador automático de las - estadísticas en cada colección - digital. - ------------------------------------ ------------------------------------ -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/orientaciones.html' - ] - }, - GrafoscopioNode { - #header : '¿Con qué aliados se puede hacer?', - #body : ' - -::: {.anchopan .prueba .bloque .centrar .sombra} -::: {#inicio .flex .flexceh .titulo .ajuste .azulf} -# ¿CON QUÉ ALIADOS SE PUEDE HACER? {#con-qué-aliados-se-puede-hacer .tituloi} -::: - -::: {.flex .flexceh .ffinal} -::: {.ajuste .indice .ancho2} -## ÍNDICE {#índice .azul .extrabold} - -1\\. Volar y tejer la red: actores e instituciones claves para el -funcionamiento de la Biblioteca Digital de Bogotá - -2\\. Servicios y proyectos digitales relevantes para la Biblioteca Digital -de Bogotá -::: -::: -::: - -::: {#cont1 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -## Volar y tejer la red: actores e instituciones claves para el funcionamiento de la Biblioteca Digital de Bogotá {#volar-y-tejer-la-red-actores-e-instituciones-claves-para-el-funcionamiento-de-la-biblioteca-digital-de-bogotá .azul .semibold .mayusculas .interlineado1} - -La BDB no podría funcionar adecuadamente sin su alianza y relación con -otros actores e instituciones de la ciudad y la nación. La justificación -de ello es muy sencilla: existen numerosas entidades que están -implicadas en el mejoramiento de la lectura y la escritura, que tienen -políticas, planes y acciones concretas en el campo, que han hecho y -continúan haciendo importantes esfuerzos para cumplir este propósito -nacional y distrital, que tienen inversiones humanas, económicas y -tecnológicas significativas. Por eso es decisivo conocer su existencia, -analizar sus objetivos y programas para que la BDB pueda priorizar sus -verdaderos campos de intervención que no signifiquen esfuerzos -ineficientes y desarticulados. Probablemente sea su naturaleza digital -la que determine su naturaleza, sus límites como también el orden de sus -alianzas con los otros actores de la lectura y la escritura en la ciudad -y en el país. - -Las relaciones pueden ser de dos clases: temáticas, es decir, -diferenciadas por campos, o áreas de intervención e institucionales, -determinadas por su naturaleza institucional. - -Sin ánimo de tener un inventario exhaustivo (que se deberá ir ampliando -y precisando), podrían estar las siguientes: - -- Ministerio de Cultura -- Ministerio de Educación -- Ministerio de Tecnologías de la Información y la Comunicación - -Los tres Ministerios mencionados son fundamentales puesto que -desarrollan planes de lectura y escritura siendo las instancias máximas -en su definición y gestión, llevan a cabo programas de promoción de -lectura, trabajan con mediadores, tienen inversiones en el área, -promueven investigaciones y evaluaciones y apoyan las bibliotecas -públicas, escolares y comunitarias en toda la nación. El Ministerio de -Tecnologías de la Información y la Comunicación ha participado en los -estudios nacionales sobre lectura, tiene proyectos destacados y -relacionados con la BDB como los Vive Digital y le da un papel destacado -a la apropiación social de la ciencia y el desarrollo de la -infraestructura digital en la ciudad y el país. - -- Gobernación de Cundinamarca -- Secretaría de Cultura, Recreación y Deportes de Bogotá -- Secretaría de Educación de Bogotá -- Alta Consejería de las TICs de Bogotá -- Comisión de Regulación de las Comunicaciones -- IDARTES - -Las Secretarías de Educación y Cultura son actores centrales como -organismos rectores de cada uno de sus sectores, promotores de planes de -lectura y escritura y en el caso de la Secretaría de Cultura garantizan -la dirección y funcionamiento de la BDB. El IDARTES es una institución -distrital importante para la BDB por sus diferentes gerencias de las -artes, la promoción de colectivos como los Clanes y el desarrollo de la -línea estratégica de "Artes, cultura científica, tecnologías y ciudad". - -Además del MinTICs es central para la BDB su relación con la Alta -Consejería de TICs de Bogotá que traza la política pública distrital en -este tema, desarrolla programas relacionados con la presencia web en las -entidades del Distrito, la conectividad, la participación de la -ciudadanía a través de las TICs, y es un mediador fundamental de la -relación de la lectura con la ciudad. - -- Red de Bibliotecas Públicas de Bogotá -- Fundalectura -- Facultades de Educación y de estudios de lenguaje de universidades - de Bogotá -- Biblioteca Nacional de Colombia -- Biblioteca virtual de la Luis Ángel Arango - -La Biblioteca Nacional tiene funciones preponderantes en el campo de las -bibliotecas públicas y ha llevado a cabo importantes acciones en la -infraestructura digital, las colecciones interactivas y la formación de -bibliotecarios, entre otros temas. Tanto la Biblioteca Nacional como -otras bibliotecas de la ciudad y del país tienen bibliotecas digitales -con las que debe interactuar la BDB en términos de metodologías, -programas, colecciones, trabajo con los lectores, sistemas de -catalogación y préstamo, etc. - -- Colciencias -- Centro ÁTICO Pontificia Universidad Javeriana -- Tadeo Lab -- Maloka -- Asociación para el Avance de la Ciencia (ACAC) - -La Asociación para el Avance de la Ciencia (ACAC), el Observatorio -Colombiano de Ciencia y Tecnología y la Corporación Colombia Digital -(CCD), son tres entidades privadas que pueden convertirse en aliadas de -la BDB. La primera tiene una larga y fructífera experiencia en el -acercamiento de la ciencia a los ciudadanos y en los procesos de -apropiación, el segundo contribuye sobre todo en la sistematización y -análisis de indicadores de la ciencia y la tecnología y la Corporación -Colombia Digital apoya el desarrollo digital de entidades, estudia las -relaciones entre políticas TIC y gobierno y hace seguimiento a la -incidencia de las tecnologías en la calidad de vida. - -- Observatorio Colombiano de Ciencia y Tecnología -- Corporación Colombia Digital (CCD) -- Observatorio Colombiano de Innovación Educativa con uso de TIC. - Universidad del Valle. Centro de Innovación Educativa Regional CIER - Sur -- Asociación Colombiana de Instituciones de Educación Superior - tecnológica ACIET -- Colombia Aprende -- Red Nacional Académica de Tecnología Avanzada. RENATA -- Red Universitaria de Alta Velocidad (Ruav) -- Red Universitaria Mutis -- Sistema Nacional de Ciencia, Tecnología e Innovación, SNCTI - -Las universidades son uno de los interlocutores fundamentales para la -BDB, sobre todo en sus centros de innovación y tecnologías, sus -facultades de educación y sus instancias de estudios de la lectura y la -escritura. Se están extendiendo en ellas los centros de escritura, con -objetivos de formación de profesores y estudiantes, que pueden ser de -gran provecho para la BDB. En algunas universidades se han creado -laboratorios de innovación y tecnologías para la formación, -investigación y extensión de las artes, la educación y el diseño con los -que resulta muy conveniente establecer alianzas. Entre ellos se pueden -destacar el Centro ÁTICO de la Pontificia Universidad Javeriana, -TadeoLab de la Universidad de Bogotá Jorge Tadeo Lozano, la -Especialización en Humanidades Digitales de la Universidad de los Andes, -además de la Universidad Nacional, la Universidad Pedagógica Nacional y -otras universidades. - -- Festival de la Imagen de la Universidad de Caldas -- Cinemateca Distrital -- Proimágenes -- Cámara de Comercio de Bogotá -- SENA -- Mesa de Audiovisuales de Bogotá -- Planetario Distrital -- Patrimonio Fílmico - -La Cinemateca Distrital y el Planetario son dos entidades distritales -que pueden tener sinergias con la BDB. El desarrollo de la primera -permitirá ampliar la creación de las imágenes a nuevas alternativas que -tienen que ver con el mundo digital y el segundo es un lugar de -apropiación ciudadana de la ciencia y un polo de la creación en la -ciudad. - -- Centro de Innovación Pública Digital -- Computadores para Educar -- Nodo Nacional de Innovación Social -- Proyecto Aulas Amigas - -Computadores para Educar se define como un programa gubernamental que -contribuye a la generación de oportunidades de desarrollo mediante el -acceso, apropiación y aprovechamiento de las TICs en las sedes -educativas oficiales. -::: -::: -::: - -::: {#cont2 .anchopan .prueba .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -## Servicios y proyectos digitales relevantes para la Biblioteca Digital de Bogotá {#servicios-y-proyectos-digitales-relevantes-para-la-biblioteca-digital-de-bogotá .azul .semibold .centrar .mayusculas .interlineado1} -::: - - ---------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------- - Nombre de la institución Página web Tipo de servicio a - conectar - - Biblioteca Digital de la [bibliotecadigital.ccb.org.co](http://bibliotecadigital.ccb.org.co/){.gris .subrayado} Producción documental - Cámara de Comercio de Bogotá de la CCB - - Biblioteca Virtual Bogotá [www.bogotaemprende.com](http://www.bogotaemprende.com/biblioteca/cartillas.html){.gris .subrayado} Servicio de la Cámara - Emprende de Comercio de - Bogotá. Acceso a - recursos en .pdf - - Centro de Documentación de [www.ambientebogota.gov.co](http://www.ambientebogota.gov.co/web/sda/publicaciones-sda){.gris .subrayado} Biblioteca Virtual: - la Secretaría Distrital de acceso a - Ambiente. publicaciones - digitales. - - Observatorio Ambiental de [oab.ambientebogota.gov.co](http://oab.ambientebogota.gov.co/404.php){.gris .subrayado} Publicaciones de - Bogotá investigaciones y - trabajos técnicos - - Centro de Documentación del [www.idrd.gov.co](http://www.idrd.gov.co/sitio/idrd/?q=node/509){.gris .subrayado} Base de datos (Excel) - Instituto Distrital de de 2.217 registros - Recreación y Deporte temáticos. - - Centro de Documentación y [www.educacionbogota.edu.co](http://www.educacionbogota.edu.co/es/temas-estrategicos/mas-de-600-publicaciones-digitales-disponibles-en-el-centro-de-documentacion-sed){.gris 673 documentos del - Memoria SED de la Secretaría .subrayado} repositorio - de Educación del Distrito. institucional - representados en 15 - colecciones - temáticas. - - Centro de Documentación en [www.institutodeestudiosurbanos.info](http://www.institutodeestudiosurbanos.info/centrodocumentacion/centro-de-documentacion){.gris .subrayado} Producción académica - Políticas Públicas del especializada en - Distrito Capital estudios urbanos y - regionales de - Colombia. - Observatorios en - Engativá, Chapinero, - Teusaquillo, - Tunjuelito. - - Centro de Memoria, [centromemoria.gov.co](http://centromemoria.gov.co/){.gris .subrayado} Centro de - Reconciliación y Paz Documentación, - Publicaciones, aula - virtual, - exposiciones, - comunidades - Afrocolombianas y - Memoria, etc. - - Biblioteca Secretaría de [www.sdp.gov.co](http://www.sdp.gov.co/portal/page/portal/PortalSDP/ServiciosTramites/%0AGestion_Documental/Biblioteca%0A){.gris .subrayado} Préstamo - Planeación Distrital interbibliotecario - - Centro de Documentación del [documentacion.ideam.gov.co](http://documentacion.ideam.gov.co/){.gris .subrayado} Catálogo y Biblioteca - IDEAM virtual - - CINEP [www.cinep.org.co](http://www.cinep.org.co/Home2/publicacion/biblioteca-sede-cinep-ppp.html){.gris .subrayado} Catálogo, préstamo - interbibliotecario - - Biblioteca ambiental de la [www.observatorioambientalcar.co](http://www.observatorioambientalcar.co/biblioteca-ambiental.php){.gris .subrayado} Recursos - CAR - - Biblioteca Digital [repositorio.artesaniasdecolombia.com.co](http://repositorio.artesaniasdecolombia.com.co/){.gris .subrayado} Acceso al repositorio - institucional de Artesanías - de Colombia - - Colombia Digital [colombiadigital.net](https://colombiadigital.net/herramientas/nuestras-publicaciones.html){.gris .subrayado} Publicaciones sobre - nuevas tecnologías - - Cinemateca Distrital [www.cinematecadistrital.gov.co](http://www.cinematecadistrital.gov.co/mediateca){.gris .subrayado} Acceso a catálogo - Catálogo BECMA y - Catálogo BIBLIOCI. - - Rock al Parque [www.rockalparque.gov.co](http://www.rockalparque.gov.co/){.gris .subrayado} Componente académico - de la actividad. - Referenciar la página - - Canal Capital y emisoras de [www.canalcapital.gov.co](http://www.canalcapital.gov.co/senal-en-vivo){.gris .subrayado} Referenciar las - la ciudad páginas de medios de - comunicación de la - ciudad. - - Emisoras universitarias - ---------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------- -::: - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/aliados.html' - ] - }, - GrafoscopioNode { - #header : 'Taller Intersectorial para Conceptualizar la Biblioteca Digital de Bogotá', - #body : '# TALLER INTERSECTORIAL PARA CONCEPTUALIZAR LA BIBLIOTECA DIGITAL DE BOGOTÁ {#taller-intersectorial-para-conceptualizar-la-biblioteca-digital-de-bogotá .tituloi} -::: - -::: {.imagencontenida .imgfondo5} -::: - -Taller intersectorial para conceptualizar la biblioteca digital de -Bogotá - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### DESCRIPCIÓN DEL TALLER {#descripción-del-taller .azul .semibold .mayusculas} - -La descentralización y la articulación de un proyecto de esta naturaleza -depende de factores tecnológicos, sin duda, pero también depende de -factores institucionales y de la voluntad de individuos. En ese sentido -clásico, una biblioteca digital es un núcleo que conecta y pone en -diálogo diversos repositorios de información estructurada. - -Una biblioteca digital en un espacio de acceso a conocimiento en sus -múltiples manifestaciones: sean textos, libros, revistas, videos, -archivos sonoros, e incluso videojuegos y software, reconociendo la -multiplicidad de maneras como se construye el conocimiento y como se -manifiesta la cultura hoy en día. En ese sentido, una biblioteca digital -debe dar cuenta de todo el rango de expresión humana, eliminando -barreras conceptuales tradicionales que separan a las personas y las -instituciones, a la alta cultura de la cultura popular. - -### ASISTENTES {#asistentes .azul .semibold .mayusculas} - -Biblored, Secretaría de Cultura, Recreación y Deporte, Secretaría de -Educación, Centro de Memoria Histórica, Universidad de los Andes, -Archivo Distrital de Bogotá, Biblioteca Luis Ángel Arango, Red de -Bibliotecas del Banco de la República, Red de Humanidades Digitales, -Alta Consejería TIC de Bogotá, Museo del Oro, Oficina de Apropiación y -Tecnología de la Secretaría de Educación de Bogotá -::: - -::: {.ancho2 .flexv .finicial .cita .ajuste} -::: {.naranjaf1 .cita1 .ajuste .bloque} -~[❝]{.comilla .cafe}~La biblioteca digital es "una herramienta que ocupa -el centro de la actividad intelectual y que no tiene fronteras o -barreras lógicas, conceptuales, físicas o temporales con respecto a la -información\\".~[❞]{.comilla .cafe}~.\\ -[DELOS. Citado en "Anexo 1: Hacia una biblioteca pública digital".]{.pie -.bloque} -::: -::: -::: - -::: {.imagencontenida .imgfondo6} -::: - -Taller intersectorial para conceptualizar la biblioteca digital de -Bogotá - -::: {.prueba .flex} -::: {.ajuste .descripcion .ancho1} -### Conclusiones {#conclusiones .azul .semibold .centrar .mayusculas} - -~[»]{.azul .tamano1}~El entorno digital no solo permite, sino que exige -el trabajo en redes y a través de alianzas. Estas son favorables no solo -a la hora de agregar contenidos y construir colecciones, sino para -llegarle a comunidades locales o remotas, disminuir costos al hacer -compras o desarrollar tecnologías conjuntas, escalar servicios y dictar -(o modificar) políticas acordes a las nuevas lógicas y prácticas de una -sociedad interconectada. - -~[»]{.azul .tamano1}~El uso de las nuevas tecnologías de información en -la bibliotecas favorece y fomenta nuevos modelos de trabajo en los que -prevalecen la interdisciplinariedad y la colaboración. Con ellos se -nutren, crecen y cambian los servicios, y se nutren, crecen y cambian -los conocimientos y habilidades de los empleados. - -~[»]{.azul .tamano1}~Los ambientes colaborativos, que surgen al -aprovechar las TIC para fomentar la participación ciudadana en la -creación de servicios y contenidos, hacen que las funciones de empleados -y bibliotecarios cambien: de funcionarios cuyas tareas radican en suplir -la demanda (poner a disposición colecciones y ofrecer programaciones), -se pasa a la co-creación con el público, de la distribución de -contenidos acabados a la mediación de diversas expresiones culturales. -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 1\\ -\\"Culturizarte\\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital de Bogotá que ayude a las personas a - programar y a conocer la agenda cultural de la ciudad, que trace las - prácticas culturales de la ciudad en toda su diversidad -- Una aplicación que pueda generar recorridos culturales para el - usuario en distintos escenarios, como restaurantes, parques y - exposiciones de arte. -- Un sistema que se alimente de las prácticas culturales en la ciudad - por parte de distintos ciudadanos -::: - -::: {.ancho2 .flex .flexcev .flexceh} -[![](images/grupo1.jpg){#img1 .ancho1 -.imgal}](images/grupo1.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 2\\ -\\"Micelio\\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -Una biblioteca digital donde los ciudadanos puedan encontrar recursos de -información generales y producción de contenidos locales tanto para -usuarios del área rural como del área metropolitana. - -Se plantea una hoja de ruta para su desarrollo que contempla los -siguientes pasos: - -- Definición de contenidos, formatos y materiales que busca la - ciudadanía -- Generación de redes para el acceso y la producción de contenidos con - distintas entidades del distrito -- Asesoría para la gestión, creación y producción de contenidos - digitales para otras instituciones -- Desarrollo de herramientas tecnológicas para la publicación de - material digital por parte de la ciudadanía -::: - -::: {.ancho2 .flexv .flexcev .flexceh} -[![](images/grupo2-1.JPG){#img1 .ancho1 -.imgal}](images/grupo2-1.JPG){.example-image-link} -[![](images/grupo2.JPG){#img1 .ancho1 -.imgal}](images/grupo2.JPG){.example-image-link .margenes2} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 3\\ -"El sistema local" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital debe estar compuesta por los siguientes - cuatro elementos fundamentales: una comunidad compuesta por - individuos y grupos, un depósito estructurado de información, - actividades transversales que los vinculan y mediadores. -- El entorno digital o virtual es un espacio propicio para potenciar - todas las iniciativas locales, para que puedan convertirse en - motores para el fortalecimiento de la identidad local. -- Este enfoque local debe fomentar la participación política y la - veeduría ciudadana así como potenciar los liderazgos locales que ya - existen en la ciudad. Así, cada grupo local podría construir su - propia biblioteca digital o "depósitos de información" para sus - propios fines con el apoyo y guía de los mediadores. -- Es importante que los usuarios puedan comentar y construir vínculos - y conversaciones en torno a los depósitos de información. -- Se deben romper las divisiones tradicionales de Museo, Archivo y - Biblioteca mediante la articulación de los catálogos de estas - entidades distritales a través de un metacatálogo. -- Hacer funcionar el servicio de referencia de las bibliotecas a - través de un chat virtual 24/7 -- Generar un mapa de proyectos locales para fomentar, con la ayuda de - la plataforma, la colaboración entre distintas comunidades. -::: - -::: {.ancho2 .flex .margen4 .flexceh} -[![](images/grupo3.jpg){#img1 .ancho1 -.imgal}](images/grupo3.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 4\\ -\\"Dream Machine\\" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Un gran repositorio de contenidos con alto contenido de - personalización pertinentes para el contexto bogotano, no - necesariamente sobre Bogotá. La personalización por medio de - herramientas tecnológicas supliría el rol del mediador. -- Un indexador de información de tal forma que no se aloje en la - biblioteca digital sino que la llame a través de un protocolo - estructurado y organizado. -- Es necesario iniciar con una etapa de planeación para la - estructuración de la información que contendría la biblioteca - digital, vinculando en esta etapa a todas las entidades del distrito - que producen contenidos pertinentes tales como Cinemateca, - Planetario, Biblored, Museo de Bogotá. Esta estructura de - información es fundamental para integrar la participación de los - ciudadanos. -- Construir un algoritmo eficaz de personalización que le permita a - los usuarios tener información en tiempo real sin necesariamente - estar en un espacio físico. Que la biblioteca digital se le - "atraviese" al usuario en el espacio urbano, de modo que la - información haga parte de la vida del usuario. También promover la - participación de los ciudadanos como creadores y como curadores de - la información ya existente. -- Buscar alianzas con las empresas de telefonía móvil con el fin de - proporcionar a los usuarios facilidad de acceso a la red sin que - impacte en su consumo de datos. -::: - -::: {.ancho2 .flex .flexceh .margen4} -[![](images/grupo4.jpg){#img1 .ancho1 -.imgal}](images/grupo4.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 5\\ -¿Qué hay pa\' hacer? - -Puntos clave de la propuesta de biblioteca digital del grupo: - -- Una biblioteca digital que propicie una cartografía participativa - retroalimentada por casas de la cultura, fundaciones y juntas de - acción comunal. -- Un espacio que relacione los eventos con los contenidos físicos o - virtuales de las bibliotecas de la ciudad para relacionar la - cotidianidad cultural de la ciudad con la información disponible en - las bibliotecas. -- El plan de trabajo se estructura desde instituciones hasta las - comunidades para construir una comunidad que genere una cartografía - participativa. Se debe apoyar este trabajo en la oficina de gestión - territorial de Biblored. -- La biblioteca digital tiene como intención generar nodos dentro de - una red de referentes virtuales para funcionar. -::: - -::: {.ancho2 .flexv .flexcev .flexceh} -[![](images/grupo5.jpg){#img1 .ancho1 -.imgal}](images/grupo5.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.flex} -::: {.ajuste .descripcion .ancho1} -GRUPO 6\\ -"La biblioteca del caos" - -Puntos clave de la propuesta de biblioteca digital del grupo: - -En busca de la definición de esa biblioteca digital se exploraron -metáforas o espacios análogos como: un restaurante con buffet -autoservicio, un parque temático de diversiones, una librería o un -espacio lúdico. - -Más allá de crear un espacio de consulta de información, esta biblioteca -digital busca generar una experiencia que genere una comunidad de -personas afines con el fin de generar un centro cultural que exceda la -definición clásica de la biblioteca - -Aliados importantes y sus aportes: - -- Museo del Oro: aportaría experiencia interactiva así como su - experiencia en la formación de "animadores culturales" como un nuevo - tipo de bibliotecario. -- Biblored aporta el territorio, memoria local, información local y, - principalmente, la red que ya tiene construida y las comunidades que - ya están vinculadas a las bibliotecas. -- Uniandes aportaría conceptos de cultura digital, pensamiento en - torno al nuevo concepto de la biblioteca y su transformación en el - tiempo, y la vinculación de la maestría en humanidades de la - Universidad. - -Es importante tener en cuenta el tema de los derechos de autor antes de -pensar en la estructuración de contenidos. - -También se debe contemplar el uso de software de uso libre para la -biblioteca digital de Bogotá. -::: - -::: {.ancho2 .flexceh .margen4} -[![](images/grupo6.jpg){#img1 .ancho1 -.imgal}](images/grupo6.jpg){.example-image-link} -::: -::: -::: - -::: {.prueba .anchopan .bloque .centrar .sombra .margenes2} -::: {.ajuste .descripcion .ancho1} -Conclusiones de la jornada a cargo de Ana Roda, directora de Lectura y -BIbliotecas de la Secretaría de Cultura de Bogotá - -Palabras de cierre del taller intersectorial convocado el 20 de -diciembre de 2016 por la Dirección de Bibliotecas de la Secretaría de -Cultura de Bogotá para avanzar hacia la construcción de una futura -biblioteca digital para la ciudad de Bogotá. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/taller.html' - ] - }, - GrafoscopioNode { - #header : 'Créditos', - #body : '# CRÉDITOS {#créditos .tituloi} -::: - -::: {.ajuste .centrar .gris .ancho4 .creditos} -[Secretaria de Cultura, Recreación y Deporte]{.semibold}\\ -María Claudia López - -[Directora de Lectura y Bibliotecas]{.semibold}\\ -Ana Roda Fornaguera - -[Investigación "Pasos para una futura\\ -Biblioteca Digital de Bogota", 2016]{.semibold}\\ -Germán Rey\\ -Sandra Angulo\\ -María Alejandra Pautassi\\ -Juan Saab\\ -Andrés Echeverry -- [Manuvo Colombia](http://www.manuvo.com){.gris}\\ -Catalina Holguín -- [Manuvo Colombia](http://www.manuvo.com){.gris} - -\\ -\\ - -[Taller intersectorial -- 20 diciembre 2016]{.semibold} - -[Líder y facilitador]{.semibold}\\ -Elkin Garavito -- [Sikuani.net](http://sikuani.net/#){.gris} - -[Asistentes]{.semibold}\\ -Catalina Holguín -- [Manuvo Colombia](http://www.manuvo.com){.gris}\\ -Andrés Echeverry -- [Manuvo Colombia](http://www.manuvo.com){.gris} - -[Logística]{.semibold}\\ -Gaelle Alcántara - -[Entidades asistentes]{.semibold}\\ -Biblored, Secretaría de Cultura, Recreación y Deporte, Secretaría de -Educación, Centro de Memoria Histórica, Universidad de los Andes, -Archivo Distrital de Bogotá, Biblioteca Luis Ángel Arango, Red de -Bibliotecas del Banco de la República, Red de Humanidades Digitales, -Alta Consejería TIC de Bogotá, Museo del Oro, Oficina de Apropiación y -Tecnología de la Secretaría de Educación de Bogotá -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '', - 'http://www.culturarecreacionydeporte.gov.co/biblioteca/creditos.html' - ] - } - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @12, - @16, - @20, - @24, - @28, - @32, - @36, - @40, - @44 -] DELETED Artefactos/DataSelfies/data-selfies.ston Index: Artefactos/DataSelfies/data-selfies.ston ================================================================== --- Artefactos/DataSelfies/data-selfies.ston +++ Artefactos/DataSelfies/data-selfies.ston @@ -1,323 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Actualizar NeoJSON', - #body : 'Gofer it -\tsmalltalkhubUser: \'SvenVanCaekenberghe\' project: \'Neo\'; -\tconfigurationOf: \'NeoJSON\'; -\tloadStable. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @4, - @2, - GrafoscopioNode { - #header : 'Importat Tweets desde JSON a una colección ', - #body : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Local ', - #body : '| trinos | -trinos := TwitterMessages new importFromJSONLocalFile: FileLocator temp asFileReference / \'2012_03.js\'. -trinos splitByType - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @6, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Remoto', - #body : '| aJSONFileUrl messages | -aJSONFileUrl := \'https://ia801506.us.archive.org/31/items/offrayLC-tweets/tweets/2012_06.js\'. -messages := TwitterMessages new importFromJSONRemoteFile: aJSONFileUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @6, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @4, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @11, - GrafoscopioNode { - #header : 'Partir mensages', - #body : '| aJSONFileUrl messages | -aJSONFileUrl := \'https://ia801506.us.archive.org/31/items/offrayLC-tweets/tweets/2012_06.js\'. -messages := TwitterMessages new importFromJSONRemoteFile: aJSONFileUrl. -messages splitByType ', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Prueba', - #body : 'TwitterMessagesTest new test', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @15, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @4, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @17, - GrafoscopioNode { - #header : 'Twitter profile overview', - #body : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Mensaje completo', - #body : '"This is still not working... next Data Weeks / Rodas, could -work on solving it" -| tweetsFile overview | -tweetsFile := FileLocator temp asFileReference / \'2012_06.js\'. -overview := TwitterProfileOverview new. -overview -\tgetAvatarForProfile: \'offrayLC\'; -\tsplitMessagesByTypeFrom: tweetsFile. -overview avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @21, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'newNode', - #body : '', - #children : OrderedCollection [ ], - #parent : @21, - #level : 2 - }, - GrafoscopioNode { - #header : 'Reconstruyendo avatarWheel', - #body : 'La rueda del avatar no está funcionando. -Acá voy a intentar reconstruir el método hasta tener una visualización funcional.', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Método cási original', - #body : '| o p tweetsFile | -o := TwitterProfileOverview new. -o screenName: \'offrayLC\'. -tweetsFile := FileLocator temp asFileReference / \'2011_09.js\'. -o messages importFromJSONLocalFile: tweetsFile. -o. -p := TwitterProfile new scrapDataForProfile: o screenName. -o avatar: p avatar. -\t^o avatarWheel', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @28, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tagged Avatar Wheel', - #body : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Original', - #body : '\t| o p tweetsFile | -\to := TwitterProfileOverview new. -\to screenName: \'offrayLC\'. -\ttweetsFile := FileLocator temp asFileReference / \'2012_03.js\'. -\tp := TwitterProfile new scrapDataForProfile: o screenName. -\to messages importFromJSONLocalFile: tweetsFile. -\to avatar: p avatar. -\t^o taggedWheelFull -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @33, - #level : 4, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/788TNQ9BHU0Q', - 'http://ws.stfx.eu/47K6ORJSGEII' - ] - }, - GrafoscopioNode { - #header : 'Empezar a deconstruir acá', - #body : '\t| tweetsArc retweetArc mentionsArc tweetsWords retweetedProfiles mentionedProfiles visualWords arcs queries canvasTemp aWordsPercentage rtProfilesPercentage mtProfilesPercentage aColorPalette o p tweetsFile | -\taWordsPercentage := 80. -\trtProfilesPercentage := 20. -\tmtProfilesPercentage := 10. -\taColorPalette := { Color orange . Color black . Color green } -\to := TwitterProfileOverview new. -\to screenName: \'offrayLC\'. -\ttweetsFile := FileLocator temp asFileReference / \'2012_03.js\'. -\tp := TwitterProfile new scrapDataForProfile: o screenName. -\to messages importFromJSONLocalFile: tweetsFile. -\to avatar: p avatar. -\to messages ifNil: [ ^ o ]. -\ttweetsArc := o avatarWheel canvas shapes at: 2. -\tretweetArc := o avatarWheel canvas shapes at: 1. -\tmentionsArc := o avatarWheel canvas shapes at: 3. -\ttweetsWords := o messages wordsByFrequencyInTweetsUpTo: aWordsPercentage. -\tretweetedProfiles := o messages retweetedProfilesByFrequencyUpTo: rtProfilesPercentage. -\tmentionedProfiles := o messages mentionedProfilesByFrequencyUpTo: mtProfilesPercentage. -\tarcs := { tweetsArc . retweetArc . mentionsArc }. -\tqueries := { tweetsWords . mentionedProfiles . retweetedProfiles }. -\tcanvasTemp := o avatarWheel canvas. -\tarcs doWithIndex: [ :arc :i | -\t\tvisualWords := TPMessages new -\t\t\tvisualWordsFrom: (queries at: i) -\t\t\tcolored: (aColorPalette at: i). -\t\tarc color: (aColorPalette at: i). -\t\tarc -\t\t\tsurroundedBy: visualWords -\t\t\tradialGap: 85 -\t\t\tangularGap: 3 -\t\t\trenderedIn: canvasTemp. -\t\tcanvasTemp := canvasTemp\t -\t]. -\t^ canvasTemp', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @33, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Con un sólo arco', - #body : '\t| tweetsArc retweetArc mentionsArc tweetsWords retweetedProfiles mentionedProfiles visualWords arcs queries canvasTemp aWordsPercentage rtProfilesPercentage mtProfilesPercentage aColorPalette o p tweetsFile | -\taWordsPercentage := 0. -\trtProfilesPercentage := 20. -\tmtProfilesPercentage := 10. -\taColorPalette := { Color black . Color black . Color green }. -\to := TwitterProfileOverview new. -\to screenName: \'offrayLC\'. -\ttweetsFile := FileLocator temp asFileReference / \'2012_03.js\'. -\tp := TwitterProfile new scrapDataForProfile: o screenName. -\to messages importFromJSONLocalFile: tweetsFile. -\to avatar: p avatar. -\to messages ifNil: [ ^ o ]. -\ttweetsArc := o avatarWheel canvas shapes at: 2. -\ttweetsWords := o messages wordsByFrequencyInTweetsUpTo: aWordsPercentage. -\tarcs := { tweetsArc }. -\tqueries := { tweetsWords }. -\tcanvasTemp := o avatarWheel canvas. -\tarcs doWithIndex: [ :arc :i | -\t\tvisualWords := TPMessages new -\t\t\tvisualWordsFrom: (queries at: i) -\t\t\tcolored: (aColorPalette at: i). -\t\tarc color: (aColorPalette at: i). -\t\tarc -\t\t\tsurroundedBy: visualWords -\t\t\tradialGap: 85 -\t\t\tangularGap: 3 -\t\t\trenderedIn: canvasTemp. -\t\tcanvasTemp := canvasTemp\t -\t]. -\t^ canvasTemp -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @33, - #level : 4, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/63ZSU4Q3U5HI' - ] - } - ], - #parent : @28, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @21, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @4, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @23, - @26, - @28, - @30, - @33, - @35, - @38, - @41, - GrafoscopioNode { - #header : 'Perfiles poderosos', - #body : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lleras', - #body : '" I try to read a JSON file with SmallTalk " -| input reader currentTweet | -input := FileLo. -" I try parse the Json File with NeoJson " -"reader := NeoJSONReader fromString: input contents asString ." -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @47, - #level : 2, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/1P98HQ1DDNQU' - ] - } - ], - #parent : @4, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @49 - ] - }, - #level : 1, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/BX5B5QS3XPOI' - ] - }, - @6, - @15, - @21, - @47 -] DELETED Artefactos/Scripts/image-links.lua Index: Artefactos/Scripts/image-links.lua ================================================================== --- Artefactos/Scripts/image-links.lua +++ Artefactos/Scripts/image-links.lua @@ -1,43 +0,0 @@ ---[[ -I'm a script modified from [1], to find all image links instead of -counting all links. - -[1] https://pandoc.org/lua-filters.html#extracting-information-about-links - -To run me just do: - -pandoc -lua-filter=links.lua input-file.html > output.html - -Notice that input-file can have any format supported by Pandoc, not -only html - -]] - -links = {} - -function Image (s, src) - if links[s.src] then - links[s.src] = links[s.src] + 1 - else - links[s.src] = 1 - end - return el -end - -function Doc (blocks, meta) - function strCell(str) - return {pandoc.Plain{pandoc.Str(str)}} - end - local caption = {pandoc.Str "Image Links"} - local aligns = {pandoc.AlignDefault, pandoc.AlignLeft} - local widths = {0.8} - local headers = {strCell "Target"} - local rows = {} - for link in pairs(links) do - rows[#rows + 1] = {strCell(link)} - end - return pandoc.Doc( - {pandoc.Table(caption, aligns, widths, headers, rows)}, - meta - ) -end DELETED Artefactos/SoftwarePublicoColombia/anotaciones.png Index: Artefactos/SoftwarePublicoColombia/anotaciones.png ================================================================== --- Artefactos/SoftwarePublicoColombia/anotaciones.png +++ Artefactos/SoftwarePublicoColombia/anotaciones.png cannot compute difference between binary files DELETED Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md Index: Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md ================================================================== --- Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md +++ Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md @@ -1,159 +0,0 @@ - - -Bogotá, Octubre 5 de 2017 - -Cordial saludo Javier, - -Muchas gracias por acompañarnos al DataWeek donde analizamos Software Público. -Fue una conversación muy amena y bastante interesante para todos. -Este correo lo redactamos entre los participantes de la comunidad, para dar respuesta a los comentarios -y solicitudes que nos hiciste. -Esperamos compartir las inquietudes y tus respuestas con la comunidad nacional e internacional que aboga -por software público, entre otros la iniciativa europea Public Code ( https://publiccode.eu/ ), que cuenta -con varias ONGs (Wikimedia Fundation, Open Knowlege Foundation, KDE Foundation, Open Source Initiative, -Open Street Map, entre casi 50 entidades) de modo que coayudemos en la construcción de transparencia, -trazabilidad e impacto para esta iniciativa, en un diálogo crítico, constructivo y permanente entre -sociedad civil y gobierno, liderando así iniciativas de escala internacional y en articulación y consonancia -con ellas. - -A continuación enunciamos las inquietudes, comentarios y solicitudes que conversamos en nuestra reunión: - - - **Información del convenio entre el Banco Mundial y MinTIC y el encargado para la implementación y despligue del portal de Software Público:** - - Quisiéramos conocer la información detallada del convenio entre el Banco Mundial y MinTIC para la implementación y despligue del - portal de Software Público, así como la información sobre la entidad que fue elegida para dicha labor y su proceso de selección. - ¿Cómo nace esta iniciativa? - ¿Dónde podemos encontrar una copia de dicho convenio detallado? ¿Cómo se realizó dicha selección?, - ¿Qué criterios, desprendidos del convenio, hacen a dicha entidad idónea para la labor? - ¿Qué compromisos adquirió dicho entidad encargada del portal por el monto del convenio, cuál fue dicho monto, - y cómo se repartió entre los financiadores?, - ¿Qué garantía ofrece la entidad sobre el portal y por cuánto tiempo y cómo dicha garantía tiene que ver con - implementar las características que las comunidades de base y usuarios destinatarios del portal han realimentado - sobre carencias y mejores del portal de Software Público Colombia? - ¿Quién es el interventor para este gasto público y quien es el funcionario encargado de recibirlo con la calidad adecuada - y darle seguimiento al proyecto? - En caso de que haya iniciativas que puedan ser contratadas con comunidades de base o empresas surgidas de ellas, - ¿cuál es el plan de incentivos para las mismas, en el caso específico del Portal de Software Público Colombia? - - Recomendamos colocar la información en los píes de página sobre la contratación, el convenio, la licencia de contenidos, de forma que las comunidades de - software libre nacionales e internacionales, así como otros integrantes de la sociedad civil podamos coadyudar en el aumento de transparencia y trazabilidad - entre los requerimientos asociados a las infraestructuras gubernamentales digitales, su implementación, presupuestos y código fuente. - - - **Información sobre la plataforma informática elegida** - - Notamos, durante el análisis hecho a la infraestructura, que se trata de un sitio Drupal, relativamente genérico y con pocas adaptaciones - específicas para ofrecer un catálogo de Software Público. En particular, dicho portal no ofrece un API donde se puedan consultar los datos - publicados en el mismo y los 4 publicados hasta el momento están en formato HTML plano, sin ofrecer alternativas para descargar - conjuntos de datos o vistas individuales de los mismos en formatos abiertos (JSON, CSV, etc.) - ¿ Cuáles son los motivos para escoger dicha infraestructura y cómo se realizó la comparativa con otras infraestructuras de software libre, - que permiten la creación de catálogos de distinta índole y su publicación como datos abiertos (como CKAN (https://ckan.org/) por ejemplo) ?. - En particular nos interesa saber sobre la comparativa entre Drupal y CKAN y también otras alternativas fueron consideradas, comparadas y evaluadas - antes de elegir Drupal en particular. - - - **Información de la licencia de los contenidos publicados en el portal** - - No hay una licencia para los contenidos publicados en el portal. - Aclaramos que nos referimos a la licencia de los contenidos del portal de software público - y no a los de los proyectos individuales listados en el mismo. - Para el caso del portal similar en Chile, la licencia es una Creative Commons Atribución, - que consideramos consecuente también para el caso colombiano. http://www.softwarepublico.gob.cl - - - **Control de versiones del Software Publico y cívico alojado en el Portal** - - Tras revisar los proyectos de Software libre alojados en el portal, notamos que de los 4, - dos de ellos están en GitHub, uno en Google Drive y otro muestra los archivos directamente en el buscador. - Esta forma de almacenamiento imposibilita un sistema de control adecuado de versiones y realizar trazabilidad - del software a futuro (número de entidades que lo utilizan, cantidad de modificaciones y ajustes realizados, - bugs reportados, etc). Adicionalmente, difuculta el uso y adaptación del software por otras entidades - (objeto principal del software libre). - Sugerimos que, en aras de alentar el contorl de calidad en los datos del Portal de Software Público, los usuarios - reporten en el portal, no sólo dónde se encuentra disponible el código fuente de los proyectos, sino si estos están - disponibles en un sistema de control de versiones (Github, GitLab, Fossil, etc) - Consecuentes con las prácticas que el portal intentan implementar, también solicitamos que el portal vincule en el - pie de página al repositorio de código fuente para el portal de Software Libre Colombia y que no sólo el código - fuente sino también los datos y demas información publicada en el portal se encuentre disponible en un sistema de - control de versiones que también se referencie en dicho pie de página. - Para ser mas consecuentes, los datos generados por el portal deberian estar publicados en el portal de Datos Abiertos - , pero consumibles directamente desde el portal, sin obligar al usuario a buscar los datos - del segundo, en el primero. - - - **Cuestiones relacionadas con el diseño y la funcionalidad del portal**: - - A pesar de que consideramos es labor del equipo que entrega y recibe el portal, asegurar la calidad del mismo, para cumplir con el mandato de eficiencia en el gasto del dinero público, no - pudimos evitar ver varios defectos de funcionalidad que saltan a la vista. - A continuación incluimos algunos comentarios directamente relacionados con aspectos estéticos, de usabilidad y de diseño del portal: - - - Buscador de Software Público - - Al realizar una búsqueda cualquiera en el Portal de Software Público, la plataforma lleva a la dirección - "", que genera un error. - Aquí la captura de pantalla de la búsqueda y su resultado (No se puede conectar) [4] - - - Traducción al inglés: - - * El banner central en movimiento en la página HOME no está traducido en la versión inglesa. - * El pie de página no está disponible en Inglés. - * El email de comprobación de registro de usuarios es en Español cuando registras desde la versión Inglesa de la Web - * Tampoco existe versión en inglés de los "Términos y condiciones de Uso -Portal de Software Público de Colombia" [8] - * En general el soporte en inglés de toda la Web debe revisarse. Otro ejemplo, Vemos un texto de "Lorem Ipsum", - fruto de un desarrollo inacabado [9] - - - Cabecera - - * Colores de cabecera y fondo del sitio web: Los colores de la imagen de cabecera no coinciden con los del fondo. - Aquí la captura de pantalla [6] - * Los iconos superiores de la Web a Fb, G+ y Twitter son generales, no llevan a una cuenta del portal o del gob con información. ie irrelevantes. - - - Pie - - * El icono de Vive Digital para la gente debería apuntar a , - como se puede ver en [10], sin embargo, apunta a la Web del Mintic, igual que el logo de su derecha. - * Así mismo, esperaríamos que el Logo de "Todos Por Un Nuevo Pais" dirija al Dep. Nacional de Planeación [11], - y al Plan Nacional de Desarrollo 2014-2018, pero solo nos lleva al Mintic ¡otra vez! - - - **Mesa de Gobernanza de Internet** - - En nuestro encuentro, te comentamos sobre las dinámicas de la Mesa de Gobernanza de Internet [2]. - El 3 y 4 de Octubre se hizo el cuarto foro [3]. Te hacemos extensiava la invitación - a la Mesa de Gobernanza, para que participes otras dinámicas multipartita (*multistake holder*) - que juntan la sociedad civil, el gobierno y los privados respecto al despliegue, regulación, uso - e implementación de la importante infraestructura TIC que es Internet. - -Nos alegra que estos encuentros sirvan para que iniciativas de la sociedad civil, como la del Data Week se tengan en cuenta para los proyectos que adelanten. -Ojalá que esta sea la primera de muchas otras interacciones y por favor cuente con nosotros para fortalecer este tipo de proyectos, que como los mencionamos -son iniciativas muy útiles y necesarias, de las que esperamos participar desde los primeros momentos, tanto -en la definición de las políticas públicas, como de los requierimientos y posibilidades para las infraestructuras digitales gubernamentales y -prácticas de transparencia e informáticas que las soporten. - -Continuaremos aportando en esta misma línea tanto sobre este portal y proyecto, como otros actuales y futuros. -Con la atención prestada desde tu proyecto y las respuestas a estas y otras inquietudes y oportunidades de colaboración, creemos que -podemos aportar de manera conjunta a la construcción de un futuro compartido para el país, basado en el software público y otras -formas de conocimiento y bienes comunes. - -Saludos y gracias de nuevo, - -La comunidad del Data Week - -Enlaces: - -``` - [1] http://mutabit.com/dataweek/ - [2] https://gobernanzadeinternet.co/ - [3] https://gobernanzadeinternet.co/evento2017/ - [4] http://a.nomono.co/9h - [5] http://a.nomono.co/9i - [6] http://a.nomono.co/9j - [7] http://a.nomono.co/9k - [8] http://www.softwarepublicocolombia.gov.co/en/terms-and-conditions - [9] http://www.softwarepublicocolombia.gov.co/en/public-software - [10] http://www.mintic.gov.co/portal/vivedigital/612/w3-channel.html - [11] https://www.dnp.gov.co/Paginas/inicio.aspx -``` DELETED Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf Index: Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf ================================================================== --- Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf +++ Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf cannot compute difference between binary files DELETED Artefactos/SoftwarePublicoColombia/intro.md Index: Artefactos/SoftwarePublicoColombia/intro.md ================================================================== --- Artefactos/SoftwarePublicoColombia/intro.md +++ Artefactos/SoftwarePublicoColombia/intro.md @@ -1,60 +0,0 @@ -# Portal de Software Público Colombia - -> Nuestro énfasis va a estar en la **trazabilidad** de las iniciativas, desde -su formulación, hasta su código fuente, pasando por la contratación y ejecución - -> — Conversación durante el Data Week 9. - -El portal de [Software Publico Colombia][spc] es una iniciativa que busca -indexar distintas proyectos de software libre y de código abierto financiaddos -con dineros públicos. -Durante la edición 9 del [Data Week][dataweek], le hicimos una auditoría -a dicho portal, como un ejercicio de [ciudadanía digital][digital-citizen], -en el que, desde acciones mediadas por tecnologías digitales (particularmente -[Grafoscopio][grafoscopio] e [Hypothesis][hypothesis], procuramos construir -un puente entre la sociedad civil y las instituciones públicas, a propósito de -las infraestructuras digitales que proyectos como el Portal de Software Público, -proponen y despliegan. - -

- - Visualizando archivos PDF - - - Carta Abierta - - - Anotaciones con Hypotesis. - -

- - -Para lo anterior hicimos un ejercicio de visualización de datos y anotación sobre -la infraestructura de este portal, nos reunimos con el líder de la iniciativa en MinTIC, -quien nos atendió de manera pronta y cordial y formalizamos una serie de sugerencias e -inquietudes, el 5 de octubre de 2017, que ahora compartirmos con ustedes como una -carta abierta, cuya respuesta también compartiremos también, *una vez MinTIC nos conteste*. - -[Carta Abierta sobre el portal de Software Público Colombia][carta-abierta] - -[dataweek]: http://mutabit.com/dataweek/ -[spc]: http://softwarepublicocolombia.gov.co/ -[digital-citizen]: https://www.amazon.com/Citizens-Professor-International-University-Institute/dp/1783480564 -[carta-abierta]: ./carta-lider-iniciativa.pdf -[hypothesis]: https://web.hypothes.is DELETED Artefactos/SoftwarePublicoColombia/pdf-files-dataviz.jpg Index: Artefactos/SoftwarePublicoColombia/pdf-files-dataviz.jpg ================================================================== --- Artefactos/SoftwarePublicoColombia/pdf-files-dataviz.jpg +++ Artefactos/SoftwarePublicoColombia/pdf-files-dataviz.jpg cannot compute difference between binary files DELETED Artefactos/SoftwarePublicoColombia/portada-carta.png Index: Artefactos/SoftwarePublicoColombia/portada-carta.png ================================================================== --- Artefactos/SoftwarePublicoColombia/portada-carta.png +++ Artefactos/SoftwarePublicoColombia/portada-carta.png cannot compute difference between binary files DELETED Artefactos/SoftwarePublicoColombia/software-publico.ston Index: Artefactos/SoftwarePublicoColombia/software-publico.ston ================================================================== --- Artefactos/SoftwarePublicoColombia/software-publico.ston +++ Artefactos/SoftwarePublicoColombia/software-publico.ston @@ -1,1018 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Software cívicas para auditar el Software Público', - #body : 'Como es costumbre, MinTIC alienta la participación de maneras inadecuadas, -favoreciendo, por acción u omisión a terceros. -Para invitarnos a hablar de Software Público, usó de manera exclusiva el portal -de FacebookLive y, por supuesto, se puede entender que sea *una* de las plataformas -a utilizar, pero lo que es incomprensible es que sea la única (configura esto una -forma de favoreciemiento a terceros, al no permitir la amplia participación a través -de la Internet Abierta?) - -Esta libreta de datos intenta proponer desde la sociead civíl, otras formas de participación -crítica, constructiva y que usen infraestrucutras públicas y abiertas para hablar de Software -Público y continua los esfuerzos de lo que le planteamos a MinTIC a través de la iniciativa -de Gobierno En Línea, desde el 2013, a través de la [Gobernatón][gobernaton]. -Esperamos esta vez, sí ser escuchados. - -[gobernaton]: http://mutabit.com/offray/static/blog/output/posts/la-gobernaton-que-sigue.html', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Repositorio abierto de código (Fossil)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @2, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Comentarios a textos', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @2, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Términos y condiciones del portal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Scrapper', - #body : '| downloadUrl localRepo | -downloadUrl := \'http://www.softwarepublicocolombia.gov.co/es/terms-and-conditions-es\'. -localRepo := FileLocator documents asFileReference / \'Mutabit\' / \'DataWeek\' / \'Repo\' / \'Artefactos\' / \'softwarepublicocolombia.gov.co\'. -(localRepo / \'terms-and-conditions-es\') ensureDelete. -ZnClient new -\turl: downloadUrl; -\tdownloadTo: localRepo. -localRepo / \'terms-and-conditions-es\'', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @13, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @2, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @21, - @2, - @5, - @9, - @13, - @16, - GrafoscopioNode { - #header : 'Redes sociales', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'HashTags', - #body : '``` -#HablemosdeGobDigital -#SoftwarePublico -```', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @27, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Usuarios', - #body : '@Gobiernoenlinea -@GANANARINO', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @27, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @24, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @21, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @27, - @30, - @34, - GrafoscopioNode { - #header : 'Portal de Software Público', - #body : 'Trabajaremos sobre el proyecto del Portal de Software Público, llevando la conversación sobre el mismo a escenarios públicos y abiertos, invitando a dicha conversación a entidades y funcionarios públicos por redes sociales y mirando sus respuestas (o ausencia de ellas) frente a las inquietudes ciudadanas. Para esto usaremos las anotaciones en Hypothesis y algunas técnicas de scraping, control de versiones y visualización de datos. Luego articularemos esto con la iniciativa europea Public Code, intercambiando y fortaleciendo experiencias y comparando cómo ocurre en diálogo entre estado y sociedad civíl en Colombia y Europa.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un mapa del sitio', - #body : 'La idea acá es tener un listado de todas las páginas a las que el portal apunta, distinguiendo -aquellas que son información contenida dentro del portal de aquella que no, y enlazando -luego esta representación visual con los comentarios que se han hecho en Hypothesis.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Descargar la información', - #body : 'Se descarga usando wget: - -wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=windows --domains softwarepublicocolombia.gov.co --no-parent www.softwarepublicocolombia.gov.co/ -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @43, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizar el sitio', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Como cluster', - #body : ' -| path allFilesUnderPath b | -path := FileLocator temp / \'SoftwarePublico\' / \'www.softwarepublicocolombia.gov.co\'. -\tallFilesUnderPath := path asFileReference allChildren. -\tb := RTMondrian new. -\tb shape rectangle -\t color: Color gray trans; -\t if: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -\tb nodes: allFilesUnderPath. -\tb edges connectFrom: #parent. -\tb normalizer -\t normalizeSize: #size min: 10 max: 150 using: #sqrt. -\tb layout cluster. -\tb -\t -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 5, - #links : OrderedCollection [ - '', - 'https://pharoweekly.wordpress.com/2016/04/25/soup1-8-ann-introspect-web-content/' - ] - }, - GrafoscopioNode { - #header : 'Como sunburst', - #body : '| b c1 c2 | -b := RTSunburstBuilder new. -c2 := Color r: 177 / 255.0 g: 175 / 255.0 b: 134 / 255.0. -c1 := Color r: 98 / 255.0 g: 101 / 255.0 b: 73 / 255.0. -b interaction addInteraction: RTSBFadeInteraction new. -b -\tcolor: c2; -\tangularSpacing: 1; -\tradialSpacing: 5; -\tleafWeight: [ :f | f size sqrt ]; -\tleafColor: c1; -\texplore: FileLocator temp asFileReference / \'SoftwarePublico\' / \'www.softwarepublicocolombia.gov.co\' -\tnesting: #directories leaves: #files. -b view canvas camera scale: 1.5. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Como Treemap circular', - #body : '| b path allFilesUnderPath | -b := RTCircularTreeMapBuilder new. -path := FileLocator temp / \'SoftwarePublico\' / \'www.softwarepublicocolombia.gov.co\'. -\tallFilesUnderPath := path asFileReference allChildren. -b shape -\tcolor: Color transparent; -\tborderColor: Color black; -\tif: [ :aFile | aFile children isEmpty ] -\t\tfillColor: [ :aFile | -\t\t\t(aFile path basename endsWith: \'.pdf\') -\t\t\t\tifTrue: [ Color green ] -\t\t\t\tifFalse: [ Color purple ] ]. -b -\tbaseradius: 200; -\tweight: [ :cls | cls withAllSubclasses size ]. -b explore: RTObject using: #children. -b build. -^ b view -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/QTTVK6WYNRKG' - ] - } - ], - #parent : @43, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @43, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Portal de Software Público', - #body : Text { - #string : 'Trabajaremos sobre el proyecto del Portal de Software Público, llevando la conversación sobre el mismo a escenarios públicos y abiertos, invitando a dicha conversación a entidades y funcionarios públicos por redes sociales y mirando sus respuestas (o ausencia de ellas) frente a las inquietudes ciudadanas. Para esto usaremos las anotaciones en Hypothesis y algunas técnicas de scraping, control de versiones y visualización de datos. Luego articularemos esto con la iniciativa europea Public Code, intercambiando y fortaleciendo experiencias y comparando cómo ocurre en diálogo entre estado y sociedad civíl en Colombia y Europa.', - #runs : RunArray { - #runs : [ - 630 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : @41, - #children : @42, - #parent : GrafoscopioNode { - #header : 'Temático', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @76, - #level : 2 - }, - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @84, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @84, - #level : 3 - } - ], - #parent : @81, - #level : 3 - } - ], - #parent : @76, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @76, - #level : 2 - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Description', - #key : '', - #body : 'This is a hackathon+workshop about interactive documentation, reproducible research and data activism / visualization, where participants learn how to work and connect symbolic (code) and graphical ( visualization) representations of data. It is a workshop because is oriented towards learning by doing and is a hackathon because is oriented towards prototyping and releasing. The objective is to approach to the building, understanding and improvement of a shared world, mediated by data.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @93, - #level : 1 - }, - GrafoscopioNode { - #header : 'Introductorio', - #key : '', - #body : 'All memories of the data week can be found in the source code repository at: http://mutabit.com/repos.fossil/dataweek/ - -This are some notes with more structure, result of the previous editions of the Data Week. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Day 1: Intro', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Welcome to the space/event', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - }, - GrafoscopioNode { - #header : 'Participants presentation', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - }, - GrafoscopioNode { - #header : 'Introduction to Etherpad as a collaborative note taking tool', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - }, - GrafoscopioNode { - #header : 'Presenting the data week & Grafoscopio', - #key : '', - #body : '- A critical approach to "big data" and data literacy.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - }, - GrafoscopioNode { - #header : 'Alternative and parallel histories of computing: unix fathers, dynabook children and their legacy', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - }, - GrafoscopioNode { - #header : 'Installing Grafoscopio', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @102, - #level : 3 - } - ], - #parent : @99, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 2: Basic tutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Playgrounds', - #key : '', - #body : 'ATENCIÓN: Una versión anterior que explica los playgrounds, publicada en we la puedes -leer desde: - -http://mutabit.com/repos.fossil/grafoscopio/wiki?name=playground - -Los *playgrounds* son espacios interactivos para la escritura de código. -Sirven para prototipar y lanzar scripts, que o bien son desechados luego, -o se incorporan al sistema porque su código termina en unos objetos, o -como nodos en cuadernos interactivos de Grafoscopio (como el tutorial -de Pharo que quizás has usado ya).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Abrirlos', - #key : '', - #body : 'Para abrir los playgrounds existen 3 métodos: - - - Haciendo click en cualquier espacio libre (no ocupado por una ventana o una barra) y seleccionando - la opción Playground de dicho menú (llamado el menú del mundo). - - Presionando la combinación de teclas Ctrl + W + O (o Command + W + O en Mac). - - Desde el *docking bar* de Grafoscopio siguiendo la ruta de menú: ̀Launch > Playground ̀. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @126, - #level : 4 - }, - GrafoscopioNode { - #header : 'Compartirlos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @126, - #level : 4 - } - ], - #parent : @123, - #level : 3 - }, - GrafoscopioNode { - #header : 'Open notebooks form url', - #key : '', - #body : ' - is.gd as a recommeded "ethical" shorter. - - Notebook opening.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @123, - #level : 3 - }, - GrafoscopioNode { - #header : 'Updating Grafoscopio', - #key : '', - #body : 'Gofer new -\t\tsmalltalkhubUser: \'Offray\' project: \'Grafoscopio\'; - \t\tpackage: \'Grafoscopio\'; - \tload. -GrafoscopioGUI updateUI.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @123, - #level : 3 - }, - GrafoscopioNode { - #header : 'Realizando el tutorial.', - #key : '', - #body : 'Usando las instrucciones anteriores, abrimos el documento en: - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @123, - #level : 3 - }, - GrafoscopioNode { - #header : 'Preguntas / Comentarios', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @123, - #level : 3 - }, - GrafoscopioNode { - #header : 'Pimping Grafoscopio', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peter\'s file dialog', - #key : '', - #body : 'See https://github.com/peteruhnak/file-dialog for details.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Installation', - #key : '', - #body : 'Metacello new - baseline: \'FileDialog\'; - repository: \'github://peteruhnak/file-dialog/repository\'; - load.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @149, - #level : 5 - }, - GrafoscopioNode { - #header : 'Making it default system wide', - #key : '', - #body : 'FDMorphicUIManager new beDefault', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @149, - #level : 5 - } - ], - #parent : @146, - #level : 4 - } - ], - #parent : @123, - #level : 3 - } - ], - #parent : @99, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 3: Intermedium tutorial, first package & Twitter export', - #key : '', - #body : 'From the intermedium exmaple, we learn how to read JSON. -Now for our first package we use that, to create a block with arguments (i.e: movie name, director, etc) -and then we go from there to the creation of the first package (Cinemania) and -messages with arguments. - -We learn also how to use monticello to synchronize work among the participants. - -From here we start a bridge to the twitter data selfie open project.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @99, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 4', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @99, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 5', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Breve recuento', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @162, - #level : 3 - }, - GrafoscopioNode { - #header : 'Repositorios de código (continuación)', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @162, - #level : 3 - }, - GrafoscopioNode { - #header : 'Leer el hash de un archivo en disco duro', - #key : '', - #body : '50c736b95c5748145fdafde98ee1b5190ed1e9f8', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @162, - #level : 3 - }, - GrafoscopioNode { - #header : 'Navegar el árbol hasta llegar al hash de un archivo', - #key : '', - #body : '50c736b95c5748145fdafde98ee1b5190ed1e9f8', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @162, - #level : 3 - }, - GrafoscopioNode { - #header : 'Obtener el número hash de un archivo particular en un repositorio', - #key : '', - #body : '| dataWeekRepo urlTemp miniBrowser | -dataWeekRepo := FossilRepo new url: \'http://mutabit.com/repos.fossil/dataweek\'. -dataWeekRepo lastHashNumberFor: \'dataweek.ston\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @162, - #level : 3 - } - ], - #parent : @99, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 6: Twitter Data Selfies part 3 & closure', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles). - -We make a wrap up of the event and take suggestions for future events and the growth of the -community.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'El último playground del #DataWeek4', - #key : '', - #body : '| tweetsFile overview ourPalette | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2013_01.js\' ) asFileReference. -ourPalette := { Color orange . Color black . Color red }. -overview := TwitterProfileOverview new. -overview -\tgetAvatarForProfile: \'offrayLC\'; -\tsplitMessagesByTypeFrom: tweetsFile. -overview\t -\ttaggedWheelTweetsSized: 12 -\tretweetsSized: 10 -\tmentionsSized: 14 -\tcoloredWith: ourPalette. -', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Deconstruyendo el script', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Obtener el avatar', - #key : '', - #body : '| tweetsFile overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2013_01.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tgetAvatarForProfile: \'didtux\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @182, - #level : 5 - }, - GrafoscopioNode { - #header : 'Partir los mensajes', - #key : '', - #body : '| tweetsFile overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @182, - #level : 5 - }, - GrafoscopioNode { - #header : 'Dibujando el data selfie', - #key : '', - #body : '| tweetsFile tweetsWords overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -overview -\tfrequentTweetedWordsShown: 10 - \tretweetedProfilesShown: 80 -\tmentionedProfilesShown: 70', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @182, - #level : 5 - }, - GrafoscopioNode { - #header : 'Sólo la circunferencia interna', - #key : '', - #body : '| tweetsFile overview ourPalette | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -ourPalette := { Color orange . Color black . Color red }. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -overview avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @182, - #level : 5 - } - ], - #parent : @180, - #level : 4 - }, - GrafoscopioNode { - #header : 'Deconstruyendo el código del Data Selfie', - #key : '', - #body : 'Acá miraremos cómo deconstruir el código que dibuja todo el data selfie a partir del mensaje principal que construye', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Consultas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Palabras más tuiteadas', - #key : '', - #body : '"This script organizes the twitted words by frecuency" -| tweetsFile overview aWorldAmount | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -aWorldAmount := 19. -overview messages wordsByFrequencyInTweets. -overview messages wordsByFrequencyInTweetsUpTo: 10', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @196, - #level : 6 - } - ], - #parent : @193, - #level : 5 - } - ], - #parent : @180, - #level : 4 - } - ], - #parent : @177, - #level : 3 - } - ], - #parent : @99, - #level : 2 - } - ], - #parent : @93, - #level : 1 - }, - @76 - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @93, - @96, - @99, - @102, - @105, - @108, - @111, - @114, - @117, - @120, - @123, - @126, - @129, - @132, - @135, - @138, - @140, - @143, - @146, - @149, - @152, - @154, - @156, - @159, - @162, - @165, - @168, - @171, - @173, - @175, - @177, - @180, - @182, - @185, - @187, - @189, - @191, - @193, - @196, - @199, - @76, - @79, - @81, - @84, - @87, - @89, - @91 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @21, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @40, - @43, - @53 - ], - #links : @203 - }, - @43, - @46, - @50, - @53, - @57, - @61, - @66 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @24, - @40 -] DELETED Artefactos/SoftwarePublicoColombia/terms-and-conditions-es Index: Artefactos/SoftwarePublicoColombia/terms-and-conditions-es ================================================================== --- Artefactos/SoftwarePublicoColombia/terms-and-conditions-es +++ Artefactos/SoftwarePublicoColombia/terms-and-conditions-es cannot compute difference between binary files DELETED Ediciones/2/tutorial.ston Index: Ediciones/2/tutorial.ston ================================================================== --- Ediciones/2/tutorial.ston +++ Ediciones/2/tutorial.ston cannot compute difference between binary files DELETED Ediciones/semana-del-codigo.markdown Index: Ediciones/semana-del-codigo.markdown ================================================================== --- Ediciones/semana-del-codigo.markdown +++ Ediciones/semana-del-codigo.markdown @@ -1,80 +0,0 @@ ---- -header-includes: - - \documentclass{article} - - \usepackage{minted} - - \usemintedstyle{friendly} ---- -# Semana del código - -Con el hash tag #YoPuedoProgramar, Microsoft, en asocio con las bibliotecas públicas, -lanzó hoy 3 de octubre su campaña, para aproximar a las personas al mundo de la -programación. -Me parece que las bibliotecas públicas deberían ser un espacio más que apropiado -para ello, pero me preocupa que se use las infraestructuras públicas y temas de la -cultura del código, como las hackatones, para el beneficio y posicionamiento prioritario -de las entidades privadas. - -Así que [decidí empezar](enlace a hilo de conversación) -mi propia semana del código, en continuidad y conexión con -otras semanas que hemos venido realizando, desde comunidades y espacio de base, -con un enfoque de alfabetización crítica de código y datos (critical data & code literacy), -como el Data Week. -La idea es mostrar eso que, tanto desde Microsoft como desde las bibliotecas públicas, -desafortunadamente esta semana invisibiliza: que existen diversas apuestas, comunidades, -tecnologías, enfoques y edades para aproximarse al código y que algunas de ellas, intentan -un enfoque crítico, que procura no empezar por el fatigado y poco significativo: "Hola mundo!". - -Precisamente en aras de mostrar aquella continuidad con lo que ya se ha estado haciendo, -he etiquetado este evento como el #DataWeek6, para conectarlo con las ediciones previas que -hemos realizado: 5 desde [HackBo](http://hackbo.co) y desde el [Colaboratorio de Medellin](). -Los tuits tendrán por tanto las etiquetas #DataWeek6 y #YoPuedoProgramar, para poder rastrearlas -en el contexto de las que visiblizan Microsoft y las Bibliotecas Públicas. -Me parece particularmente interesante ver los mensajes a los que dichas bibliotecas harán eco, retrinándolos, -contestándoles, citándolos y comparar las fuentes (ejp: ¿son ellas ciudadanas o son privadas?) y creo que -nuestro proyecto de los [data selfies]() está particularmente adaptado para ello. - -La dinámica es sencilla: Iré a una biblioteca cercana a donde me encuentre, un par de horas al día y llevaré -un diario de lo que vaya ocurriendo. -Como algunas bibliotecas no tienen muy buena conectividad (o ninguna), y como algunas no están enteredas -de la semana del código o de la iniciativa #YoPuedoProgramar, algunos días el trabajo será fuera de línea, -y sincronizaré lo que haya hecho en mi portátil, con repositorios de código y lo compartiré al final de ese día -o a comienzos del siguiente con los hashtags ya indicados y algunas capturas de pantalla de los repositorios -de código y de las interfaces. -Los sistemas actuales de gestión de código (como [Fossil]() y [Monticello]), soportan trabajo fuera de línea 100% -y se adecuan a la realidad nacional de lugares como las bibliotecas. - -La intensión es trabajar en temas pedagógicos, en la medida en que el contexto lo permita. -Por ejemplo, si hay buenas condiciones de sonido y buena conectividad para crear y subir un videocast, -haré experimentos mostrando las nuevas caracterísitcas de Grafoscopio. -También trabajaré en temas que requieren mayor experticia y que mejoran la infraestructura -de aquello que está de cara al aprendiz y le permiten el desarrollo de esta alfabetización crítica en datos -y código, particularmente cuando esté sólo o no haya tan buena conectividad. - -## Dia 1 - -Inicio la semana del código en la nueva biblioteca de Cajicá, -el municipio donde viví buena parte de mi infancia y adolecencia -y fui además un ratón de biblioteca. -El nuevo edificio es mucho más iluminado y espacioso, pero su tamaño contrasta -con lo vacio que se encuentra. -Acá no hay semana del código, no hay nadie que parezca estar dedicado a ella, -y me dijeron al entrar, que la señal de Internet se demora cerca de un mes, mientras -se surte la licitación. - -- "Es decir que inauguron la biblioteca sin Internet?", pregunto yo. -- "Si señor", contesta la bibliotecaria. -- "Disculpa, ¿tu sabes algo de la iniciativa 'Semana del código' o 'Yo puedo programar'? -- "No ¿En qué consisten?" - y yo le explico brevemente. - -Pensaba leer y anotar algunas cosas en línea, usando [hypothesis](http://hypothes.is), -sobre la Biblioteca como infraestructura y los peligros de su enagenamiento por la lógica del Silicon Valley, -[recomendadas por Carlos] en nuestra lista y muy apropiadas con motivo de este evento, bajo -la idea de alfabetización crítica en datos y código (critical code & data literacy). -Como no hay conectividad empecé escribiendo en esta libreta de [Grafoscopio]() y la agregué -al repositorio de fossil. - -Lo siguiente que haré será trabajar con datos que he descargado y que están fuera de línea para el proyecto -de los [data selfies](). -Quiero arreglar un par de bugs. - DELETED Ediciones/semana-del-codigo.ston Index: Ediciones/semana-del-codigo.ston ================================================================== --- Ediciones/semana-del-codigo.ston +++ Ediciones/semana-del-codigo.ston @@ -1,96 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Semana del código', - #key : '', - #body : 'Con el hash tag #YoPuedoProgramar, Microsoft, en asocio con las bibliotecas públicas, -lanzó hoy 3 de octubre su campaña, para aproximar a las personas al mundo de la -programación. -Me parece que las bibliotecas públicas deberían ser un espacio más que apropiado -para ello, pero me preocupa que se use las infraestructuras públicas y temas de la -cultura del código, como las hackatones, para el beneficio y posicionamiento prioritario -de las entidades privadas. - -Así que [decidí empezar](enlace a hilo de conversación) -mi propia semana del código, en continuidad y conexión con -otras semanas que hemos venido realizando, desde comunidades y espacio de base, -con un enfoque de alfabetización crítica de código y datos (critical data & code literacy), -como el Data Week. -La idea es mostrar eso que, tanto desde Microsoft como desde las bibliotecas públicas, -desafortunadamente esta semana invisibiliza: que existen diversas apuestas, comunidades, -tecnologías, enfoques y edades para aproximarse al código y que algunas de ellas, intentan -un enfoque crítico, que procura no empezar por el fatigado y poco significativo: \"Hola mundo!\". - -Precisamente en aras de mostrar aquella continuidad con lo que ya se ha estado haciendo, -he etiquetado este evento como el #DataWeek6, para conectarlo con las ediciones previas que -hemos realizado: 5 desde [HackBo](http://hackbo.co) y desde el [Colaboratorio de Medellin](). -Los tuits tendrán por tanto las etiquetas #DataWeek6 y #YoPuedoProgramar, para poder rastrearlas -en el contexto de las que visiblizan Microsoft y las Bibliotecas Públicas. -Me parece particularmente interesante ver los mensajes a los que dichas bibliotecas harán eco, retrinándolos, -contestándoles, citándolos y comparar las fuentes (ejp: ¿son ellas ciudadanas o son privadas?) y creo que -nuestro proyecto de los [data selfies]() está particularmente adaptado para ello. - -La dinámica es sencilla: Iré a una biblioteca cercana a donde me encuentre, un par de horas al día y llevaré -un diario de lo que vaya ocurriendo. -Como algunas bibliotecas no tienen muy buena conectividad (o ninguna), y como algunas no están enteredas -de la semana del código o de la iniciativa #YoPuedoProgramar, algunos días el trabajo será fuera de línea, -y sincronizaré lo que haya hecho en mi portátil, con repositorios de código y lo compartiré al final de ese día -o a comienzos del siguiente con los hashtags ya indicados y algunas capturas de pantalla de los repositorios -de código y de las interfaces. -Los sistemas actuales de gestión de código (como [Fossil]() y [Monticello]), soportan trabajo fuera de línea 100% -y se adecuan a la realidad nacional de lugares como las bibliotecas. - -La intensión es trabajar en temas pedagógicos, en la medida en que el contexto lo permita. -Por ejemplo, si hay buenas condiciones de sonido y buena conectividad para crear y subir un videocast, -haré experimentos mostrando las nuevas caracterísitcas de Grafoscopio. -También trabajaré en temas que requieren mayor experticia y que mejoran la infraestructura -de aquello que está de cara al aprendiz y le permiten el desarrollo de esta alfabetización crítica en datos -y código, particularmente cuando esté sólo o no haya tan buena conectividad.', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Dia 1', - #key : '', - #body : 'Inicio la semana del código en la nueva biblioteca de Cajicá, -el municipio donde viví buena parte de mi infancia y adolecencia -y fui además un ratón de biblioteca. -El nuevo edificio es mucho más iluminado y espacioso, pero su tamaño contrasta -con lo vacio que se encuentra. -Acá no hay semana del código, no hay nadie que parezca estar dedicado a ella, -y me dijeron al entrar, que la señal de Internet se demora cerca de un mes, mientras -se surte la licitación. - -- \"Es decir que inauguron la biblioteca sin Internet?\", pregunto yo. -- \"Si señor\", contesta la bibliotecaria. -- \"Disculpa, ¿tu sabes algo de la iniciativa \'Semana del código\' o \'Yo puedo programar\'? -- \"No ¿En qué consisten?\" - y yo le explico brevemente. - -Pensaba leer y anotar algunas cosas en línea, usando [hypothesis](http://hypothes.is), -sobre la Biblioteca como infraestructura y los peligros de su enagenamiento por la lógica del Silicon Valley, -[recomendadas por Carlos] en nuestra lista y muy apropiadas con motivo de este evento, bajo -la idea de alfabetización crítica en datos y código (critical code & data literacy). -Como no hay conectividad empecé escribiendo en esta libreta de [Grafoscopio]() y la agregué -al repositorio de fossil. - -Lo siguiente que haré será trabajar con datos que he descargado y que están fuera de línea para el proyecto -de los [data selfies](). -Quiero arreglar un par de bugs.', - #children : OrderedCollection [ ], - #parent : @2, - #level : 2 - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @6, - @2, - @4 - ] - }, - #level : 1 - } -] DELETED Participantes/Kano/techniques-for-data-actvism.ston Index: Participantes/Kano/techniques-for-data-actvism.ston ================================================================== --- Participantes/Kano/techniques-for-data-actvism.ston +++ Participantes/Kano/techniques-for-data-actvism.ston @@ -1,9821 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Introduction', - #body : 'This booklet presents a set of techniques to work with data, that are useful of Data Activism. -We consider data mostly as a non-neutral human construct and we think that a more critical -code+data literacy is needed to deal and build a common world that is, increasingly, mediated -by data and code. -Who is visible in this coming world, which voices are heard, and if we can create a plural participation -in such world will depend on such critical literacy. - -The work you\'re reading is opinionated, consequently. -It presents a set of tools, devices and techniques, that has been developed in our local community, at -HackBo, but try to become part of a wider conversation and nurtures from global communities. -This is also a work in progress, and because we take a "local first" approach, you will see that -this document is in "Spanglish", with the idea of having a full English translation in the future, -but starting from localized content originally Spanish or translated/wrote for/from Spanish speaking -communities. -If you\'re a native English speaker, any help is welcomed. -See the Community Guidelines in the Grafoscopio Manual, to see how to offer and ask for help. - -This document is made with Grafoscopio. Good familiarity with it is adviced. You can see more about -Grafoscopio at: - -This book is heavily based on Agile Visualization, and is covered by the same license. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : '%metadata', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism\'. -\'showOnHelp\' -> true. -} asOrderedDictionary. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Drawing with data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A first data draw', - #body : 'Drawing with data is esentialy about taking data, applying a visual form to it -and presenting it with a particular layout given account of possible patterns. -Lets start with this simple example', - #tags : OrderedCollection [ - '' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Drawing the first 20 numbers', - #body : ' -"Lets define our data model" -data := 1 to: 20. -"Now define the form that we\'ll apply to that data" -shape := (RTBox new size: 30) + RTLabel. -"Now create a set of visual elements using that basic fomr on our data" -elements := shape elementsOn: data. -"Lets define the view, where the data will be displayed" -view := RTView new. -"And lets add all visual elements to our view" -view addAll: elements. -"Now define the layout to our visual elements" -RTGridLayout on: elements. -"Now lets display our view" -view ', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Other data visualization examples', - #body : 'The following examples are taken from the Agile Visualizatio book. -They follow the same logic of the first data draw example, and are a short glimpse of what you -can do with this platform. -We\'re going to learn how to use it in detail here, so don\'t worry if details escape to you in this quick overview. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A tree of numbers', - #body : 'b := RTMondrian new. -b shape label. -b nodes: (1 to: 100). -b edges connectFrom: [ :i | i // 2 ]. -b layout cluster. -b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizing the user desktop', - #body : 'path := FileLocator desktop asFileReference. -allFilesUnderPath := path allChildren. -b := RTMondrian new. -b shape circle -\tcolor: Color gray trans; -\tif: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -b nodes: allFilesUnderPath. -b edges connectFrom: #parent. -b normalizer -\tnormalizeSize: #size min: 10 max: 150 using: #sqrt. -b layout tre. -b -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Geographical CSV data', - #body : '\ttab := RTTabTable new input: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(2 3 4 5). -\ttab convertColumnsAsFloat: #(2 3 4 5). - -\tb := RTMapLocationBuilder new. -\tb shape circle -\t\tsize: [ :m | 2 raisedTo: (m - 1) ]; -\t\tcolor: (Color red alpha: 0.3). -\ttab values do: [ :row | b addPoint: row second @ row third value: row fifth ]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Seism activity over time', - #body : '\ttab := RTTabTable new -\t\t\tinput: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents -\t\t\tusingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumn: 1 to: [ :s | (DateAndTime fromString: s) julianDayNumber ]. -\ttab convertColumnsAsFloat: #(5). - -\tv := RTView new. -\tes := RTEllipse elementsOn: tab values. -\tv addAll: es. -\tes @ RTPopup. - -\tRTMetricNormalizer new -\t\telements: es; -\t\tnormalizeColor: #fifth using: { Color orange . Color red }; -\t\talphaColor: 0.3; -\t\tnormalizeX: #first min: 0 max: 600; -\t\tnormalizeSize: #fifth min: 0 max: 80 using: [ :mag | 2 raisedTo: (mag - 1) ]. -\t\t -\tes @ (RTLabeled new text: [ :row | row fifth > 6 ifTrue: [ row fifth ] ifFalse: [ \'\' ] ]). -\tv @ RTDraggableView. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Charting', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ploting: Ebola fatalities', - #body : '"Preparing the data" -\ttab := RTTabTable new input: \'http://agilevisualization.com/Ebola2.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(10 11). -\ttab convertColumnsAsInteger: #(10 11). -\ttab convertColumnsAsDateAndTime: #(3 4). -\tdata := tab values reversed. - -\t"Charting the data" -\tb := RTGrapher new. - -\tds := RTData new. -\tds interaction fixedPopupText: [ :row | row value at: 12 ]. -\tds dotShape ellipse -\t\tcolor: (Color blue alpha: 0.3); -\t\tsize: [ :row | (row at: 11) / 5 ]. -\tds points: data. -\tds connectColor: Color blue. -\tds y: [ :r | r at: 10 ]. -\tds highlightIf: [ :row | (row at: 10) > 100 ] using: [ :row | row third year ]. -\tb add: ds. - -\tb axisX noLabel; numberOfTicks: tab values size. -\tb axisY noDecimal. -\tb -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Double charting: distribution of US population over 18', - #body : 'tab := RTTabTable new input: \'http://agilevisualization.com/AgileVisualization/census.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumnsAsInteger: #(\'POPESTIMATE2013\' \'POPEST18PLUS2013\'). - -\tb := RTDoubleBarBuilder new. -\tb pointName: [ :row | row at: (tab indexOfName: \'NAME\') ]. -\t"Remove the first line, the sum" -\tb points: tab values allButFirst. -\tb bottomValue: [ :row | ((row at: (tab indexOfName: \'POPESTIMATE2013\')) / 1000) asInteger ] -\t\ttitled: \'Pop estimate (x 1000)\'. -\tb topValue: [ :row | ((row at: (tab indexOfName: \'POPEST18PLUS2013\')) / 1000) asInteger] -\t\ttitled: \'Pop +18 estimate (x 1000)\'. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Multiple graphs', - #body : 'b := RTGrapher new. -\tnumberOfDataSets := 5. - -\tcolorNormalizer := RTMultiLinearColorForIdentity new -\t\t\t\t\t\tobjects: (1 to: numberOfDataSets). -\t1 to: numberOfDataSets do: [ :i | -\t\tds := RTData new. -\t\tds noDot. -\t\tds points: ((1 to: 500) collect: [ :ii | 50 atRandom - 25 ]) cumsum. -\t\tds connectColor: (colorNormalizer rtValue: i). -\t\tb add: ds. -\t]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Timeline', - #body : 'data := #( -\t\t#(WP1 0 4) #(WP2 4 8) -\t\t#(WP3 8 12) #(WP4 3 4) -\t\t#(WP4 7 9) #(WP4 10 12) -\t ). -\tb := RTTimeline new. -\ts := RTTimelineSet new. -\ts objects: data. -\ts lineIdentifier: #first. -\ts start: #second. -\ts end: #third. -\tb add: s. -\tb axisX -\t\tnoDecimal; -\t\ttitle: \'Month\'; -\t\tnumberOfLabels: 12. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Integration with OpenStreetMap', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Example 1', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"City geographical positions obtained from Wikipedia" -\tparis := 48.8567 @ 2.3508. -\tnewyork := 40.7127 @ -74.0059. -\tlondon := 51.507222@ -0.1275. -\t -\t"Some arbitrary data" -\tdata := -\t\t{ { paris . #(10 5 10 3 10 6 8) } . -\t\t\t{ london . #(5 3 3 -5 ) } . -\t\t\t{ newyork . #(5 -2 10 15 -10) } }. -\t -\tdata do: [ :tupple | -\t\t\t| grapher dataSet | -\t\t\tgrapher := RTGrapher new. -\t\t\tgrapher extent: 150 @ 100. -\t\t\tdataSet := RTData new. -\t\t\tdataSet points: tupple second. -\t\t\tdataSet barShape width: 10; color: Color red. -\t\t\tgrapher add: dataSet. -\t\t\tgrapher build. - -\t\t\tbarElements := grapher view elements. -\t\t\tv addAll: barElements. -\t\t\tbarElements translateTo: (map latLonToRoassal: tupple first) ]. -\t -\tv canvas camera translateTo: (map latLonToRoassal: paris). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 0.3. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Example 2', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"Place to set the data and center the camera" -\tlondon := 51.507222@ -0.1275. - -\t"Some arbitrary data" -\tdata := ((1 to: 500) collect: [ :i | 50 atRandom - 25 ]) cumsum. - -\t"We build the graph" -\tb := RTGrapher new. -\tb extent: 100@30. -\td := RTData new. -\td noDot. -\td connectColor: Color red. -\td points: data. - -\tb add: d. -\tb axisY -\t\tlabelFontHeight: 6; -\t\tcolor: Color red; -\t title: \'Sale\'. - -\tb axisX color: Color red; noTick; title: \'country\'. -\tb build. -\telementsAndEdges := b view elements, b view edges. - -\t"We create a white background" -\twhiteBackground := (RTRoundedBox new color: Color white trans; borderRadius: 10) element. -\tv add: whiteBackground. -\tv addAll: elementsAndEdges. -\tRTNest new on: whiteBackground nest: elementsAndEdges. -\twhiteBackground translateTo: (map latLonToRoassal: london). - -\tv canvas camera translateTo: (map latLonToRoassal: london). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 1.5. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @15, - @18, - @23, - @26, - @30, - @34, - @38, - @42, - @45, - @49, - @53, - @58, - @62, - @65, - @69, - GrafoscopioNode { - #header : 'Basic interation', - #body : 'Before going deeper into data we need some basic operation with the environment, -about three basic operations: - - - Doing: ie executing instructions also called messages. - - Printing: Seeing the result of executing messages. - - Inpecting: Going deeper into the objects thare hold and represent data. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Doing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\') -" - -ProfStef openPharoZenWorkspace - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @79 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Printing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @85 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Inspecting', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @91 - ], - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @79, - @85, - @91, - GrafoscopioNode { - #header : 'Desconstructing a practical example', - #body : 'We\'re going to start with our first practical example. -The idea is to get data from an online source, clean it a little bit, and make a simple graph. -From there, we\'re going to deconstruct the example and the properties of mensages, -and some objects, wich simple but powerful conceptual model behind Pharo.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peace voting in Colombia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Totals', - #body : '| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstructing the example :-)', - #body : '"Here we\'re going step by step in the previous example showing its parts and where you -can get more information about the operations and concepts that we used." -"Lets define the variables that we\'re going to use" -| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/C519QKLYZY56' - ] - }, - GrafoscopioNode { - #header : 'Totals by deparments (states)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Two deparments & dummy data', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: #(25 29) title: \'Dummy Data 1\'. -b add: #(30 33) title: \'Dummy Data 2\'. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @111, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exercises', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Add two deparments', - #body : '"Modify the \'Two deparments & dummy data\' previous example to add two more deparments to the graphic"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Respuesta Carlos', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -yes3 := ((tab values at:5) at: 9) asNumber. -no3 := ((tab values at:5) at: 11) asNumber. -location3 := (tab values at:5) at: 1. -yes4 :=((tab values at:17) at: 9) asNumber. -no4 :=((tab values at:17) at: 11) asNumber. -location4 := (tab values at:17) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: { yes3 . no3 } title: location3. -b add: { yes4 . no4 } title: location4. - -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @122, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/A1S1N7G2DVVU', - 'http://ws.stfx.eu/3HOBOGAK5GUO', - 'http://ws.stfx.eu/I0OWO9RDVKTB', - 'http://ws.stfx.eu/IAUS1V2KO8M6' - ] - } - ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using blocks to modularize code', - #body : '"Can you use blocks and basic types to make the code in our pie char example more modular? -The idea is to split the functionality of such example into chunks, and put them inside blocks, -that receive arguments. Which should be such blocks? Which are the block arguments? -Rewrite the example here using the idea of blocks and arguments. -"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Add voting results at all deparments', - #body : '"Use iterators (see the \'Representing data: Basic Types\' & \'Processing data > Cycles & Iteractors\') -to modify the Two deparments & dummy data example, including now all the data."', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Composing two visualizations', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Raw data link', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'https://www.datasketch.co/es/p/los-datos-ocultos-de-la-registraduria' - ] - } - ], - #parent : @97, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @100, - @103, - @107, - @111, - @114, - @119, - @122, - @125, - @130, - @134, - @139, - @143, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Saving your code to the web', - #body : 'Use "Export Playground" functionality for code nodes and share your previos excercises via the Etherpad with your -companions. - -Use Fossil to: - - - Clone the Data Week repository at: - - Open the repository - - Create a folder for you under `Participants/`, where `` is any kind of unique indenfier yourself. - It could be `FirstNameLastName`, your social media handler, or others. - - Save a modified version of this notebook to the previously created folder. - - Commit to the Fossil repository. - - Browse the repository history, locate your commit and share your notebook with others. g', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @149, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @152, - GrafoscopioNode { - #header : 'Representing data: Basic Types', - #key : '', - #body : 'Basic types are ways or represeting information inside this system. See nodes inside for more details', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Numbers', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @159, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : Text { - #string : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #runs : RunArray { - #runs : [ - 586 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : @80, - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @82, - #parent : @169, - #level : 2, - #links : @84 - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : @86, - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @88, - #parent : @169, - #level : 2, - #links : @90 - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @93, - #parent : @169, - #level : 2, - #links : @95 - }, - @163, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -olors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @224, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] ifFound: - ifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : Text { - #string : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #runs : RunArray { - #runs : [ - 1142 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : Text { - #string : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #runs : RunArray { - #runs : [ - 1406 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : Text { - #string : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #runs : RunArray { - #runs : [ - 719 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @169, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @355 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @358 - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @335, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @389, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @419, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - } - ], - #parent : @431, - #level : 3 - } - ], - #parent : @428, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - } - ], - #parent : @428, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @417, - @420, - @451, - @454 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @460, - #parent : @428, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @473, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @562, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @529, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @259, - @262, - @271, - @280, - @169, - @178, - @182, - @183, - @184, - @163, - @160, - GrafoscopioNode { - #header : 'Characters', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -"You can find which is the ASCII number for a character" - -$@ charCode. - -"There are some character that are not printable" - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"If you see gliberish is because some display issue" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Strings', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Symbols', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Dynamics Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @185, - @188, - @192, - @196, - @199, - @202, - @205, - @208, - @211, - @215, - @218, - @221, - @224, - @226, - @230, - @233, - @236, - @239, - @242, - @245, - @248, - @251, - @255, - @289, - @292, - @295, - @298, - @301, - @304, - @307, - @310, - @313, - @317, - @320, - @323, - @326, - @329, - @332, - @335, - @338, - @341, - @343, - @346, - @349, - @352, - @355, - @358, - @362, - @365, - @368, - @371, - @374, - @378, - @381, - @389, - @392, - @395, - @398, - @401, - @404, - @409, - @413, - @417, - @420, - @451, - @454, - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523, - @529, - @532, - @535, - @538, - @541, - @544, - @547, - @551, - @554, - @557, - @562, - @565, - @568, - @571, - @574, - @577, - @580, - @583, - @586 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @595, - @599, - @604, - @609, - @614 - ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @157, - @160, - @595, - @599, - @604, - @609, - @614 - ], - #links : @620 - }, - @160, - @595, - @599, - @604, - @609, - @614, - GrafoscopioNode { - #header : 'Processing data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Messages', - #key : '', - #body : 'Los mensajes son la forma en que los objetos se comunican entre sí y en que -nosotros, los humanos, nos comunicamos con el sistema. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Unary', - #headers : OrderedCollection [ ], - #key : '', - #body : '" -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : @627, - #children : @628, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - @633, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @692, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - @638, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @813 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @816 - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @836, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @791, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @847, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @877, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - } - ], - #parent : @889, - #level : 3 - } - ], - #parent : @886, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - } - ], - #parent : @886, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @875, - @878, - @909, - @912 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @918, - #parent : @886, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @931, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1020, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @987, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @730, - @733, - @737, - @741, - @638, - @642, - @646, - @650, - @654, - @657, - @660, - @663, - @666, - @670, - @674, - @678, - @633, - @629, - GrafoscopioNode { - #header : 'Binary', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Keyword', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Priority', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 negated + (3 raisedTo: 2). - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Changing messages priority', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mathematical messages priority ', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cascade messages', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\topen; -\tshow: \'hello\'; -\tcr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @683, - @686, - @689, - @692, - @695, - @700, - @704, - @707, - @710, - @713, - @716, - @719, - @722, - @726, - @745, - @748, - @751, - @754, - @757, - @760, - @763, - @766, - @769, - @773, - @776, - @779, - @782, - @785, - @788, - @791, - @794, - @797, - @799, - @803, - @807, - @810, - @813, - @816, - @820, - @823, - @826, - @829, - @832, - @836, - @839, - @847, - @850, - @853, - @856, - @859, - @862, - @867, - @871, - @875, - @878, - @909, - @912, - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981, - @987, - @990, - @993, - @996, - @999, - @1002, - @1005, - @1009, - @1012, - @1015, - @1020, - @1023, - @1026, - @1029, - @1032, - @1035, - @1038, - @1041, - @1044 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074 - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1078 - ], - #links : @1083 - }, - GrafoscopioNode { - #header : 'Blocks', - #key : '', - #body : '"For this part a Basic understanding of Basic Types is recommended. -If you have not done that part yet, please go to that subtree and run the code there" -"Ahora hablemos de los bloques.Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[ProfStef openPharoZenWorkspace] value. - - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x/2 asFloat] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1086 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Blocks assignment', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1091 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Conditionals', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1096 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cycles & Iterators', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 1 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : @1102, - #children : @1103, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : @1087, - #children : @1088, - #parent : @1108, - #level : 2, - #links : @1090 - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : @1092, - #children : @1093, - #parent : @1108, - #level : 2, - #links : @1095 - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : @1097, - #children : @1098, - #parent : @1108, - #level : 2, - #links : @1100 - }, - @1107, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : Text { - #string : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #runs : RunArray { - #runs : [ - 467 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Buttons example', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Chaning a live running system', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cleaning methods', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exploring objects', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Making your own tutorials', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - @1108, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @1310 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @1313 - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1333, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1288, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1344, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @1374, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - } - ], - #parent : @1386, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1372, - @1375, - @1406, - @1409 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1415, - #parent : @1383, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1428, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1517, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1484, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @1227, - @1230, - @1234, - @1238, - @1108, - @1112, - @1116, - @1120, - @1124, - @1127, - @1130, - @1133, - @1136, - @1140, - @1144, - @1148, - @1153, - @1156, - @1160, - @1164, - @1167, - @1170, - @1173, - @1176, - @1179, - @1183, - @1184, - @1185, - @1107, - @1104, - @1186, - @1190, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - @1223, - @1242, - @1245, - @1248, - @1251, - @1254, - @1257, - @1260, - @1263, - @1266, - @1270, - @1273, - @1276, - @1279, - @1282, - @1285, - @1288, - @1291, - @1294, - @1296, - @1300, - @1304, - @1307, - @1310, - @1313, - @1317, - @1320, - @1323, - @1326, - @1329, - @1333, - @1336, - @1344, - @1347, - @1350, - @1353, - @1356, - @1359, - @1364, - @1368, - @1372, - @1375, - @1406, - @1409, - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478, - @1484, - @1487, - @1490, - @1493, - @1496, - @1499, - @1502, - @1506, - @1509, - @1512, - @1517, - @1520, - @1523, - @1526, - @1529, - @1532, - @1535, - @1538, - @1541 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1101, - @1104 - ], - #links : @1551 - }, - GrafoscopioNode { - #header : 'Colections', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : @1187, - #children : @1188, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1554 - ], - #links : @1189 - }, - GrafoscopioNode { - #header : 'Optional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : @1196, - #children : @1197, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218 - ], - #links : @1222 - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1086, - @1091, - @1096, - @1101, - @1104, - @1554, - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - GrafoscopioNode { - #header : 'Modelling data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Data adquiring & manipulation', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Open Movie Data Base', - #body : 'This first exercise will be related with Open Movie Data Base.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'http://www.omdbapi.com/' - ] - }, - GrafoscopioNode { - #header : 'Líderes amenazados en Colombia', - #body : '| contents data totalHombres totalMujeres b labeledData lb | -"Let\'s get the data" -contents := \'https://tupale.co//milfs/api.php?id=410&tipo=simple\' asUrl retrieveContents. -data := NeoJSONReader fromString: contents. -totalHombres := (data select: [ :item | (item at: \'Sexo\') = \'Hombre\']) size. -totalMujeres := data size - totalHombres. -labeledData := { \'Hombres\' -> totalHombres . \'Mujeres\' -> totalMujeres }. -"Here we build the Pie Graphics" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"Legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Líderes amenazados en Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'https://tupale.co//milfs/api.php?id=410&tipo=simple', - 'http://ws.stfx.eu/GR43R3BV92KC' - ] - } - ], - #parent : @1559, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @1562, - @1565, - @1569, - GrafoscopioNode { - #header : 'What\'s next', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - } - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @12, - @76, - @97, - @149, - @157, - @623, - @1559, - @1575 -] DELETED Participantes/Lillygumy/techniques-for-datactivism.ston Index: Participantes/Lillygumy/techniques-for-datactivism.ston ================================================================== --- Participantes/Lillygumy/techniques-for-datactivism.ston +++ Participantes/Lillygumy/techniques-for-datactivism.ston @@ -1,10131 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : '%metadata Data Activism Techniques', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding & agile visualization for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism Techniques\'. -\'showOnHelp\' -> true. -\'docType\' -> \'tutorial\' -} asOrderedDictionary -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : 'Introduction', - #body : 'This booklet presents a set of techniques to work with data, that are useful of Data Activism. -We consider data mostly as a non-neutral human construct and we think that a more critical -code+data literacy is needed to deal and build a common world that is, increasingly, mediated -by data and code. -Who is visible in this coming world, which voices are heard, and if we can create a plural participation -in such world will depend on such critical literacy. - -The work you\'re reading is opinionated, consequently. -It presents a set of tools, devices and techniques, that has been developed in our local community, at -HackBo, but try to become part of a wider conversation and nurtures from global communities. -This is also a work in progress, and because we take a "local first" approach, you will see that -this document is in "Spanglish", with the idea of having a full English translation in the future, -but starting from localized content originally Spanish or translated/wrote for/from Spanish speaking -communities. -If you\'re a native English speaker, any help is welcomed. -See the Community Guidelines in the Grafoscopio Manual, to see how to offer and ask for help. - -This document is made with Grafoscopio. Good familiarity with it is adviced. You can see more about -Grafoscopio at: - -Several examples from booklet are based on Agile Visualization, and is covered by the same license. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Documenting', - #body : 'If you are seeing this document inside Grafoscopio, is probably that you are reading -some strange marks on it, and words surrounded by the, like `*this one*`. -Such marks correspond to what is called a [light markup language][light-markup], -which is a way to express format and structure of a document by marking it contents -with some special characters, called markup. - -From the several markup languages available, Grafoscopio uses [Pandoc\'s Markdown][pandoc-md], - -[light-markup]: https://en.wikipedia.org/wiki/Lightweight_markup_language -[pandoc-md]: ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Drawing with data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A first data draw', - #body : 'Drawing with data is esentialy about taking data, applying a visual form to it -and presenting it with a particular layout given account of possible patterns. -Lets start with this simple example', - #tags : OrderedCollection [ - '' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Drawing the first 20 numbers', - #body : ' -"Lets define our data model" -data := 1 to: 20. -"Now define the form that we\'ll apply to that data" -shape := (RTBox new size: 30) + RTLabel. -"Now create a set of visual elements using that basic fomr on our data" -elements := shape elementsOn: data. -"Lets define the view, where the data will be displayed" -view := RTView new. -"And lets add all visual elements to our view" -view addAll: elements. -"Now define the layout to our visual elements" -RTGridLayout on: elements. -"Now lets display our view" -view ', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @19, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @16, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Markdown Example', - #body : '**Ejemplo de lista** Ensayo de Markdown: - -Objeto | Número --------- | --- -Primero | 13 -Segundo | 56 -Tercero | 38', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @16, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Other data visualization examples', - #body : 'The following examples are taken from the Agile Visualizatio book. -They follow the same logic of the first data draw example, and are a short glimpse of what you -can do with this platform. -We\'re going to learn how to use it in detail here, so don\'t worry if details escape to you in this quick overview. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A tree of numbers', - #body : 'b := RTMondrian new. -b shape label. -b nodes: (1 to: 100). -b edges connectFrom: [ :i | i // 2 ]. -b layout cluster. -b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizing the user desktop', - #body : 'path := FileLocator desktop asFileReference. -allFilesUnderPath := path allChildren. -b := RTMondrian new. -b shape circle -\tcolor: Color gray trans; -\tif: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -b nodes: allFilesUnderPath. -b edges connectFrom: #parent. -b normalizer -\tnormalizeSize: #size min: 10 max: 150 using: #sqrt. -b layout tre. -b -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Geographical CSV data', - #body : '\ttab := RTTabTable new input: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(2 3 4 5). -\ttab convertColumnsAsFloat: #(2 3 4 5). - -\tb := RTMapLocationBuilder new. -\tb shape circle -\t\tsize: [ :m | 2 raisedTo: (m - 1) ]; -\t\tcolor: (Color red alpha: 0.3). -\ttab values do: [ :row | b addPoint: row second @ row third value: row fifth ]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Seism activity over time', - #body : '\ttab := RTTabTable new -\t\t\tinput: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents -\t\t\tusingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumn: 1 to: [ :s | (DateAndTime fromString: s) julianDayNumber ]. -\ttab convertColumnsAsFloat: #(5). - -\tv := RTView new. -\tes := RTEllipse elementsOn: tab values. -\tv addAll: es. -\tes @ RTPopup. - -\tRTMetricNormalizer new -\t\telements: es; -\t\tnormalizeColor: #fifth using: { Color orange . Color red }; -\t\talphaColor: 0.3; -\t\tnormalizeX: #first min: 0 max: 600; -\t\tnormalizeSize: #fifth min: 0 max: 80 using: [ :mag | 2 raisedTo: (mag - 1) ]. -\t\t -\tes @ (RTLabeled new text: [ :row | row fifth > 6 ifTrue: [ row fifth ] ifFalse: [ \'\' ] ]). -\tv @ RTDraggableView. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Charting', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ploting: Ebola fatalities', - #body : '"Preparing the data" -\ttab := RTTabTable new input: \'http://agilevisualization.com/Ebola2.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(10 11). -\ttab convertColumnsAsInteger: #(10 11). -\ttab convertColumnsAsDateAndTime: #(3 4). -\tdata := tab values reversed. - -\t"Charting the data" -\tb := RTGrapher new. - -\tds := RTData new. -\tds interaction fixedPopupText: [ :row | row value at: 12 ]. -\tds dotShape ellipse -\t\tcolor: (Color blue alpha: 0.3); -\t\tsize: [ :row | (row at: 11) / 5 ]. -\tds points: data. -\tds connectColor: Color blue. -\tds y: [ :r | r at: 10 ]. -\tds highlightIf: [ :row | (row at: 10) > 100 ] using: [ :row | row third year ]. -\tb add: ds. - -\tb axisX noLabel; numberOfTicks: tab values size. -\tb axisY noDecimal. -\tb -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Double charting: distribution of US population over 18', - #body : 'tab := RTTabTable new input: \'http://agilevisualization.com/AgileVisualization/census.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumnsAsInteger: #(\'POPESTIMATE2013\' \'POPEST18PLUS2013\'). - -\tb := RTDoubleBarBuilder new. -\tb pointName: [ :row | row at: (tab indexOfName: \'NAME\') ]. -\t"Remove the first line, the sum" -\tb points: tab values allButFirst. -\tb bottomValue: [ :row | ((row at: (tab indexOfName: \'POPESTIMATE2013\')) / 1000) asInteger ] -\t\ttitled: \'Pop estimate (x 1000)\'. -\tb topValue: [ :row | ((row at: (tab indexOfName: \'POPEST18PLUS2013\')) / 1000) asInteger] -\t\ttitled: \'Pop +18 estimate (x 1000)\'. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Multiple graphs', - #body : 'b := RTGrapher new. -\tnumberOfDataSets := 5. - -\tcolorNormalizer := RTMultiLinearColorForIdentity new -\t\t\t\t\t\tobjects: (1 to: numberOfDataSets). -\t1 to: numberOfDataSets do: [ :i | -\t\tds := RTData new. -\t\tds noDot. -\t\tds points: ((1 to: 500) collect: [ :ii | 50 atRandom - 25 ]) cumsum. -\t\tds connectColor: (colorNormalizer rtValue: i). -\t\tb add: ds. -\t]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @50, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Timeline', - #body : 'data := #( -\t\t#(WP1 0 4) #(WP2 4 8) -\t\t#(WP3 8 12) #(WP4 3 4) -\t\t#(WP4 7 9) #(WP4 10 12) -\t ). -\tb := RTTimeline new. -\ts := RTTimelineSet new. -\ts objects: data. -\ts lineIdentifier: #first. -\ts start: #second. -\ts end: #third. -\tb add: s. -\tb axisX -\t\tnoDecimal; -\t\ttitle: \'Month\'; -\t\tnumberOfLabels: 12. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Integration with OpenStreetMap', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Example 1', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"City geographical positions obtained from Wikipedia" -\tparis := 48.8567 @ 2.3508. -\tnewyork := 40.7127 @ -74.0059. -\tlondon := 51.507222@ -0.1275. -\t -\t"Some arbitrary data" -\tdata := -\t\t{ { paris . #(10 5 10 3 10 6 8) } . -\t\t\t{ london . #(5 3 3 -5 ) } . -\t\t\t{ newyork . #(5 -2 10 15 -10) } }. -\t -\tdata do: [ :tupple | -\t\t\t| grapher dataSet | -\t\t\tgrapher := RTGrapher new. -\t\t\tgrapher extent: 150 @ 100. -\t\t\tdataSet := RTData new. -\t\t\tdataSet points: tupple second. -\t\t\tdataSet barShape width: 10; color: Color red. -\t\t\tgrapher add: dataSet. -\t\t\tgrapher build. - -\t\t\tbarElements := grapher view elements. -\t\t\tv addAll: barElements. -\t\t\tbarElements translateTo: (map latLonToRoassal: tupple first) ]. -\t -\tv canvas camera translateTo: (map latLonToRoassal: paris). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 0.3. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @70, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Example 2', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"Place to set the data and center the camera" -\tlondon := 51.507222@ -0.1275. - -\t"Some arbitrary data" -\tdata := ((1 to: 500) collect: [ :i | 50 atRandom - 25 ]) cumsum. - -\t"We build the graph" -\tb := RTGrapher new. -\tb extent: 100@30. -\td := RTData new. -\td noDot. -\td connectColor: Color red. -\td points: data. - -\tb add: d. -\tb axisY -\t\tlabelFontHeight: 6; -\t\tcolor: Color red; -\t title: \'Sale\'. - -\tb axisX color: Color red; noTick; title: \'country\'. -\tb build. -\telementsAndEdges := b view elements, b view edges. - -\t"We create a white background" -\twhiteBackground := (RTRoundedBox new color: Color white trans; borderRadius: 10) element. -\tv add: whiteBackground. -\tv addAll: elementsAndEdges. -\tRTNest new on: whiteBackground nest: elementsAndEdges. -\twhiteBackground translateTo: (map latLonToRoassal: london). - -\tv canvas camera translateTo: (map latLonToRoassal: london). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 1.5. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @70, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @31, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @16, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @19, - @22, - @27, - @31, - @34, - @38, - @42, - @46, - @50, - @53, - @57, - @61, - @66, - @70, - @73, - @77, - GrafoscopioNode { - #header : 'Basic interation', - #body : 'Before going deeper into data we need some basic operation with the environment, -about three basic operations: - - - Doing: ie executing instructions also called messages. - - Printing: Seeing the result of executing messages. - - Inpecting: Going deeper into the objects thare hold and represent data. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Doing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\') -" - -ProfStef openPharoZenWorkspace - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @84, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @87 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Printing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @84, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @93 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Inspecting', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @84, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @99 - ], - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @87, - @93, - @99, - GrafoscopioNode { - #header : 'Desconstructing a practical example', - #body : 'We\'re going to start with our first practical example. -The idea is to get data from an online source, clean it a little bit, and make a simple graph. -From there, we\'re going to deconstruct the example and the properties of mensages, -and some objects, wich simple but powerful conceptual model behind Pharo.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peace voting in Colombia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Totals', - #body : '| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstructing the example :-)', - #body : '"Here we\'re going step by step in the previous example showing its parts and where you -can get more information about the operations and concepts that we used." -"Lets define the variables that we\'re going to use" -| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/C519QKLYZY56' - ] - }, - GrafoscopioNode { - #header : 'Totals by deparments (states)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Two deparments & dummy data', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: #(25 29) title: \'Dummy Data 1\'. -b add: #(30 33) title: \'Dummy Data 2\'. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exercises', - #body : 'The following nodes will present you with a set of excercises. -Each exercise is put as a node. -Create a playground node as child of the exercise node and use the playground to write the -code needed to solve it.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Add two deparments', - #body : 'Modify the \'Two deparments & dummy data\' previous example to add two more deparments to the graphic.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @127, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Intermezzo: Sharing notebooks', - #body : 'If the previous exercise was solved properly, you have now something interesting to share -with the world (well, also incomplete or wrong solutions are worthy to share also in a learning -context). -Go to the "Saving and sharing your code snippets and notebook via web > Fossil" node and develop -the proposed activity there to share the notebook with the world. -Don\'t worry, you will be able to come here and continue with this exercises.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @127, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using blocks to modularize code', - #body : 'Can you use blocks and basic types to make the code in our pie char example more modular? -The idea is to split the functionality of such example into chunks, and put them inside blocks, -that receive arguments. Which should be such blocks? Which are the block arguments? -Rewrite the example here using the idea of blocks and arguments. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo Bloques', - #body : ' -| tab rawData labeledData b lb | -"Geting the data" -[:direccion | rawData := direccion asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }] value: \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' . -"Here we build the pie" -[:objeto | b := RTPieBuilder new. -b interaction popup. -b objects: objeto . -b slice: #value. -b labeled. -b normalizer distinctColor. -b] value: labeledData . -"And add the legend" -[:leyenda | lb := RTLegendBuilder new. -lb view: b view. -lb addText: leyenda . -lb build] value: \'Resultados del plebiscito por la Paz Colombia 2016\' . -^ b -\t - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @138, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @127, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Add voting results for all deparments', - #body : 'Use iterators (see the \'Representing data: Basic Types\' & \'Processing data > Cycles & Iteractors\') -to modify the Two deparments & dummy data example, including now all the data.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @127, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Composing two visualizations', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Raw data link', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @108, - #level : 3, - #links : OrderedCollection [ - '', - 'https://www.datasketch.co/es/p/los-datos-ocultos-de-la-registraduria' - ] - } - ], - #parent : @105, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @108, - @111, - @115, - @119, - @122, - @127, - @130, - @134, - @138, - @141, - @146, - @151, - @155, - GrafoscopioNode { - #header : 'Representing data: Basic Types', - #key : '', - #body : 'Basic types are ways or represeting information inside this system. See nodes inside for more details', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Numbers', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @163, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : Text { - #string : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #runs : RunArray { - #runs : [ - 586 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : @88, - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @90, - #parent : @173, - #level : 2, - #links : @92 - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : @94, - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @96, - #parent : @173, - #level : 2, - #links : @98 - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @101, - #parent : @173, - #level : 2, - #links : @103 - }, - @167, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @189, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -olors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @228, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] ifFound: - ifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @237, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @173, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : Text { - #string : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #runs : RunArray { - #runs : [ - 1142 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : Text { - #string : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #runs : RunArray { - #runs : [ - 1406 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : Text { - #string : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #runs : RunArray { - #runs : [ - 719 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @173, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @296, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @293, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @359 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @345, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @362 - } - ], - #parent : @342, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @366, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @366, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @366, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @366, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @342, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @382, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @342, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @339, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @321, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @293, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @396, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @396, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @396, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @396, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @393, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @423, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @438, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @438, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @438, - #level : 3 - } - ], - #parent : @435, - #level : 3 - } - ], - #parent : @432, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @447, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @447, - #level : 3 - } - ], - #parent : @432, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @426, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @426, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @263, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @421, - @424, - @455, - @458 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @465, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @465, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @465, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @464, - #parent : @432, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @498, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @498, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @498, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @511, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @511, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @483, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @477, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @263, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @463, - @465, - @468, - @471, - @474, - @483, - @486, - @489, - @492, - @495, - @498, - @501, - @504, - @507, - @511, - @514, - @517, - @521, - @524, - @527 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @542, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @542, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @542, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @539, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @555, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @555, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @539, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @536, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @569, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @569, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @569, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @569, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @584, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @584, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @569, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @566, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @536, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @533, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @263, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @263, - @266, - @275, - @284, - @173, - @182, - @186, - @187, - @188, - @167, - @164, - GrafoscopioNode { - #header : 'Characters', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -"You can find which is the ASCII number for a character" - -$@ charCode. - -"There are some character that are not printable" - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"If you see gliberish is because some display issue" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @167, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Strings', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @167, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Symbols', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @167, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @167, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Dynamics Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @167, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @189, - @192, - @196, - @200, - @203, - @206, - @209, - @212, - @215, - @219, - @222, - @225, - @228, - @230, - @234, - @237, - @240, - @243, - @246, - @249, - @252, - @255, - @259, - @293, - @296, - @299, - @302, - @305, - @308, - @311, - @314, - @317, - @321, - @324, - @327, - @330, - @333, - @336, - @339, - @342, - @345, - @347, - @350, - @353, - @356, - @359, - @362, - @366, - @369, - @372, - @375, - @378, - @382, - @385, - @393, - @396, - @399, - @402, - @405, - @408, - @413, - @417, - @421, - @424, - @455, - @458, - @463, - @465, - @468, - @471, - @474, - @483, - @486, - @489, - @492, - @495, - @498, - @501, - @504, - @507, - @511, - @514, - @517, - @521, - @524, - @527, - @533, - @536, - @539, - @542, - @545, - @548, - @551, - @555, - @558, - @561, - @566, - @569, - @572, - @575, - @578, - @581, - @584, - @587, - @590 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @599, - @603, - @608, - @613, - @618 - ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @161, - @164, - @599, - @603, - @608, - @613, - @618 - ], - #links : @624 - }, - @164, - @599, - @603, - @608, - @613, - @618, - GrafoscopioNode { - #header : 'Processing data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Messages', - #key : '', - #body : 'Los mensajes son la forma en que los objetos se comunican entre sí y en que -nosotros, los humanos, nos comunicamos con el sistema. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Unary', - #headers : OrderedCollection [ ], - #key : '', - #body : '" -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : @631, - #children : @632, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @661, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - @637, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @696, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @708, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @642, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - }, - @642, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @752, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @749, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @817 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @801, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @820 - } - ], - #parent : @798, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @824, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @824, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @824, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @824, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @798, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @840, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @798, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @795, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @777, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @749, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @854, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @854, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @854, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @854, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @851, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @881, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @896, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @896, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @896, - #level : 3 - } - ], - #parent : @893, - #level : 3 - } - ], - #parent : @890, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @905, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @905, - #level : 3 - } - ], - #parent : @890, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @884, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @884, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @734, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @879, - @882, - @913, - @916 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @923, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @923, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @923, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @922, - #parent : @890, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @956, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @956, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @956, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @969, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @969, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @941, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @935, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @734, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @921, - @923, - @926, - @929, - @932, - @941, - @944, - @947, - @950, - @953, - @956, - @959, - @962, - @965, - @969, - @972, - @975, - @979, - @982, - @985 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1000, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1000, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1000, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @997, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1013, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1013, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @997, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @994, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1042, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1042, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1024, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @994, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @991, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @734, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @734, - @737, - @741, - @745, - @642, - @646, - @650, - @654, - @658, - @661, - @664, - @667, - @670, - @674, - @678, - @682, - @637, - @633, - GrafoscopioNode { - #header : 'Binary', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Keyword', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Priority', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 negated + (3 raisedTo: 2). - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Changing messages priority', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mathematical messages priority ', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cascade messages', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\topen; -\tshow: \'hello\'; -\tcr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @637, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @687, - @690, - @693, - @696, - @699, - @704, - @708, - @711, - @714, - @717, - @720, - @723, - @726, - @730, - @749, - @752, - @755, - @758, - @761, - @764, - @767, - @770, - @773, - @777, - @780, - @783, - @786, - @789, - @792, - @795, - @798, - @801, - @803, - @807, - @811, - @814, - @817, - @820, - @824, - @827, - @830, - @833, - @836, - @840, - @843, - @851, - @854, - @857, - @860, - @863, - @866, - @871, - @875, - @879, - @882, - @913, - @916, - @921, - @923, - @926, - @929, - @932, - @941, - @944, - @947, - @950, - @953, - @956, - @959, - @962, - @965, - @969, - @972, - @975, - @979, - @982, - @985, - @991, - @994, - @997, - @1000, - @1003, - @1006, - @1009, - @1013, - @1016, - @1019, - @1024, - @1027, - @1030, - @1033, - @1036, - @1039, - @1042, - @1045, - @1048 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @1057, - @1062, - @1066, - @1070, - @1074, - @1078 - ], - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @630, - @633, - @1057, - @1062, - @1066, - @1070, - @1074, - @1078, - @1082 - ], - #links : @1087 - }, - GrafoscopioNode { - #header : 'Blocks', - #key : '', - #body : '"For this part a Basic understanding of Basic Types is recommended. -If you have not done that part yet, please go to that subtree and run the code there" -"Ahora hablemos de los bloques. -Piensa en los bloques como una manera de \'congelar\' código que luego podremos ejecutar por demanda, -cuando queramos y/o las condiciones para su ejecución se cumplan. -Los bloques son métodos anónimos, lo cual quiere decir que no es necesario ponerles nombres para invocarlos -(como ocurre con las operaciones sobre objetos que hemos visto hasta el momento) y -pueden pueden ser almacenados en variables. -Los bloques están delimitados por paréntesis cuadrados: []" - -[ProfStef openPharoZenWorkspace]. - -"El bloque anterior no abre el Zen de Pharo, porque el bloque, por omisión, no es ejecutado. -Ahora ejecuta:" - -[ProfStef openPharoZenWorkspace] value. - -"Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Los argumentos, son las variables internas de los bloques, están precedidas por \':\' -y la barra vertical \'|\' separa la parte en que se definen los argumentos, de la parte en que se dice -que hacer con ellos." - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " - -[:x | x/2 asFloat] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -"Podemos tener además bloques que reciban varios argumentos, por ejemplo:" - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1090 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Blocks assignment', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1095 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Conditionals', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1100 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cycles & Iterators', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 1 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : @1106, - #children : @1107, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1131, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1157, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : @1091, - #children : @1092, - #parent : @1112, - #level : 2, - #links : @1094 - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : @1096, - #children : @1097, - #parent : @1112, - #level : 2, - #links : @1099 - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : @1101, - #children : @1102, - #parent : @1112, - #level : 2, - #links : @1104 - }, - @1111, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : Text { - #string : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #runs : RunArray { - #runs : [ - 467 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Buttons example', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Chaning a live running system', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cleaning methods', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exploring objects', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Making your own tutorials', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1194, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1112, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - }, - @1112, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1249, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1246, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @1314 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1298, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @1317 - } - ], - #parent : @1295, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1321, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1321, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1321, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1321, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @1295, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1337, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @1295, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1292, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1274, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1246, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1351, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1351, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1351, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1351, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1348, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @1378, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1393, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1393, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1393, - #level : 3 - } - ], - #parent : @1390, - #level : 3 - } - ], - #parent : @1387, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1402, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1402, - #level : 3 - } - ], - #parent : @1387, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1381, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1381, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1231, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1376, - @1379, - @1410, - @1413 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1420, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1420, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1420, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1419, - #parent : @1387, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1453, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1453, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1453, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1466, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1466, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1438, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1432, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @1231, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1418, - @1420, - @1423, - @1426, - @1429, - @1438, - @1441, - @1444, - @1447, - @1450, - @1453, - @1456, - @1459, - @1462, - @1466, - @1469, - @1472, - @1476, - @1479, - @1482 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1497, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1497, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1497, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1494, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1510, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1510, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1494, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1491, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1539, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1539, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1521, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1491, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1488, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1231, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @1231, - @1234, - @1238, - @1242, - @1112, - @1116, - @1120, - @1124, - @1128, - @1131, - @1134, - @1137, - @1140, - @1144, - @1148, - @1152, - @1157, - @1160, - @1164, - @1168, - @1171, - @1174, - @1177, - @1180, - @1183, - @1187, - @1188, - @1189, - @1111, - @1108, - @1190, - @1194, - @1202, - @1206, - @1210, - @1214, - @1218, - @1222, - @1227, - @1246, - @1249, - @1252, - @1255, - @1258, - @1261, - @1264, - @1267, - @1270, - @1274, - @1277, - @1280, - @1283, - @1286, - @1289, - @1292, - @1295, - @1298, - @1300, - @1304, - @1308, - @1311, - @1314, - @1317, - @1321, - @1324, - @1327, - @1330, - @1333, - @1337, - @1340, - @1348, - @1351, - @1354, - @1357, - @1360, - @1363, - @1368, - @1372, - @1376, - @1379, - @1410, - @1413, - @1418, - @1420, - @1423, - @1426, - @1429, - @1438, - @1441, - @1444, - @1447, - @1450, - @1453, - @1456, - @1459, - @1462, - @1466, - @1469, - @1472, - @1476, - @1479, - @1482, - @1488, - @1491, - @1494, - @1497, - @1500, - @1503, - @1506, - @1510, - @1513, - @1516, - @1521, - @1524, - @1527, - @1530, - @1533, - @1536, - @1539, - @1542, - @1545 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1105, - @1108 - ], - #links : @1555 - }, - GrafoscopioNode { - #header : 'Colections', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : @1191, - #children : @1192, - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1558 - ], - #links : @1193 - }, - GrafoscopioNode { - #header : 'Optional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : @1200, - #children : @1201, - #parent : @627, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1560, - @1202, - @1206, - @1210, - @1214, - @1218, - @1222 - ], - #links : @1226 - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @630, - @633, - @1057, - @1062, - @1066, - @1070, - @1074, - @1078, - @1090, - @1095, - @1100, - @1105, - @1108, - @1558, - @1560, - @1202, - @1206, - @1210, - @1214, - @1218, - @1222, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Saving and sharing your code snippets and notebook via web', - #body : 'Use "Export Playground" functionality for code nodes and share your previos excercises via the Etherpad with your -companions. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Fossil', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Installing', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Windows', - #body : 'Go to the download page', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1572, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1569, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using', - #body : 'Follow the following steps to share your notebooks using Fossil', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Clone a repository the Data Week repository at: ', - #body : 'Clone the Data Week repository at: - -Lets start creating a folder for our repository, this could have any name. In our case we\'ll call it `DataWeek`: - - mkdir -p ~/Documents/DataWeek - cd ~/Documentos/DataWeek - fossil clone http://mutabit.com/repos.fossil/dataweek/ dataweek.fossil - -The general syntax for cloning a repository is: - - fossil clone - -Una vez se halla terminado el clonado del repositorio, saldrá algo como esto: - - Round-trips: 3 Artifacts sent: 0 received: 378 - Clone done, sent: 835 received: 15013550 ip: 45.55.37.99 - Rebuilding repository meta-data... - 100.0% complete... - Extra delta compression... - Vacuuming the database... - project-id: aa9f6e73b4f326e190f15c4a830c0909619bfa42 - server-id: e166198b6fb3e438428986e46077a10f4efae1b9 - admin-user: apple (password is "9fa088") -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Open the repository', - #body : 'Go to the folder where you cloned the repository and open it: - - cd ~/Documents/DataWeek - fossil open dataweek.fossil - -Una vez abierto, veremos una salida como la que está en: - -Artefactos/DataSelfies/data-selfies.ston -Artefactos/SoftwarePublicoColombia/anotaciones.png -Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md -Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf - - - -project-name: Dataweek -repository: /home/offray/Documentos/Critinfo/dataweek.fossil -local-root: /home/offray/Documentos/Critinfo/ -config-db: /home/offray/.fossil -project-code: aa9f6e73b4f326e190f15c4a830c0909619bfa42 -checkout: 113749bfda422450b7a2bdb68b8a28b17a690142 2017-10-29 22:46:31 UTC -parent: bddea106fa30df41ee415b9d350a56277995eb5e 2017-10-26 23:04:08 UTC -tags: trunk -comment: Notas para el taller de mañana. (user: offray) -check-ins: 99 - -que corresponde a los archivos y carpetas en dicho repositorio y que remotamente se pueden navegar desde: - -Hemos accedido a una copia de [todos los archivos](http://mutabit.com/repos.fossil/dataweek/dir?ci=tip ), sino de [toda su historia](http://mutabit.com/repos.fossil/dataweek/timeline?n=500&y=all&t=&ms=exact ) - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Introduce variation ', - #body : ' - Create a folder for you under `Participants/`, where `` is any kind of unique indenfier yourself. - It could be `FirstNameLastName`, your social media handler, or others. - - From Grafoscopio, save a modified version of this notebook to the previously created folder. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Register and syncronize', - #body : '- Creamos un usuario en dicho repositorio: - - http://mutabit.com/repos.fossil/dataweek/login - - Nos sincronizamos desde la consola de comandos: - - fossil sync http://@mutabit.com/repos.fossil/dataweek/ - -donde `` es el nombre de usuario que registramos en el paso anterior.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Commit', - #body : ' - Commit to the Fossil repository. - - Browse the repository history, locate your commit and share your notebook with others. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Share your commit', - #body : 'Browse the [repository history](http://mutabit.com/repos.fossil/dataweek/timeline ), locate your commit and share your notebook with others.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Rinse and repeat', - #body : 'Go to the excercises in the previous section. Do the "Using block to modularize code" and -"Add voting results for all deparments" and commit your modifed notebook with these two -solutions added.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1580, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1569, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1566, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using Code Browser + SmalltalkHub', - #body : 'In the previous excercise, we learnt how to share notebooks with the world using Fossil code repositories. -Each notebook is a text file that can be shared & versioned in this way. -But at some point you will want to reify you code in a way that express your understangin about a problem -via models. -When you do that (which is called modelling) in Pharo, you are creating what is called a Specific Domain -Language (or DSL) for that problem. -With the previous excercises, we are ready to create a DSL for the Peace Voting Results in Colombia, with -the help on Code Browser and then we are going to share such DSL using SmalltalkHub, wich is a facility -to share code among Pharo users. -This will be the objective of this section.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1566, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1563, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @1566, - @1569, - @1572, - @1575, - @1580, - @1583, - @1587, - @1591, - @1595, - @1599, - @1603, - @1607, - @1613, - GrafoscopioNode { - #header : 'Modelling data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Data adquiring & manipulation', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Open Movie Data Base', - #body : 'This first exercise will be related with Open Movie Data Base.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1622, - #level : 3, - #links : OrderedCollection [ - '', - 'http://www.omdbapi.com/' - ] - }, - GrafoscopioNode { - #header : 'Líderes amenazados en Colombia', - #body : '| contents data totalHombres totalMujeres b labeledData lb | -"Let\'s get the data" -contents := \'https://tupale.co//milfs/api.php?id=410&tipo=simple\' asUrl retrieveContents. -data := NeoJSONReader fromString: contents. -totalHombres := (data select: [ :item | (item at: \'Sexo\') = \'Hombre\']) size. -totalMujeres := data size - totalHombres. -labeledData := { \'Hombres\' -> totalHombres . \'Mujeres\' -> totalMujeres }. -"Here we build the Pie Graphics" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"Legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Líderes amenazados en Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1622, - #level : 3, - #links : OrderedCollection [ - '', - 'https://tupale.co//milfs/api.php?id=410&tipo=simple', - 'http://ws.stfx.eu/GR43R3BV92KC' - ] - } - ], - #parent : @1619, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @1622, - @1625, - @1629, - GrafoscopioNode { - #header : 'What\'s next', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - } - ], - #links : OrderedCollection [ ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @12, - @16, - @84, - @105, - @161, - @627, - @1563, - @1619, - @1635 -] DELETED Participantes/Offray/techniques-for-data-activism.ston Index: Participantes/Offray/techniques-for-data-activism.ston ================================================================== --- Participantes/Offray/techniques-for-data-activism.ston +++ Participantes/Offray/techniques-for-data-activism.ston @@ -1,9834 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Introduction', - #body : 'This booklet presents a set of techniques to work with data, that are useful of Data Activism. -We consider data mostly as a non-neutral human construct and we think that a more critical -code+data literacy is needed to deal and build a common world that is, increasingly, mediated -by data and code. -Who is visible in this coming world, which voices are heard, and if we can create a plural participation -in such world will depend on such critical literacy. - -The work you\'re reading is opinionated, consequently. -It presents a set of tools, devices and techniques, that has been developed in our local community, at -HackBo, but try to become part of a wider conversation and nurtures from global communities. -This is also a work in progress, and because we take a "local first" approach, you will see that -this document is in "Spanglish", with the idea of having a full English translation in the future, -but starting from localized content originally Spanish or translated/wrote for/from Spanish speaking -communities. -If you\'re a native English speaker, any help is welcomed. -See the Community Guidelines in the Grafoscopio Manual, to see how to offer and ask for help. - -This document is made with Grafoscopio. Good familiarity with it is adviced. You can see more about -Grafoscopio at: - -This book is heavily based on Agile Visualization, and is covered by the same license. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : '%metadata', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism\'. -\'showOnHelp\' -> true. -} asOrderedDictionary. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Drawing with data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A first data draw', - #body : 'Drawing with data is esentialy about taking data, applying a visual form to it -and presenting it with a particular layout given account of possible patterns. -Lets start with this simple example', - #tags : OrderedCollection [ - '' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Drawing the first 20 numbers', - #body : ' -"Lets define our data model" -data := 1 to: 20. -"Now define the form that we\'ll apply to that data" -shape := (RTBox new size: 30) + RTLabel. -"Now create a set of visual elements using that basic fomr on our data" -elements := shape elementsOn: data. -"Lets define the view, where the data will be displayed" -view := RTView new. -"And lets add all visual elements to our view" -view addAll: elements. -"Now define the layout to our visual elements" -RTGridLayout on: elements. -"Now lets display our view" -view ', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Other data visualization examples', - #body : 'The following examples are taken from the Agile Visualizatio book. -They follow the same logic of the first data draw example, and are a short glimpse of what you -can do with this platform. -We\'re going to learn how to use it in detail here, so don\'t worry if details escape to you in this quick overview. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A tree of numbers', - #body : 'b := RTMondrian new. -b shape label. -b nodes: (1 to: 100). -b edges connectFrom: [ :i | i // 2 ]. -b layout cluster. -b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizing the user desktop', - #body : 'path := FileLocator desktop asFileReference. -allFilesUnderPath := path allChildren. -b := RTMondrian new. -b shape circle -\tcolor: Color gray trans; -\tif: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -b nodes: allFilesUnderPath. -b edges connectFrom: #parent. -b normalizer -\tnormalizeSize: #size min: 10 max: 150 using: #sqrt. -b layout tre. -b -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Geographical CSV data', - #body : '\ttab := RTTabTable new input: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(2 3 4 5). -\ttab convertColumnsAsFloat: #(2 3 4 5). - -\tb := RTMapLocationBuilder new. -\tb shape circle -\t\tsize: [ :m | 2 raisedTo: (m - 1) ]; -\t\tcolor: (Color red alpha: 0.3). -\ttab values do: [ :row | b addPoint: row second @ row third value: row fifth ]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Seism activity over time', - #body : '\ttab := RTTabTable new -\t\t\tinput: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents -\t\t\tusingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumn: 1 to: [ :s | (DateAndTime fromString: s) julianDayNumber ]. -\ttab convertColumnsAsFloat: #(5). - -\tv := RTView new. -\tes := RTEllipse elementsOn: tab values. -\tv addAll: es. -\tes @ RTPopup. - -\tRTMetricNormalizer new -\t\telements: es; -\t\tnormalizeColor: #fifth using: { Color orange . Color red }; -\t\talphaColor: 0.3; -\t\tnormalizeX: #first min: 0 max: 600; -\t\tnormalizeSize: #fifth min: 0 max: 80 using: [ :mag | 2 raisedTo: (mag - 1) ]. -\t\t -\tes @ (RTLabeled new text: [ :row | row fifth > 6 ifTrue: [ row fifth ] ifFalse: [ \'\' ] ]). -\tv @ RTDraggableView. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Charting', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ploting: Ebola fatalities', - #body : '"Preparing the data" -\ttab := RTTabTable new input: \'http://agilevisualization.com/Ebola2.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(10 11). -\ttab convertColumnsAsInteger: #(10 11). -\ttab convertColumnsAsDateAndTime: #(3 4). -\tdata := tab values reversed. - -\t"Charting the data" -\tb := RTGrapher new. - -\tds := RTData new. -\tds interaction fixedPopupText: [ :row | row value at: 12 ]. -\tds dotShape ellipse -\t\tcolor: (Color blue alpha: 0.3); -\t\tsize: [ :row | (row at: 11) / 5 ]. -\tds points: data. -\tds connectColor: Color blue. -\tds y: [ :r | r at: 10 ]. -\tds highlightIf: [ :row | (row at: 10) > 100 ] using: [ :row | row third year ]. -\tb add: ds. - -\tb axisX noLabel; numberOfTicks: tab values size. -\tb axisY noDecimal. -\tb -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Double charting: distribution of US population over 18', - #body : 'tab := RTTabTable new input: \'http://agilevisualization.com/AgileVisualization/census.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumnsAsInteger: #(\'POPESTIMATE2013\' \'POPEST18PLUS2013\'). - -\tb := RTDoubleBarBuilder new. -\tb pointName: [ :row | row at: (tab indexOfName: \'NAME\') ]. -\t"Remove the first line, the sum" -\tb points: tab values allButFirst. -\tb bottomValue: [ :row | ((row at: (tab indexOfName: \'POPESTIMATE2013\')) / 1000) asInteger ] -\t\ttitled: \'Pop estimate (x 1000)\'. -\tb topValue: [ :row | ((row at: (tab indexOfName: \'POPEST18PLUS2013\')) / 1000) asInteger] -\t\ttitled: \'Pop +18 estimate (x 1000)\'. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Multiple graphs', - #body : 'b := RTGrapher new. -\tnumberOfDataSets := 5. - -\tcolorNormalizer := RTMultiLinearColorForIdentity new -\t\t\t\t\t\tobjects: (1 to: numberOfDataSets). -\t1 to: numberOfDataSets do: [ :i | -\t\tds := RTData new. -\t\tds noDot. -\t\tds points: ((1 to: 500) collect: [ :ii | 50 atRandom - 25 ]) cumsum. -\t\tds connectColor: (colorNormalizer rtValue: i). -\t\tb add: ds. -\t]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Timeline', - #body : 'data := #( -\t\t#(WP1 0 4) #(WP2 4 8) -\t\t#(WP3 8 12) #(WP4 3 4) -\t\t#(WP4 7 9) #(WP4 10 12) -\t ). -\tb := RTTimeline new. -\ts := RTTimelineSet new. -\ts objects: data. -\ts lineIdentifier: #first. -\ts start: #second. -\ts end: #third. -\tb add: s. -\tb axisX -\t\tnoDecimal; -\t\ttitle: \'Month\'; -\t\tnumberOfLabels: 12. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Integration with OpenStreetMap', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Example 1', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"City geographical positions obtained from Wikipedia" -\tparis := 48.8567 @ 2.3508. -\tnewyork := 40.7127 @ -74.0059. -\tlondon := 51.507222@ -0.1275. -\t -\t"Some arbitrary data" -\tdata := -\t\t{ { paris . #(10 5 10 3 10 6 8) } . -\t\t\t{ london . #(5 3 3 -5 ) } . -\t\t\t{ newyork . #(5 -2 10 15 -10) } }. -\t -\tdata do: [ :tupple | -\t\t\t| grapher dataSet | -\t\t\tgrapher := RTGrapher new. -\t\t\tgrapher extent: 150 @ 100. -\t\t\tdataSet := RTData new. -\t\t\tdataSet points: tupple second. -\t\t\tdataSet barShape width: 10; color: Color red. -\t\t\tgrapher add: dataSet. -\t\t\tgrapher build. - -\t\t\tbarElements := grapher view elements. -\t\t\tv addAll: barElements. -\t\t\tbarElements translateTo: (map latLonToRoassal: tupple first) ]. -\t -\tv canvas camera translateTo: (map latLonToRoassal: paris). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 0.3. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Example 2', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"Place to set the data and center the camera" -\tlondon := 51.507222@ -0.1275. - -\t"Some arbitrary data" -\tdata := ((1 to: 500) collect: [ :i | 50 atRandom - 25 ]) cumsum. - -\t"We build the graph" -\tb := RTGrapher new. -\tb extent: 100@30. -\td := RTData new. -\td noDot. -\td connectColor: Color red. -\td points: data. - -\tb add: d. -\tb axisY -\t\tlabelFontHeight: 6; -\t\tcolor: Color red; -\t title: \'Sale\'. - -\tb axisX color: Color red; noTick; title: \'country\'. -\tb build. -\telementsAndEdges := b view elements, b view edges. - -\t"We create a white background" -\twhiteBackground := (RTRoundedBox new color: Color white trans; borderRadius: 10) element. -\tv add: whiteBackground. -\tv addAll: elementsAndEdges. -\tRTNest new on: whiteBackground nest: elementsAndEdges. -\twhiteBackground translateTo: (map latLonToRoassal: london). - -\tv canvas camera translateTo: (map latLonToRoassal: london). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 1.5. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @15, - @18, - @23, - @26, - @30, - @34, - @38, - @42, - @45, - @49, - @53, - @58, - @62, - @65, - @69, - GrafoscopioNode { - #header : 'Basic interation', - #body : 'Before going deeper into data we need some basic operation with the environment, -about three basic operations: - - - Doing: ie executing instructions also called messages. - - Printing: Seeing the result of executing messages. - - Inpecting: Going deeper into the objects thare hold and represent data. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Doing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\') -" - -ProfStef openPharoZenWorkspace - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @79 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Printing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @85 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Inspecting', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @91 - ], - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @79, - @85, - @91, - GrafoscopioNode { - #header : 'Desconstructing a practical example', - #body : 'We\'re going to start with our first practical example. -The idea is to get data from an online source, clean it a little bit, and make a simple graph. -From there, we\'re going to deconstruct the example and the properties of mensages, -and some objects, wich simple but powerful conceptual model behind Pharo.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peace voting in Colombia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Totals', - #body : '| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstructing the example :-)', - #body : '"Here we\'re going step by step in the previous example showing its parts and where you -can get more information about the operations and concepts that we used." -"Lets define the variables that we\'re going to use" -| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/C519QKLYZY56' - ] - }, - GrafoscopioNode { - #header : 'Totals by deparments (states)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Two deparments & dummy data', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: #(25 29) title: \'Dummy Data 1\'. -b add: #(30 33) title: \'Dummy Data 2\'. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @111, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exercises', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Add two deparments', - #body : '"Modify the \'Two deparments & dummy data\' previous example to add two more deparments to the graphic"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Answer Offray', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -yes3 := ((tab values at:5) at: 9) asNumber. -no3 := ((tab values at:5) at: 11) asNumber. -location3 := (tab values at:5) at: 1. -yes4 :=((tab values at:18) at: 9) asNumber. -no4 :=((tab values at:18) at: 11) asNumber. -location4 := (tab values at:18) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: { yes3 . no3 } title: location3. -b add: { yes4 . no4 } title: location4. - -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @122, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/A1S1N7G2DVVU', - 'http://ws.stfx.eu/3HOBOGAK5GUO', - 'http://ws.stfx.eu/I0OWO9RDVKTB', - 'http://ws.stfx.eu/IAUS1V2KO8M6' - ] - } - ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using blocks to modularize code', - #body : '"Can you use blocks and basic types to make the code in our pie char example more modular? -The idea is to split the functionality of such example into chunks, and put them inside blocks, -that receive arguments. Which should be such blocks? Which are the block arguments? -Rewrite the example here using the idea of blocks and arguments. -"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Add voting results at all deparments', - #body : '"Use iterators (see the \'Representing data: Basic Types\' & \'Processing data > Cycles & Iteractors\') -to modify the Two deparments & dummy data example, including now all the data."', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Composing two visualizations', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Raw data link', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'https://www.datasketch.co/es/p/los-datos-ocultos-de-la-registraduria' - ] - } - ], - #parent : @97, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @100, - @103, - @107, - @111, - @114, - @119, - @122, - @125, - @130, - @134, - @139, - @143, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Saving your code to the web', - #body : 'Use "Export Playground" functionality for code nodes and share your previos excercises via the Etherpad with your -companions. - -Use Fossil to: - - - Clone the Data Week repository at: - - Open the repository - - Create a folder for you under `Participants/`, where `` is any kind of unique indenfier yourself. - It could be `FirstNameLastName`, your social media handler, or others. - - Save a modified version of this notebook to the previously created folder. - - Commit to the Fossil repository. - - Browse the repository history, locate your commit and share your notebook with others. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @149, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @152, - GrafoscopioNode { - #header : 'Representing data: Basic Types', - #key : '', - #body : 'Basic types are ways or represeting information inside this system. See nodes inside for more details', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Numbers', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @159, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : Text { - #string : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #runs : RunArray { - #runs : [ - 586 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : @80, - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @82, - #parent : @169, - #level : 2, - #links : @84 - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : @86, - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @88, - #parent : @169, - #level : 2, - #links : @90 - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @93, - #parent : @169, - #level : 2, - #links : @95 - }, - @163, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -olors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @224, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] ifFound: - ifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : Text { - #string : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #runs : RunArray { - #runs : [ - 1142 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : Text { - #string : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #runs : RunArray { - #runs : [ - 1406 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : Text { - #string : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #runs : RunArray { - #runs : [ - 719 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @169, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @355 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @358 - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @335, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @389, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @419, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - } - ], - #parent : @431, - #level : 3 - } - ], - #parent : @428, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - } - ], - #parent : @428, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @417, - @420, - @451, - @454 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @460, - #parent : @428, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @473, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @562, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @529, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @259, - @262, - @271, - @280, - @169, - @178, - @182, - @183, - @184, - @163, - @160, - GrafoscopioNode { - #header : 'Characters', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -"You can find which is the ASCII number for a character" - -$@ charCode. - -"There are some character that are not printable" - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"If you see gliberish is because some display issue" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Strings', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Symbols', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Dynamics Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @185, - @188, - @192, - @196, - @199, - @202, - @205, - @208, - @211, - @215, - @218, - @221, - @224, - @226, - @230, - @233, - @236, - @239, - @242, - @245, - @248, - @251, - @255, - @289, - @292, - @295, - @298, - @301, - @304, - @307, - @310, - @313, - @317, - @320, - @323, - @326, - @329, - @332, - @335, - @338, - @341, - @343, - @346, - @349, - @352, - @355, - @358, - @362, - @365, - @368, - @371, - @374, - @378, - @381, - @389, - @392, - @395, - @398, - @401, - @404, - @409, - @413, - @417, - @420, - @451, - @454, - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523, - @529, - @532, - @535, - @538, - @541, - @544, - @547, - @551, - @554, - @557, - @562, - @565, - @568, - @571, - @574, - @577, - @580, - @583, - @586 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @595, - @599, - @604, - @609, - @614 - ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @157, - @160, - @595, - @599, - @604, - @609, - @614 - ], - #links : @620 - }, - @160, - @595, - @599, - @604, - @609, - @614, - GrafoscopioNode { - #header : 'Processing data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Messages', - #key : '', - #body : 'Los mensajes son la forma en que los objetos se comunican entre sí y en que -nosotros, los humanos, nos comunicamos con el sistema. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Unary', - #headers : OrderedCollection [ ], - #key : '', - #body : '" -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : @627, - #children : @628, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - @633, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @692, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - @638, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @813 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @816 - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @836, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @791, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @847, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @877, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - } - ], - #parent : @889, - #level : 3 - } - ], - #parent : @886, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - } - ], - #parent : @886, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @875, - @878, - @909, - @912 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @918, - #parent : @886, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @931, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1020, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @987, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @730, - @733, - @737, - @741, - @638, - @642, - @646, - @650, - @654, - @657, - @660, - @663, - @666, - @670, - @674, - @678, - @633, - @629, - GrafoscopioNode { - #header : 'Binary', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Keyword', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Priority', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 negated + (3 raisedTo: 2). - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Changing messages priority', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mathematical messages priority ', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cascade messages', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\topen; -\tshow: \'hello\'; -\tcr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @683, - @686, - @689, - @692, - @695, - @700, - @704, - @707, - @710, - @713, - @716, - @719, - @722, - @726, - @745, - @748, - @751, - @754, - @757, - @760, - @763, - @766, - @769, - @773, - @776, - @779, - @782, - @785, - @788, - @791, - @794, - @797, - @799, - @803, - @807, - @810, - @813, - @816, - @820, - @823, - @826, - @829, - @832, - @836, - @839, - @847, - @850, - @853, - @856, - @859, - @862, - @867, - @871, - @875, - @878, - @909, - @912, - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981, - @987, - @990, - @993, - @996, - @999, - @1002, - @1005, - @1009, - @1012, - @1015, - @1020, - @1023, - @1026, - @1029, - @1032, - @1035, - @1038, - @1041, - @1044 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074 - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1078 - ], - #links : @1083 - }, - GrafoscopioNode { - #header : 'Blocks', - #key : '', - #body : '"For this part a Basic understanding of Basic Types is recommended. -If you have not done that part yet, please go to that subtree and run the code there" -"Ahora hablemos de los bloques. -Piensa en los bloques como una manera de \'congelar\' código que luego podremos ejecutar por demanda, -cuando queramos y/o las condiciones para su ejecución se cumplan. -Los bloques son métodos anónimos, lo cual quiere decir que no es necesario ponerles nombres para invocarlos -(como ocurre con las operaciones sobre objetos que hemos visto hasta el momento) y -pueden pueden ser almacenados en variables. -Los bloques están delimitados por paréntesis cuadrados: []" - -[ProfStef openPharoZenWorkspace]. - -"El bloque anterior no abre el Zen de Pharo, porque el bloque, por omisión, no es ejecutado. -Ahora ejecuta:" - -[ProfStef openPharoZenWorkspace] value. - -"Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Los argumentos, son las variables internas de los bloques, están precedidas por \':\' -y la barra vertical \'|\' separa la parte en que se definen los argumentos, de la parte en que se dice -que hacer con ellos." - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " - -[:x | x/2 asFloat] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -"Podemos tener además bloques que reciban varios argumentos, por ejemplo:" - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1086 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Blocks assignment', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1091 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Conditionals', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1096 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cycles & Iterators', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 1 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : @1102, - #children : @1103, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : @1087, - #children : @1088, - #parent : @1108, - #level : 2, - #links : @1090 - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : @1092, - #children : @1093, - #parent : @1108, - #level : 2, - #links : @1095 - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : @1097, - #children : @1098, - #parent : @1108, - #level : 2, - #links : @1100 - }, - @1107, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : Text { - #string : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #runs : RunArray { - #runs : [ - 467 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Buttons example', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Chaning a live running system', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cleaning methods', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exploring objects', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Making your own tutorials', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - @1108, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @1310 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @1313 - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1333, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1288, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1344, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @1374, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - } - ], - #parent : @1386, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1372, - @1375, - @1406, - @1409 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1415, - #parent : @1383, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1428, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1517, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1484, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @1227, - @1230, - @1234, - @1238, - @1108, - @1112, - @1116, - @1120, - @1124, - @1127, - @1130, - @1133, - @1136, - @1140, - @1144, - @1148, - @1153, - @1156, - @1160, - @1164, - @1167, - @1170, - @1173, - @1176, - @1179, - @1183, - @1184, - @1185, - @1107, - @1104, - @1186, - @1190, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - @1223, - @1242, - @1245, - @1248, - @1251, - @1254, - @1257, - @1260, - @1263, - @1266, - @1270, - @1273, - @1276, - @1279, - @1282, - @1285, - @1288, - @1291, - @1294, - @1296, - @1300, - @1304, - @1307, - @1310, - @1313, - @1317, - @1320, - @1323, - @1326, - @1329, - @1333, - @1336, - @1344, - @1347, - @1350, - @1353, - @1356, - @1359, - @1364, - @1368, - @1372, - @1375, - @1406, - @1409, - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478, - @1484, - @1487, - @1490, - @1493, - @1496, - @1499, - @1502, - @1506, - @1509, - @1512, - @1517, - @1520, - @1523, - @1526, - @1529, - @1532, - @1535, - @1538, - @1541 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1101, - @1104 - ], - #links : @1551 - }, - GrafoscopioNode { - #header : 'Colections', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : @1187, - #children : @1188, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1554 - ], - #links : @1189 - }, - GrafoscopioNode { - #header : 'Optional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : @1196, - #children : @1197, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218 - ], - #links : @1222 - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1086, - @1091, - @1096, - @1101, - @1104, - @1554, - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - GrafoscopioNode { - #header : 'Modelling data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Data adquiring & manipulation', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Open Movie Data Base', - #body : 'This first exercise will be related with Open Movie Data Base.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'http://www.omdbapi.com/' - ] - }, - GrafoscopioNode { - #header : 'Líderes amenazados en Colombia', - #body : '| contents data totalHombres totalMujeres b labeledData lb | -"Let\'s get the data" -contents := \'https://tupale.co//milfs/api.php?id=410&tipo=simple\' asUrl retrieveContents. -data := NeoJSONReader fromString: contents. -totalHombres := (data select: [ :item | (item at: \'Sexo\') = \'Hombre\']) size. -totalMujeres := data size - totalHombres. -labeledData := { \'Hombres\' -> totalHombres . \'Mujeres\' -> totalMujeres }. -"Here we build the Pie Graphics" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"Legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Líderes amenazados en Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'https://tupale.co//milfs/api.php?id=410&tipo=simple', - 'http://ws.stfx.eu/GR43R3BV92KC' - ] - } - ], - #parent : @1559, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @1562, - @1565, - @1569, - GrafoscopioNode { - #header : 'What\'s next', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - } - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @12, - @76, - @97, - @149, - @157, - @623, - @1559, - @1575 -] DELETED Participantes/RicardoZ/data-activism-apprentice-notebookRZ.ston Index: Participantes/RicardoZ/data-activism-apprentice-notebookRZ.ston ================================================================== --- Participantes/RicardoZ/data-activism-apprentice-notebookRZ.ston +++ Participantes/RicardoZ/data-activism-apprentice-notebookRZ.ston @@ -1,10464 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : '%metadata Data Activism Apprentice Notebook', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding & agile visualization for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'apprentice\' -> \'rlzzapat\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism Techniques\'. -\'showOnHelp\' -> true. -\'docType\' -> \'tutorial\' -} asOrderedDictionary -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : 'Learning Markdown', - #body : 'Entramos a Stack Edit', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @8 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exercises with Peace Data', - #body : 'The following nodes will present you with a set of excercises. -Each exercise is put as a node. -Create a playground node as child of the exercise node and use the playground to write the -code needed to solve it.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Add two deparments', - #body : 'Modify the \'Two deparments & dummy data\' previous example to add two more deparments to the graphic.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Solution', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 yes3 no3 location3 yes4 no4 location4| -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -yes3 := ((tab values at: 4) at: 9) asNumber. -no3 := ((tab values at: 4) at: 11) asNumber. -location3 := (tab values at:4) at: 1. -yes4 := ((tab values at: 5) at: 9) asNumber. -no4 := ((tab values at: 5) at: 11) asNumber. -location4 := (tab values at:5) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: (Color r: 0.41500000000000004 g: 0.23900000000000002 b: 0.604 alpha: 1.0) with: (Color r: 1.0 g: 1.0 b: 0.2 alpha: 1.0). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: { yes3 . no3 } title: location3. -b add: { yes4 . no4 } title: location4. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @16, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Exercises', - #body : Text { - #string : 'The following nodes will present you with a set of excercises. -Each exercise is put as a node. -Create a playground node as child of the exercise node and use the playground to write the -code needed to solve it.', - #runs : RunArray { - #runs : [ - 216 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : @14, - #children : @15, - #parent : GrafoscopioNode { - #header : 'Peace voting in Colombia', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Deconstructing the example: Toval voting for Peace in Colombia 2016', - #body : '| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @29, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Totals by deparments (states)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Two deparments & dummy data', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: #(25 29) title: \'Dummy Data 1\'. -b add: #(30 33) title: \'Dummy Data 2\'. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @40, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @29, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @23, - GrafoscopioNode { - #header : 'Composing two visualizations', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @29, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Raw data link', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @29, - #level : 3, - #links : OrderedCollection [ - '', - 'https://www.datasketch.co/es/p/los-datos-ocultos-de-la-registraduria' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Desconstructing a practical example', - #body : 'We\'re going to start with our first practical example. -The idea is to get data from an online source, clean it a little bit, and make a simple graph. -From there, we\'re going to deconstruct the example and the properties of mensages, -and some objects, wich simple but powerful conceptual model behind Pharo.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - @29 - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '%metadata Data Activism Techniques', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding & agile visualization for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism Techniques\'. -\'showOnHelp\' -> true. -\'docType\' -> \'tutorial\' -} asOrderedDictionary -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Introduction', - #body : 'This booklet presents a set of techniques to work with data, that are useful of Data Activism. -We consider data mostly as a non-neutral human construct and we think that a more critical -code+data literacy is needed to deal and build a common world that is, increasingly, mediated -by data and code. -Who is visible in this coming world, which voices are heard, and if we can create a plural participation -in such world will depend on such critical literacy. - -The work you\'re reading is opinionated, consequently. -It presents a set of tools, devices and techniques, that has been developed in our local community, at -HackBo, but try to become part of a wider conversation and nurtures from global communities. -This is also a work in progress, and because we take a "local first" approach, you will see that -this document is in "Spanglish", with the idea of having a full English translation in the future, -but starting from localized content originally Spanish or translated/wrote for/from Spanish speaking -communities. -If you\'re a native English speaker, any help is welcomed. -See the Community Guidelines in the Grafoscopio Manual, to see how to offer and ask for help. - -This document is made with Grafoscopio. Good familiarity with it is adviced. You can see more about -Grafoscopio at: - -Several examples from booklet are based on Agile Visualization, and is covered by the same license. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Documenting', - #body : Text { - #string : 'If you are seeing this document inside Grafoscopio, is probably that you are reading -some strange marks on it, and words surrounded by the, like `*this one*`. -Such marks correspond to what is called a [light markup language][light-markup], -which is a way to express format and structure of a document by marking it contents -with some special characters, called markup. - -From the several markup languages available, Grafoscopio uses [Pandoc\'s Markdown][pandoc-md], -because of its flexibility and completeness. -This section - -[light-markup]: https://en.wikipedia.org/wiki/Lightweight_markup_language -[pandoc-md]: ', - #runs : RunArray { - #runs : [ - 17, - 1, - 1, - 11, - 1, - 32, - 1, - 1, - 2, - 1, - 24, - 1, - 16, - 1, - 25, - 1, - 1, - 11, - 1, - 33, - 1, - 1, - 5, - 1, - 18, - 1, - 22, - 1, - 25, - 1, - 1, - 15, - 1, - 6, - 1, - 3, - 1, - 16, - 1, - 13, - 1, - 4, - 1, - 2, - 1, - 5, - 1, - 21, - 1, - 27, - 1, - 1, - 100, - 1, - 11, - 1, - 12, - 1, - 15, - 1, - 12, - 1, - 11, - 2, - 31, - 1, - 5, - 1, - 31 - ], - #values : [ - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ], - [ ] - ], - #lastIndex : 525, - #lastRun : 61, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Learning Markdown', - #body : Text { - #string : 'Entramos a Stack Edit', - #runs : RunArray { - #runs : [ - 21 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : @9, - #children : @10, - #parent : @70, - #level : 2, - #links : @12 - } - ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Drawing with data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A first data draw', - #body : 'Drawing with data is esentialy about taking data, applying a visual form to it -and presenting it with a particular layout given account of possible patterns. -Lets start with this simple example', - #tags : OrderedCollection [ - '' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Drawing the first 20 numbers', - #body : ' -"Lets define our data model" -data := 1 to: 20. -"Now define the form that we\'ll apply to that data" -shape := (RTBox new size: 30) + RTLabel. -"Now create a set of visual elements using that basic fomr on our data" -elements := shape elementsOn: data. -"Lets define the view, where the data will be displayed" -view := RTView new. -"And lets add all visual elements to our view" -view addAll: elements. -"Now define the layout to our visual elements" -RTGridLayout on: elements. -"Now lets display our view" -view ', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @156, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @153, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Other data visualization examples', - #body : 'The following examples are taken from the Agile Visualizatio book. -They follow the same logic of the first data draw example, and are a short glimpse of what you -can do with this platform. -We\'re going to learn how to use it in detail here, so don\'t worry if details escape to you in this quick overview. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A tree of numbers', - #body : 'b := RTMondrian new. -b shape label. -b nodes: (1 to: 100). -b edges connectFrom: [ :i | i // 2 ]. -b layout cluster. -b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizing the user desktop', - #body : 'path := FileLocator desktop asFileReference. -allFilesUnderPath := path allChildren. -b := RTMondrian new. -b shape circle -\tcolor: Color gray trans; -\tif: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -b nodes: allFilesUnderPath. -b edges connectFrom: #parent. -b normalizer -\tnormalizeSize: #size min: 10 max: 150 using: #sqrt. -b layout tree. -b - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Geographical CSV data', - #body : '\ttab := RTTabTable new input: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(2 3 4 5). -\ttab convertColumnsAsFloat: #(2 3 4 5). - -\tb := RTMapLocationBuilder new. -\tb shape circle -\t\tsize: [ :m | 2 raisedTo: (m - 1) ]; -\t\tcolor: (Color red alpha: 0.3). -\ttab values do: [ :row | b addPoint: row second @ row third value: row fifth ]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Seism activity over time', - #body : '\ttab := RTTabTable new -\t\t\tinput: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents -\t\t\tusingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumn: 1 to: [ :s | (DateAndTime fromString: s) julianDayNumber ]. -\ttab convertColumnsAsFloat: #(5). - -\tv := RTView new. -\tes := RTEllipse elementsOn: tab values. -\tv addAll: es. -\tes @ RTPopup. - -\tRTMetricNormalizer new -\t\telements: es; -\t\tnormalizeColor: #fifth using: { Color orange . Color red }; -\t\talphaColor: 0.3; -\t\tnormalizeX: #first min: 0 max: 600; -\t\tnormalizeSize: #fifth min: 0 max: 80 using: [ :mag | 2 raisedTo: (mag - 1) ]. -\t\t -\tes @ (RTLabeled new text: [ :row | row fifth > 6 ifTrue: [ row fifth ] ifFalse: [ \'\' ] ]). -\tv @ RTDraggableView. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Charting', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ploting: Ebola fatalities', - #body : '"Preparing the data" -\ttab := RTTabTable new input: \'http://agilevisualization.com/Ebola2.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(10 11). -\ttab convertColumnsAsInteger: #(10 11). -\ttab convertColumnsAsDateAndTime: #(3 4). -\tdata := tab values reversed. - -\t"Charting the data" -\tb := RTGrapher new. - -\tds := RTData new. -\tds interaction fixedPopupText: [ :row | row value at: 12 ]. -\tds dotShape ellipse -\t\tcolor: (Color blue alpha: 0.3); -\t\tsize: [ :row | (row at: 11) / 5 ]. -\tds points: data. -\tds connectColor: Color blue. -\tds y: [ :r | r at: 10 ]. -\tds highlightIf: [ :row | (row at: 10) > 100 ] using: [ :row | row third year ]. -\tb add: ds. - -\tb axisX noLabel; numberOfTicks: tab values size. -\tb axisY noDecimal. -\tb -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @183, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Double charting: distribution of US population over 18', - #body : 'tab := RTTabTable new input: \'http://agilevisualization.com/AgileVisualization/census.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumnsAsInteger: #(\'POPESTIMATE2013\' \'POPEST18PLUS2013\'). - -\tb := RTDoubleBarBuilder new. -\tb pointName: [ :row | row at: (tab indexOfName: \'NAME\') ]. -\t"Remove the first line, the sum" -\tb points: tab values allButFirst. -\tb bottomValue: [ :row | ((row at: (tab indexOfName: \'POPESTIMATE2013\')) / 1000) asInteger ] -\t\ttitled: \'Pop estimate (x 1000)\'. -\tb topValue: [ :row | ((row at: (tab indexOfName: \'POPEST18PLUS2013\')) / 1000) asInteger] -\t\ttitled: \'Pop +18 estimate (x 1000)\'. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @183, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Multiple graphs', - #body : 'b := RTGrapher new. -\tnumberOfDataSets := 5. - -\tcolorNormalizer := RTMultiLinearColorForIdentity new -\t\t\t\t\t\tobjects: (1 to: numberOfDataSets). -\t1 to: numberOfDataSets do: [ :i | -\t\tds := RTData new. -\t\tds noDot. -\t\tds points: ((1 to: 500) collect: [ :ii | 50 atRandom - 25 ]) cumsum. -\t\tds connectColor: (colorNormalizer rtValue: i). -\t\tb add: ds. -\t]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @183, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Timeline', - #body : 'data := #( -\t\t#(WP1 0 4) #(WP2 4 8) -\t\t#(WP3 8 12) #(WP4 3 4) -\t\t#(WP4 7 9) #(WP4 10 12) -\t ). -\tb := RTTimeline new. -\ts := RTTimelineSet new. -\ts objects: data. -\ts lineIdentifier: #first. -\ts start: #second. -\ts end: #third. -\tb add: s. -\tb axisX -\t\tnoDecimal; -\t\ttitle: \'Month\'; -\t\tnumberOfLabels: 12. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Integration with OpenStreetMap', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Example 1', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"City geographical positions obtained from Wikipedia" -\tparis := 48.8567 @ 2.3508. -\tnewyork := 40.7127 @ -74.0059. -\tlondon := 51.507222@ -0.1275. -\t -\t"Some arbitrary data" -\tdata := -\t\t{ { paris . #(10 5 10 3 10 6 8) } . -\t\t\t{ london . #(5 3 3 -5 ) } . -\t\t\t{ newyork . #(5 -2 10 15 -10) } }. -\t -\tdata do: [ :tupple | -\t\t\t| grapher dataSet | -\t\t\tgrapher := RTGrapher new. -\t\t\tgrapher extent: 150 @ 100. -\t\t\tdataSet := RTData new. -\t\t\tdataSet points: tupple second. -\t\t\tdataSet barShape width: 10; color: Color red. -\t\t\tgrapher add: dataSet. -\t\t\tgrapher build. - -\t\t\tbarElements := grapher view elements. -\t\t\tv addAll: barElements. -\t\t\tbarElements translateTo: (map latLonToRoassal: tupple first) ]. -\t -\tv canvas camera translateTo: (map latLonToRoassal: paris). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 0.3. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @203, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Example 2', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"Place to set the data and center the camera" -\tlondon := 51.507222@ -0.1275. - -\t"Some arbitrary data" -\tdata := ((1 to: 500) collect: [ :i | 50 atRandom - 25 ]) cumsum. - -\t"We build the graph" -\tb := RTGrapher new. -\tb extent: 100@30. -\td := RTData new. -\td noDot. -\td connectColor: Color red. -\td points: data. - -\tb add: d. -\tb axisY -\t\tlabelFontHeight: 6; -\t\tcolor: Color red; -\t title: \'Sale\'. - -\tb axisX color: Color red; noTick; title: \'country\'. -\tb build. -\telementsAndEdges := b view elements, b view edges. - -\t"We create a white background" -\twhiteBackground := (RTRoundedBox new color: Color white trans; borderRadius: 10) element. -\tv add: whiteBackground. -\tv addAll: elementsAndEdges. -\tRTNest new on: whiteBackground nest: elementsAndEdges. -\twhiteBackground translateTo: (map latLonToRoassal: london). - -\tv canvas camera translateTo: (map latLonToRoassal: london). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 1.5. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @203, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @164, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @153, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Basic interation', - #body : 'Before going deeper into data we need some basic operation with the environment, -about three basic operations: - - - Doing: ie executing instructions also called messages. - - Printing: Seeing the result of executing messages. - - Inpecting: Going deeper into the objects thare hold and represent data. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Doing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\') -" - -ProfStef openPharoZenWorkspace - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @217, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @220 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Printing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @217, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @226 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Inspecting', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @217, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @232 - ], - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @56, - GrafoscopioNode { - #header : 'Representing data: Basic Types', - #key : '', - #body : Text { - #string : 'Basic types are ways or represeting information inside this system. See nodes inside for more details', - #runs : RunArray { - #runs : [ - 101 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Numbers', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @245, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : Text { - #string : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #runs : RunArray { - #runs : [ - 586 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : @221, - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @223, - #parent : @255, - #level : 2, - #links : @225 - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : @227, - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @229, - #parent : @255, - #level : 2, - #links : @231 - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @234, - #parent : @255, - #level : 2, - #links : @236 - }, - @249, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @271, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -olors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @310, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] ifFound: - ifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @319, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @255, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : Text { - #string : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #runs : RunArray { - #runs : [ - 1142 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : Text { - #string : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #runs : RunArray { - #runs : [ - 1406 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : Text { - #string : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #runs : RunArray { - #runs : [ - 719 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @255, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @375, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @441 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @427, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @444 - } - ], - #parent : @424, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @448, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @448, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @448, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @448, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @424, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @464, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @424, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @421, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @403, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @375, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @478, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @478, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @478, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @478, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @475, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @505, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @520, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @520, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @520, - #level : 3 - } - ], - #parent : @517, - #level : 3 - } - ], - #parent : @514, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @529, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @529, - #level : 3 - } - ], - #parent : @514, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @508, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @508, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @345, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @503, - @506, - @537, - @540 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @547, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @547, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @547, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @546, - #parent : @514, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @593, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @593, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @559, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @345, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @545, - @547, - @550, - @553, - @556, - @565, - @568, - @571, - @574, - @577, - @580, - @583, - @586, - @589, - @593, - @596, - @599, - @603, - @606, - @609 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @624, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @624, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @624, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @621, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @637, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @637, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @621, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @618, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @651, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @651, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @651, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @651, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @666, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @666, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @651, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @648, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @618, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @615, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @345, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @345, - @348, - @357, - @366, - @255, - @264, - @268, - @269, - @270, - @249, - @246, - GrafoscopioNode { - #header : 'Characters', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -"You can find which is the ASCII number for a character" - -$@ charCode. - -"There are some character that are not printable" - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"If you see gliberish is because some display issue" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Strings', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Symbols', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @249, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Dynamics Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @249, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @271, - @274, - @278, - @282, - @285, - @288, - @291, - @294, - @297, - @301, - @304, - @307, - @310, - @312, - @316, - @319, - @322, - @325, - @328, - @331, - @334, - @337, - @341, - @375, - @378, - @381, - @384, - @387, - @390, - @393, - @396, - @399, - @403, - @406, - @409, - @412, - @415, - @418, - @421, - @424, - @427, - @429, - @432, - @435, - @438, - @441, - @444, - @448, - @451, - @454, - @457, - @460, - @464, - @467, - @475, - @478, - @481, - @484, - @487, - @490, - @495, - @499, - @503, - @506, - @537, - @540, - @545, - @547, - @550, - @553, - @556, - @565, - @568, - @571, - @574, - @577, - @580, - @583, - @586, - @589, - @593, - @596, - @599, - @603, - @606, - @609, - @615, - @618, - @621, - @624, - @627, - @630, - @633, - @637, - @640, - @643, - @648, - @651, - @654, - @657, - @660, - @663, - @666, - @669, - @672 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @681, - @685, - @690, - @695, - @700 - ], - #parent : @59, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @238, - @246, - @681, - @685, - @690, - @695, - @700 - ], - #links : @706 - }, - GrafoscopioNode { - #header : 'Processing data', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Messages', - #key : '', - #body : 'Los mensajes son la forma en que los objetos se comunican entre sí y en que -nosotros, los humanos, nos comunicamos con el sistema. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Unary', - #headers : OrderedCollection [ ], - #key : '', - #body : '" -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : @717, - #children : @718, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @747, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - @723, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @782, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @794, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @728, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - }, - @728, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @838, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @835, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @903 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @887, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @906 - } - ], - #parent : @884, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @910, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @910, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @910, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @910, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @884, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @926, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @884, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @881, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @863, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @835, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @940, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @940, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @940, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @940, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @937, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @967, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @982, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @982, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @982, - #level : 3 - } - ], - #parent : @979, - #level : 3 - } - ], - #parent : @976, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @991, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @991, - #level : 3 - } - ], - #parent : @976, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @970, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @970, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @820, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @965, - @968, - @999, - @1002 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1008, - #parent : @976, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1042, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1042, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1042, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1055, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1055, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1027, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1021, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @820, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1007, - @1009, - @1012, - @1015, - @1018, - @1027, - @1030, - @1033, - @1036, - @1039, - @1042, - @1045, - @1048, - @1051, - @1055, - @1058, - @1061, - @1065, - @1068, - @1071 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1086, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1086, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1086, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1083, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1099, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1099, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1083, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1080, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1113, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1113, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1113, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1113, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1128, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1128, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1113, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1110, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1080, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1077, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @820, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @820, - @823, - @827, - @831, - @728, - @732, - @736, - @740, - @744, - @747, - @750, - @753, - @756, - @760, - @764, - @768, - @723, - @719, - GrafoscopioNode { - #header : 'Binary', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Keyword', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Priority', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 negated + (3 raisedTo: 2). - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Changing messages priority', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mathematical messages priority ', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cascade messages', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\topen; -\tshow: \'hello\'; -\tcr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @723, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @773, - @776, - @779, - @782, - @785, - @790, - @794, - @797, - @800, - @803, - @806, - @809, - @812, - @816, - @835, - @838, - @841, - @844, - @847, - @850, - @853, - @856, - @859, - @863, - @866, - @869, - @872, - @875, - @878, - @881, - @884, - @887, - @889, - @893, - @897, - @900, - @903, - @906, - @910, - @913, - @916, - @919, - @922, - @926, - @929, - @937, - @940, - @943, - @946, - @949, - @952, - @957, - @961, - @965, - @968, - @999, - @1002, - @1007, - @1009, - @1012, - @1015, - @1018, - @1027, - @1030, - @1033, - @1036, - @1039, - @1042, - @1045, - @1048, - @1051, - @1055, - @1058, - @1061, - @1065, - @1068, - @1071, - @1077, - @1080, - @1083, - @1086, - @1089, - @1092, - @1095, - @1099, - @1102, - @1105, - @1110, - @1113, - @1116, - @1119, - @1122, - @1125, - @1128, - @1131, - @1134 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @1143, - @1148, - @1152, - @1156, - @1160, - @1164 - ], - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @716, - @719, - @1143, - @1148, - @1152, - @1156, - @1160, - @1164, - @1168 - ], - #links : @1173 - }, - GrafoscopioNode { - #header : 'Blocks', - #key : '', - #body : '"For this part a Basic understanding of Basic Types is recommended. -If you have not done that part yet, please go to that subtree and run the code there" -"Ahora hablemos de los bloques. -Piensa en los bloques como una manera de \'congelar\' código que luego podremos ejecutar por demanda, -cuando queramos y/o las condiciones para su ejecución se cumplan. -Los bloques son métodos anónimos, lo cual quiere decir que no es necesario ponerles nombres para invocarlos -(como ocurre con las operaciones sobre objetos que hemos visto hasta el momento) y -pueden pueden ser almacenados en variables. -Los bloques están delimitados por paréntesis cuadrados: []" - -[ProfStef openPharoZenWorkspace]. - -"El bloque anterior no abre el Zen de Pharo, porque el bloque, por omisión, no es ejecutado. -Ahora ejecuta:" - -[ProfStef openPharoZenWorkspace] value. - -"Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Los argumentos, son las variables internas de los bloques, están precedidas por \':\' -y la barra vertical \'|\' separa la parte en que se definen los argumentos, de la parte en que se dice -que hacer con ellos." - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " - -[:x | x/2 asFloat] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -"Podemos tener además bloques que reciban varios argumentos, por ejemplo:" - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1176 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Blocks assignment', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1181 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Conditionals', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1186 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cycles & Iterators', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 1 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : @1192, - #children : @1193, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1217, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1243, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : @1177, - #children : @1178, - #parent : @1198, - #level : 2, - #links : @1180 - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : @1182, - #children : @1183, - #parent : @1198, - #level : 2, - #links : @1185 - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : @1187, - #children : @1188, - #parent : @1198, - #level : 2, - #links : @1190 - }, - @1197, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : Text { - #string : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #runs : RunArray { - #runs : [ - 467 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Buttons example', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Chaning a live running system', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cleaning methods', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exploring objects', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Making your own tutorials', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1280, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1198, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - }, - @1198, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1335, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1332, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @1400 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1384, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @1403 - } - ], - #parent : @1381, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1407, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1407, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1407, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1407, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @1381, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1423, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @1381, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1378, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1360, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1332, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1437, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1437, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1437, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1437, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1434, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @1464, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1479, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1479, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1479, - #level : 3 - } - ], - #parent : @1476, - #level : 3 - } - ], - #parent : @1473, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1488, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1488, - #level : 3 - } - ], - #parent : @1473, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1467, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1467, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1317, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1462, - @1465, - @1496, - @1499 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1505, - #parent : @1473, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1539, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1539, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1539, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1552, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1552, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1524, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1518, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @1317, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1504, - @1506, - @1509, - @1512, - @1515, - @1524, - @1527, - @1530, - @1533, - @1536, - @1539, - @1542, - @1545, - @1548, - @1552, - @1555, - @1558, - @1562, - @1565, - @1568 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1583, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1583, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1583, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1580, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1596, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1596, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1580, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1577, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1610, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1610, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1610, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1610, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1625, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1625, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1610, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1607, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1577, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1574, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1317, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @1317, - @1320, - @1324, - @1328, - @1198, - @1202, - @1206, - @1210, - @1214, - @1217, - @1220, - @1223, - @1226, - @1230, - @1234, - @1238, - @1243, - @1246, - @1250, - @1254, - @1257, - @1260, - @1263, - @1266, - @1269, - @1273, - @1274, - @1275, - @1197, - @1194, - @1276, - @1280, - @1288, - @1292, - @1296, - @1300, - @1304, - @1308, - @1313, - @1332, - @1335, - @1338, - @1341, - @1344, - @1347, - @1350, - @1353, - @1356, - @1360, - @1363, - @1366, - @1369, - @1372, - @1375, - @1378, - @1381, - @1384, - @1386, - @1390, - @1394, - @1397, - @1400, - @1403, - @1407, - @1410, - @1413, - @1416, - @1419, - @1423, - @1426, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1454, - @1458, - @1462, - @1465, - @1496, - @1499, - @1504, - @1506, - @1509, - @1512, - @1515, - @1524, - @1527, - @1530, - @1533, - @1536, - @1539, - @1542, - @1545, - @1548, - @1552, - @1555, - @1558, - @1562, - @1565, - @1568, - @1574, - @1577, - @1580, - @1583, - @1586, - @1589, - @1592, - @1596, - @1599, - @1602, - @1607, - @1610, - @1613, - @1616, - @1619, - @1622, - @1625, - @1628, - @1631 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1191, - @1194 - ], - #links : @1641 - }, - GrafoscopioNode { - #header : 'Colections', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : @1277, - #children : @1278, - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1644 - ], - #links : @1279 - }, - GrafoscopioNode { - #header : 'Optional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : @1286, - #children : @1287, - #parent : @709, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1646, - @1288, - @1292, - @1296, - @1300, - @1304, - @1308 - ], - #links : @1312 - } - ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Saving and sharing your code snippets and notebook via web', - #body : 'Use "Export Playground" functionality for code nodes and share your previos excercises via the Etherpad with your -companions. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Fossil', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Installing', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Windows', - #body : 'To install Fossil on Windows follow these steps: - - - Go to the download page at http://fossil-scm.org/index.html/uv/download.html . - - Choose the binary for Windows. - - Extract those zip in the C:/Windows folder. - - That\'s it. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1662, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1659, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using', - #body : 'Follow the following steps to share your notebooks using Fossil', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Clone a repository the Data Week repository at: ', - #body : 'Clone the Data Week repository at: - -Lets start creating a folder for our repository, this could have any name. In our case we\'ll call it `DataWeek`: - - mkdir -p ~/Documents/DataWeek - cd ~/Documentos/DataWeek - fossil clone http://mutabit.com/repos.fossil/dataweek/ dataweek.fossil - -The general syntax for cloning a repository is: - - fossil clone - -Una vez se halla terminado el clonado del repositorio, saldrá algo como esto: - - Round-trips: 3 Artifacts sent: 0 received: 378 - Clone done, sent: 835 received: 15013550 ip: 45.55.37.99 - Rebuilding repository meta-data... - 100.0% complete... - Extra delta compression... - Vacuuming the database... - project-id: aa9f6e73b4f326e190f15c4a830c0909619bfa42 - server-id: e166198b6fb3e438428986e46077a10f4efae1b9 - admin-user: apple (password is "9fa088") -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Open the repository', - #body : 'Go to the folder where you cloned the repository and open it: - - cd ~/Documents/DataWeek - fossil open dataweek.fossil - -Una vez abierto, veremos una salida como la que está en: - -Artefactos/DataSelfies/data-selfies.ston -Artefactos/SoftwarePublicoColombia/anotaciones.png -Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.md -Artefactos/SoftwarePublicoColombia/carta-lider-iniciativa.pdf - - - -project-name: Dataweek -repository: /home/offray/Documentos/Critinfo/dataweek.fossil -local-root: /home/offray/Documentos/Critinfo/ -config-db: /home/offray/.fossil -project-code: aa9f6e73b4f326e190f15c4a830c0909619bfa42 -checkout: 113749bfda422450b7a2bdb68b8a28b17a690142 2017-10-29 22:46:31 UTC -parent: bddea106fa30df41ee415b9d350a56277995eb5e 2017-10-26 23:04:08 UTC -tags: trunk -comment: Notas para el taller de mañana. (user: offray) -check-ins: 99 - -que corresponde a los archivos y carpetas en dicho repositorio y que remotamente se pueden navegar desde: - -Hemos accedido a una copia de [todos los archivos](http://mutabit.com/repos.fossil/dataweek/dir?ci=tip ), sino de [toda su historia](http://mutabit.com/repos.fossil/dataweek/timeline?n=500&y=all&t=&ms=exact ) - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Introduce variation ', - #body : ' - Create a folder for you under `Participants/`, where `` is any kind of unique indenfier yourself. - It could be `FirstNameLastName`, your social media handler, or others. - - From Grafoscopio, save a modified version of this notebook to the previously created folder. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Register and syncronize', - #body : '- Creamos un usuario en dicho repositorio: - - http://mutabit.com/repos.fossil/dataweek/login - - Nos sincronizamos desde la consola de comandos: - - fossil sync http://@mutabit.com/repos.fossil/dataweek/ - -donde `` es el nombre de usuario que registramos en el paso anterior.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Commit', - #body : ' - Commit to the Fossil repository. - - Browse the repository history, locate your commit and share your notebook with others. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Share your commit', - #body : 'Browse the [repository history](http://mutabit.com/repos.fossil/dataweek/timeline ), locate your commit and share your notebook with others.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Rinse and repeat', - #body : 'Go to the excercises in the previous section. Do the "Using block to modularize code" and -"Add voting results for all deparments" and commit your modifed notebook with these two -solutions added.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1670, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1659, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1656, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using Code Browser + SmalltalkHub', - #body : 'In the previous excercise, we learnt how to share notebooks with the world using Fossil code repositories. -Each notebook is a text file that can be shared & versioned in this way. -But at some point you will want to reify you code in a way that express your understangin about a problem -via models. -When you do that (which is called modelling) in Pharo, you are creating what is called a Specific Domain -Language (or DSL) for that problem. -With the previous excercises, we are ready to create a DSL for the Peace Voting Results in Colombia, with -the help on Code Browser and then we are going to share such DSL using SmalltalkHub, wich is a facility -to share code among Pharo users. -This will be the objective of this section.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1656, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1649, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Modelling data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Data adquiring & manipulation', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Open Movie Data Base', - #body : 'This first exercise will be related with Open Movie Data Base.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1712, - #level : 3, - #links : OrderedCollection [ - '', - 'http://www.omdbapi.com/' - ] - }, - GrafoscopioNode { - #header : 'Líderes amenazados en Colombia', - #body : '| contents data totalHombres totalMujeres b labeledData lb | -"Let\'s get the data" -contents := \'https://tupale.co//milfs/api.php?id=410&tipo=simple\' asUrl retrieveContents. -data := NeoJSONReader fromString: contents. -totalHombres := (data select: [ :item | (item at: \'Sexo\') = \'Hombre\']) size. -totalMujeres := data size - totalHombres. -labeledData := { \'Hombres\' -> totalHombres . \'Mujeres\' -> totalMujeres }. -"Here we build the Pie Graphics" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"Legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Líderes amenazados en Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1712, - #level : 3, - #links : OrderedCollection [ - '', - 'https://tupale.co//milfs/api.php?id=410&tipo=simple', - 'http://ws.stfx.eu/GR43R3BV92KC' - ] - } - ], - #parent : @1709, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'What\'s next', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @59, - #level : 1, - #links : OrderedCollection [ - '' - ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @59, - @62, - @66, - @70, - @146, - @153, - @156, - @159, - @164, - @167, - @171, - @175, - @179, - @183, - @186, - @190, - @194, - @199, - @203, - @206, - @210, - @217, - @220, - @226, - @232, - @56, - @29, - @36, - @40, - @43, - @23, - @16, - GrafoscopioNode { - #header : 'Intermezzo: Sharing notebooks', - #body : 'If the previous exercise was solved properly, you have now something interesting to share -with the world (well, also incomplete or wrong solutions are worthy to share also in a learning -context). -Go to the "Saving and sharing your code snippets and notebook via web > Fossil" node and develop -the proposed activity there to share the notebook with the world. -Don\'t worry, you will be able to come here and continue with this exercises.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Solution', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1730, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using blocks to modularize code', - #body : 'Can you use blocks and basic types to make the code in our pie char example more modular? -The idea is to split the functionality of such example into chunks, and put them inside blocks, -that receive arguments. Which should be such blocks? Which are the block arguments? -Rewrite the example here using the idea of blocks and arguments. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Solution', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1738, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Add voting results for all deparments', - #body : 'Use iterators (see the \'Representing data: Basic Types\' & \'Processing data > Cycles & Iteractors\') -to modify the Two deparments & dummy data example, including now all the data.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Solution', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1746, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - @48, - @52, - @238, - @246, - @681, - @685, - @690, - @695, - @700, - @709, - @716, - @719, - @1143, - @1148, - @1152, - @1156, - @1160, - @1164, - @1176, - @1181, - @1186, - @1191, - @1194, - @1644, - @1646, - @1288, - @1292, - @1296, - @1300, - @1304, - @1308, - @1649, - @1656, - @1659, - @1662, - @1665, - @1670, - @1673, - @1677, - @1681, - @1685, - @1689, - @1693, - @1697, - @1703, - @1709, - @1712, - @1715, - @1719, - @1725 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - @1730, - @1738, - @1746 - ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @13, - @16, - @1730, - @1738, - @1746 - ], - #links : @1756 - }, - @16, - @19, - @1730, - @1733, - @1738, - @1741, - @1746, - @1749, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : '', - #tags : @1654, - #children : @1655, - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1759, - @1656, - @1659, - @1662, - @1665, - @1670, - @1673, - @1677, - @1681, - @1685, - @1689, - @1693, - @1697, - @1703 - ], - #links : @1708 - }, - @1656, - @1659, - @1662, - @1665, - @1670, - @1673, - @1677, - @1681, - @1685, - @1689, - @1693, - @1697, - @1703 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @13, - @1759 -] DELETED Participantes/ValerieCV/Notebook1.ston Index: Participantes/ValerieCV/Notebook1.ston ================================================================== --- Participantes/ValerieCV/Notebook1.ston +++ Participantes/ValerieCV/Notebook1.ston @@ -1,9834 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Introduction', - #body : 'This booklet presents a set of techniques to work with data, that are useful of Data Activism. -We consider data mostly as a non-neutral human construct and we think that a more critical -code+data literacy is needed to deal and build a common world that is, increasingly, mediated -by data and code. -Who is visible in this coming world, which voices are heard, and if we can create a plural participation -in such world will depend on such critical literacy. - -The work you\'re reading is opinionated, consequently. -It presents a set of tools, devices and techniques, that has been developed in our local community, at -HackBo, but try to become part of a wider conversation and nurtures from global communities. -This is also a work in progress, and because we take a "local first" approach, you will see that -this document is in "Spanglish", with the idea of having a full English translation in the future, -but starting from localized content originally Spanish or translated/wrote for/from Spanish speaking -communities. -If you\'re a native English speaker, any help is welcomed. -See the Community Guidelines in the Grafoscopio Manual, to see how to offer and ask for help. - -This document is made with Grafoscopio. Good familiarity with it is adviced. You can see more about -Grafoscopio at: - -This book is heavily based on Agile Visualization, and is covered by the same license. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : '%metadata', - #body : '| metadata | -metadata := -{ -\'title\' -> \'Live coding for Data Activism\'. -\'author\' -> \'Offray Vladimir Luna Cárdenas\'. -\'date\' -> Date today. -\'shortTitle\' -> \'Data Activism\'. -\'showOnHelp\' -> true. -} asOrderedDictionary. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Drawing with data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A first data draw', - #body : 'Drawing with data is esentialy about taking data, applying a visual form to it -and presenting it with a particular layout given account of possible patterns. -Lets start with this simple example', - #tags : OrderedCollection [ - '' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Drawing the first 20 numbers', - #body : ' -"Lets define our data model" -data := 1 to: 20. -"Now define the form that we\'ll apply to that data" -shape := (RTBox new size: 30) + RTLabel. -"Now create a set of visual elements using that basic fomr on our data" -elements := shape elementsOn: data. -"Lets define the view, where the data will be displayed" -view := RTView new. -"And lets add all visual elements to our view" -view addAll: elements. -"Now define the layout to our visual elements" -RTGridLayout on: elements. -"Now lets display our view" -view ', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @15, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Other data visualization examples', - #body : 'The following examples are taken from the Agile Visualizatio book. -They follow the same logic of the first data draw example, and are a short glimpse of what you -can do with this platform. -We\'re going to learn how to use it in detail here, so don\'t worry if details escape to you in this quick overview. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A tree of numbers', - #body : 'b := RTMondrian new. -b shape label. -b nodes: (1 to: 100). -b edges connectFrom: [ :i | i // 2 ]. -b layout cluster. -b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Visualizing the user desktop', - #body : 'path := FileLocator desktop asFileReference. -allFilesUnderPath := path allChildren. -b := RTMondrian new. -b shape circle -\tcolor: Color gray trans; -\tif: [ :aFile | aFile path basename endsWith: \'.pdf\' ] color: Color red trans. -b nodes: allFilesUnderPath. -b edges connectFrom: #parent. -b normalizer -\tnormalizeSize: #size min: 10 max: 150 using: #sqrt. -b layout tre. -b -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Geographical CSV data', - #body : '\ttab := RTTabTable new input: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(2 3 4 5). -\ttab convertColumnsAsFloat: #(2 3 4 5). - -\tb := RTMapLocationBuilder new. -\tb shape circle -\t\tsize: [ :m | 2 raisedTo: (m - 1) ]; -\t\tcolor: (Color red alpha: 0.3). -\ttab values do: [ :row | b addPoint: row second @ row third value: row fifth ]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Seism activity over time', - #body : '\ttab := RTTabTable new -\t\t\tinput: \'http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_month.csv\' asUrl retrieveContents -\t\t\tusingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumn: 1 to: [ :s | (DateAndTime fromString: s) julianDayNumber ]. -\ttab convertColumnsAsFloat: #(5). - -\tv := RTView new. -\tes := RTEllipse elementsOn: tab values. -\tv addAll: es. -\tes @ RTPopup. - -\tRTMetricNormalizer new -\t\telements: es; -\t\tnormalizeColor: #fifth using: { Color orange . Color red }; -\t\talphaColor: 0.3; -\t\tnormalizeX: #first min: 0 max: 600; -\t\tnormalizeSize: #fifth min: 0 max: 80 using: [ :mag | 2 raisedTo: (mag - 1) ]. -\t\t -\tes @ (RTLabeled new text: [ :row | row fifth > 6 ifTrue: [ row fifth ] ifFalse: [ \'\' ] ]). -\tv @ RTDraggableView. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Charting', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ploting: Ebola fatalities', - #body : '"Preparing the data" -\ttab := RTTabTable new input: \'http://agilevisualization.com/Ebola2.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab replaceEmptyValuesWith: \'0\' inColumns: #(10 11). -\ttab convertColumnsAsInteger: #(10 11). -\ttab convertColumnsAsDateAndTime: #(3 4). -\tdata := tab values reversed. - -\t"Charting the data" -\tb := RTGrapher new. - -\tds := RTData new. -\tds interaction fixedPopupText: [ :row | row value at: 12 ]. -\tds dotShape ellipse -\t\tcolor: (Color blue alpha: 0.3); -\t\tsize: [ :row | (row at: 11) / 5 ]. -\tds points: data. -\tds connectColor: Color blue. -\tds y: [ :r | r at: 10 ]. -\tds highlightIf: [ :row | (row at: 10) > 100 ] using: [ :row | row third year ]. -\tb add: ds. - -\tb axisX noLabel; numberOfTicks: tab values size. -\tb axisY noDecimal. -\tb -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Double charting: distribution of US population over 18', - #body : 'tab := RTTabTable new input: \'http://agilevisualization.com/AgileVisualization/census.csv\' asUrl retrieveContents usingDelimiter: $,. -\ttab removeFirstRow. -\ttab convertColumnsAsInteger: #(\'POPESTIMATE2013\' \'POPEST18PLUS2013\'). - -\tb := RTDoubleBarBuilder new. -\tb pointName: [ :row | row at: (tab indexOfName: \'NAME\') ]. -\t"Remove the first line, the sum" -\tb points: tab values allButFirst. -\tb bottomValue: [ :row | ((row at: (tab indexOfName: \'POPESTIMATE2013\')) / 1000) asInteger ] -\t\ttitled: \'Pop estimate (x 1000)\'. -\tb topValue: [ :row | ((row at: (tab indexOfName: \'POPEST18PLUS2013\')) / 1000) asInteger] -\t\ttitled: \'Pop +18 estimate (x 1000)\'. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Multiple graphs', - #body : 'b := RTGrapher new. -\tnumberOfDataSets := 5. - -\tcolorNormalizer := RTMultiLinearColorForIdentity new -\t\t\t\t\t\tobjects: (1 to: numberOfDataSets). -\t1 to: numberOfDataSets do: [ :i | -\t\tds := RTData new. -\t\tds noDot. -\t\tds points: ((1 to: 500) collect: [ :ii | 50 atRandom - 25 ]) cumsum. -\t\tds connectColor: (colorNormalizer rtValue: i). -\t\tb add: ds. -\t]. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @42, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Timeline', - #body : 'data := #( -\t\t#(WP1 0 4) #(WP2 4 8) -\t\t#(WP3 8 12) #(WP4 3 4) -\t\t#(WP4 7 9) #(WP4 10 12) -\t ). -\tb := RTTimeline new. -\ts := RTTimelineSet new. -\ts objects: data. -\ts lineIdentifier: #first. -\ts start: #second. -\ts end: #third. -\tb add: s. -\tb axisX -\t\tnoDecimal; -\t\ttitle: \'Month\'; -\t\tnumberOfLabels: 12. -\tb -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Integration with OpenStreetMap', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Example 1', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"City geographical positions obtained from Wikipedia" -\tparis := 48.8567 @ 2.3508. -\tnewyork := 40.7127 @ -74.0059. -\tlondon := 51.507222@ -0.1275. -\t -\t"Some arbitrary data" -\tdata := -\t\t{ { paris . #(10 5 10 3 10 6 8) } . -\t\t\t{ london . #(5 3 3 -5 ) } . -\t\t\t{ newyork . #(5 -2 10 15 -10) } }. -\t -\tdata do: [ :tupple | -\t\t\t| grapher dataSet | -\t\t\tgrapher := RTGrapher new. -\t\t\tgrapher extent: 150 @ 100. -\t\t\tdataSet := RTData new. -\t\t\tdataSet points: tupple second. -\t\t\tdataSet barShape width: 10; color: Color red. -\t\t\tgrapher add: dataSet. -\t\t\tgrapher build. - -\t\t\tbarElements := grapher view elements. -\t\t\tv addAll: barElements. -\t\t\tbarElements translateTo: (map latLonToRoassal: tupple first) ]. -\t -\tv canvas camera translateTo: (map latLonToRoassal: paris). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 0.3. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Example 2', - #body : 'v := RTView new. -\tv @ RTDraggableView. -\tmap := RTOSM new. -\tv add: map element. - -\t"Place to set the data and center the camera" -\tlondon := 51.507222@ -0.1275. - -\t"Some arbitrary data" -\tdata := ((1 to: 500) collect: [ :i | 50 atRandom - 25 ]) cumsum. - -\t"We build the graph" -\tb := RTGrapher new. -\tb extent: 100@30. -\td := RTData new. -\td noDot. -\td connectColor: Color red. -\td points: data. - -\tb add: d. -\tb axisY -\t\tlabelFontHeight: 6; -\t\tcolor: Color red; -\t title: \'Sale\'. - -\tb axisX color: Color red; noTick; title: \'country\'. -\tb build. -\telementsAndEdges := b view elements, b view edges. - -\t"We create a white background" -\twhiteBackground := (RTRoundedBox new color: Color white trans; borderRadius: 10) element. -\tv add: whiteBackground. -\tv addAll: elementsAndEdges. -\tRTNest new on: whiteBackground nest: elementsAndEdges. -\twhiteBackground translateTo: (map latLonToRoassal: london). - -\tv canvas camera translateTo: (map latLonToRoassal: london). -\tv canvas camera noInitializationWhenOpen. -\tv canvas camera scale: 1.5. -\tv -\t', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @62, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @23, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @12, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @15, - @18, - @23, - @26, - @30, - @34, - @38, - @42, - @45, - @49, - @53, - @58, - @62, - @65, - @69, - GrafoscopioNode { - #header : 'Basic interation', - #body : 'Before going deeper into data we need some basic operation with the environment, -about three basic operations: - - - Doing: ie executing instructions also called messages. - - Printing: Seeing the result of executing messages. - - Inpecting: Going deeper into the objects thare hold and represent data. - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Doing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\') -" - -ProfStef openPharoZenWorkspace - - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @79 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Printing', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @85 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Inspecting', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @76, - #level : 3, - #nodesInPreorder : OrderedCollection [ - @91 - ], - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @79, - @85, - @91, - GrafoscopioNode { - #header : 'Desconstructing a practical example', - #body : 'We\'re going to start with our first practical example. -The idea is to get data from an online source, clean it a little bit, and make a simple graph. -From there, we\'re going to deconstruct the example and the properties of mensages, -and some objects, wich simple but powerful conceptual model behind Pharo.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peace voting in Colombia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Totals', - #body : '| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstructing the example :-)', - #body : '"Here we\'re going step by step in the previous example showing its parts and where you -can get more information about the operations and concepts that we used." -"Lets define the variables that we\'re going to use" -| tab rawData labeledData b lb | -"Geting the data" -rawData := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_consolidado.csv\' asUrl retrieveContents. -tab := RTTabTable new input: rawData usingDelimiter: $,. -labeledData := { \'No\' -> ((tab values at: 2) at: 11) asNumber .\'Si\' -> ((tab values at: 2) at: 9) asNumber }. -"Here we build the pie" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -b. -"And add the legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Resultados del plebiscito por la Paz Colombia 2016\'. -lb build. -^ b - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/C519QKLYZY56' - ] - }, - GrafoscopioNode { - #header : 'Totals by deparments (states)', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Two deparments & dummy data', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: #(25 29) title: \'Dummy Data 1\'. -b add: #(30 33) title: \'Dummy Data 2\'. -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @111, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exercises', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Add two deparments', - #body : '"Modify the \'Two deparments & dummy data\' previous example to add two more deparments to the graphic"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Answer Valerie', - #body : '| address rawData tab b yes1 no1 yes2 no2 location1 location2 | -address := \'http://viz.datasketch.co/beta/custom/datasketch/data/plebiscito/votacion_plebiscito_2016_deptos.csv\'. -rawData := address asUrl retrieveContents. -tab := RTTable new input: rawData usingDelimiter: $,. -yes1 := ((tab values at: 2) at: 9) asNumber. -no1 := ((tab values at: 2) at: 11) asNumber. -location1 := (tab values at:2) at: 1. -yes2 := ((tab values at: 3) at: 9) asNumber. -no2 := ((tab values at: 3) at: 11) asNumber. -location2 := (tab values at:3) at: 1. -yes3 := ((tab values at:5) at: 9) asNumber. -no3 := ((tab values at:5) at: 11) asNumber. -location3 := (tab values at:5) at: 1. -yes4 :=((tab values at:17) at: 9) asNumber. -no4 :=((tab values at:17) at: 11) asNumber. -location4 := (tab values at:2) at: 1. -b := RTStackBarPlot new. -b vertical. -b interaction popupText. -b colorPalette colors: (Array with: Color yellow with: Color red). -b add: { yes1 . no1 } title: location1. -b add: { yes2 . no2 } title: location2. -b add: { yes3 . no3 } title: location3. -b add: { yes4 . no4 } title: location4. - -b addLegend: #(\'sí\' \'no\'). -b barWidth: 40 height: 260. -b addLabelToBars: [ :assoc | (assoc key / b totalSum * 100) asInteger asString , \'%\' ] if: [ :assoc | assoc key > 5 ] color: Color black. -b build. -^ b view -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @122, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/A1S1N7G2DVVU', - 'http://ws.stfx.eu/3HOBOGAK5GUO', - 'http://ws.stfx.eu/I0OWO9RDVKTB', - 'http://ws.stfx.eu/IAUS1V2KO8M6' - ] - } - ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Using blocks to modularize code', - #body : '"Can you use blocks and basic types to make the code in our pie char example more modular? -The idea is to split the functionality of such example into chunks, and put them inside blocks, -that receive arguments. Which should be such blocks? Which are the block arguments? -Rewrite the example here using the idea of blocks and arguments. -"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Add voting results at all deparments', - #body : '"Use iterators (see the \'Representing data: Basic Types\' & \'Processing data > Cycles & Iteractors\') -to modify the Two deparments & dummy data example, including now all the data."', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @119, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Composing two visualizations', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Raw data link', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @100, - #level : 3, - #links : OrderedCollection [ - '', - 'https://www.datasketch.co/es/p/los-datos-ocultos-de-la-registraduria' - ] - } - ], - #parent : @97, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @100, - @103, - @107, - @111, - @114, - @119, - @122, - @125, - @130, - @134, - @139, - @143, - GrafoscopioNode { - #header : 'Publishing and Sharing our work', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Saving your code to the web', - #body : 'Use "Export Playground" functionality for code nodes and share your previos excercises via the Etherpad with your -companions. - -Use Fossil to: - - - Clone the Data Week repository at: - - Open the repository - - Create a folder for you under `Participants/`, where `` is any kind of unique indenfier yourself. - It could be `FirstNameLastName`, your social media handler, or others. - - Save a modified version of this notebook to the previously created folder. - - Commit to the Fossil repository. - - Browse the repository history, locate your commit and share your notebook with others. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @149, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @152, - GrafoscopioNode { - #header : 'Representing data: Basic Types', - #key : '', - #body : 'Basic types are ways or represeting information inside this system. See nodes inside for more details', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Numbers', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @159, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : Text { - #string : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #runs : RunArray { - #runs : [ - 586 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : @80, - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @82, - #parent : @169, - #level : 2, - #links : @84 - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : @86, - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @88, - #parent : @169, - #level : 2, - #links : @90 - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : @93, - #parent : @169, - #level : 2, - #links : @95 - }, - @163, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @185, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -olors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @224, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] ifFound: - ifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @233, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @169, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : Text { - #string : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #runs : RunArray { - #runs : [ - 1142 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : Text { - #string : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #runs : RunArray { - #runs : [ - 1406 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : Text { - #string : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #runs : RunArray { - #runs : [ - 719 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @169, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @292, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @355 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @341, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @358 - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @362, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @378, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @338, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @335, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @317, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @289, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @392, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @389, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @419, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @434, - #level : 3 - } - ], - #parent : @431, - #level : 3 - } - ], - #parent : @428, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @443, - #level : 3 - } - ], - #parent : @428, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @422, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @417, - @420, - @451, - @454 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @461, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @460, - #parent : @428, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @494, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @507, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @479, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @473, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @259, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @538, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @551, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @535, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @580, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @565, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @562, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @532, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @529, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @259, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @259, - @262, - @271, - @280, - @169, - @178, - @182, - @183, - @184, - @163, - @160, - GrafoscopioNode { - #header : 'Characters', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -"You can find which is the ASCII number for a character" - -$@ charCode. - -"There are some character that are not printable" - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"If you see gliberish is because some display issue" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Strings', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Symbols', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Dynamics Arrays', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @163, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @185, - @188, - @192, - @196, - @199, - @202, - @205, - @208, - @211, - @215, - @218, - @221, - @224, - @226, - @230, - @233, - @236, - @239, - @242, - @245, - @248, - @251, - @255, - @289, - @292, - @295, - @298, - @301, - @304, - @307, - @310, - @313, - @317, - @320, - @323, - @326, - @329, - @332, - @335, - @338, - @341, - @343, - @346, - @349, - @352, - @355, - @358, - @362, - @365, - @368, - @371, - @374, - @378, - @381, - @389, - @392, - @395, - @398, - @401, - @404, - @409, - @413, - @417, - @420, - @451, - @454, - @459, - @461, - @464, - @467, - @470, - @479, - @482, - @485, - @488, - @491, - @494, - @497, - @500, - @503, - @507, - @510, - @513, - @517, - @520, - @523, - @529, - @532, - @535, - @538, - @541, - @544, - @547, - @551, - @554, - @557, - @562, - @565, - @568, - @571, - @574, - @577, - @580, - @583, - @586 - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @595, - @599, - @604, - @609, - @614 - ], - #parent : @5, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @157, - @160, - @595, - @599, - @604, - @609, - @614 - ], - #links : @620 - }, - @160, - @595, - @599, - @604, - @609, - @614, - GrafoscopioNode { - #header : 'Processing data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Messages', - #key : '', - #body : 'Los mensajes son la forma en que los objetos se comunican entre sí y en que -nosotros, los humanos, nos comunicamos con el sistema. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Unary', - #headers : OrderedCollection [ ], - #key : '', - #body : '" -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : @627, - #children : @628, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @657, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - @633, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @692, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección24', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 25', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 26', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 27', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 29', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @704, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @638, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - @638, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @748, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @813 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @797, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @816 - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @820, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @836, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @794, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @791, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @773, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @745, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @850, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @847, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @877, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @892, - #level : 3 - } - ], - #parent : @889, - #level : 3 - } - ], - #parent : @886, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @901, - #level : 3 - } - ], - #parent : @886, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @880, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @875, - @878, - @909, - @912 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @919, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @918, - #parent : @886, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @952, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @965, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @937, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @931, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @730, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @996, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1009, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @993, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1038, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1023, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1020, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @990, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @987, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @730, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @730, - @733, - @737, - @741, - @638, - @642, - @646, - @650, - @654, - @657, - @660, - @663, - @666, - @670, - @674, - @678, - @633, - @629, - GrafoscopioNode { - #header : 'Binary', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Keyword', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Priority', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 negated + (3 raisedTo: 2). - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Changing messages priority', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mathematical messages priority ', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cascade messages', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\topen; -\tshow: \'hello\'; -\tcr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @633, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @683, - @686, - @689, - @692, - @695, - @700, - @704, - @707, - @710, - @713, - @716, - @719, - @722, - @726, - @745, - @748, - @751, - @754, - @757, - @760, - @763, - @766, - @769, - @773, - @776, - @779, - @782, - @785, - @788, - @791, - @794, - @797, - @799, - @803, - @807, - @810, - @813, - @816, - @820, - @823, - @826, - @829, - @832, - @836, - @839, - @847, - @850, - @853, - @856, - @859, - @862, - @867, - @871, - @875, - @878, - @909, - @912, - @917, - @919, - @922, - @925, - @928, - @937, - @940, - @943, - @946, - @949, - @952, - @955, - @958, - @961, - @965, - @968, - @971, - @975, - @978, - @981, - @987, - @990, - @993, - @996, - @999, - @1002, - @1005, - @1009, - @1012, - @1015, - @1020, - @1023, - @1026, - @1029, - @1032, - @1035, - @1038, - @1041, - @1044 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074 - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1078 - ], - #links : @1083 - }, - GrafoscopioNode { - #header : 'Blocks', - #key : '', - #body : '"For this part a Basic understanding of Basic Types is recommended. -If you have not done that part yet, please go to that subtree and run the code there" -"Ahora hablemos de los bloques. -Piensa en los bloques como una manera de \'congelar\' código que luego podremos ejecutar por demanda, -cuando queramos y/o las condiciones para su ejecución se cumplan. -Los bloques son métodos anónimos, lo cual quiere decir que no es necesario ponerles nombres para invocarlos -(como ocurre con las operaciones sobre objetos que hemos visto hasta el momento) y -pueden pueden ser almacenados en variables. -Los bloques están delimitados por paréntesis cuadrados: []" - -[ProfStef openPharoZenWorkspace]. - -"El bloque anterior no abre el Zen de Pharo, porque el bloque, por omisión, no es ejecutado. -Ahora ejecuta:" - -[ProfStef openPharoZenWorkspace] value. - -"Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Los argumentos, son las variables internas de los bloques, están precedidas por \':\' -y la barra vertical \'|\' separa la parte en que se definen los argumentos, de la parte en que se dice -que hacer con ellos." - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " - -[:x | x/2 asFloat] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -"Podemos tener además bloques que reciban varios argumentos, por ejemplo:" - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1086 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Blocks assignment', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1091 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Conditionals', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1096 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cycles & Iterators', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 1 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '¿Qué hacer cuando necesito tanto el índice como el objeto?', - #key : '', - #body : '"doWithIndex permite trabajar con los objetos y con su índice, es decir tener bloques -que reciben dos argumentos" -| colors | - -colors := OrderedCollection new. -colors -\tadd:(Color r: 1 g: 0 b: 0); -\tadd:(Color r: 0 g: 1 b: 0); -\tyourself. -colors doWithIndex: [ :color :i | Transcript show: \'El color número \', i asString, \' es: \', color name asString; cr ] - -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Lección22: Ciclos e Iteradores', - #key : '', - #body : '"Los ciclos con iteradores de alto nivel sobre las colecciones, implementados como métodos regulares." - -"Ciclos básicos: - to: do: - to:by:do" - -1 to: 10. - -1 to: 15 do: - [:i | Transcript show: i*2 "asString"; cr ]. - -1 to: 20 by: 3 do: [:i | Transcript show: i asString; cr]. - -30 to: 0 by: -2 do: - [:i | Transcript show: i asString; cr]. - -"Ahora ve a la siguiente lección"', - #tags : @1102, - #children : @1103, - #parent : GrafoscopioNode { - #header : 'Introductorio: Professor Stef', - #headers : OrderedCollection [ - 'Tutorial 1', - 'Tutorial 2', - 'Tutorial 3', - 'Tutorial 4', - 'Tutorial 5.', - 'Tutorial 6', - 'Tutorial 7', - 'Tutorial 8', - 'Tutorial 9', - 'Tutorial 10', - 'Tutorial 11' - ], - #key : '', - #body : 'Este tutorial mostrará los aspectos básicos de la sintaxis de Smalltalk y está basado -en el tutorial ProfStef que viene integrado a Pharo, pero convertido en un cuaderno -interactivo de Grafoscopio. -Está separado por lecciones. que vienen numeradas y en ocasiones están agrupadas. -Para ver el contenido particular de una lección se debe hacer click en ella en el árbol -lateral a la izquierda. -Si están agrupadas, se verá un triangulito en el título que las agrupa. -Al hacer click en él, se mostrarán los contenidos del mismo, que podremos seguir -explorando con la misma lógica. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 1: Bienvenida', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Hola!, Soy el profesor Stef. Debes querer que te ayude a aprender -Pharo. Así que vamos a la primera lección: aprender a ejecutar código. -Para ello hay varias opciones: - - Opción 1: Selecciona el texto debajo, o coloca el cursor luego del punto, dale clic - derecho y selecciona \'do it (d)\' - - Opción 2: Haz click en el botón con el ícono de play que aparece justo cerca a la - esquina superior derecha de este panel" - -ProfStef openPharoZenWorkspace - -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 2: Haciendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Excelente! (quise decir Súper)). Acabas de ejecutar una expresión de Pharo. Más precisamente, -enviaste el mensaje \'next\' a PharoTutorial class (¡soy yo!). - -Nota que puedes correr este tutorial nuevamente evaluado \'PharoTutorial go\'. -\'PharoTutorial previous\' te devolverá a la lección anterior. - -También puedes ejecutar \'Do it\' usando el comando de teclado \'ALT d\' (esto cambia de acuerdo a -tu sistema operativo/computador: puede ser \'CMD d\' o \'CTRL d\'). - -Trata de evaluar las siguientes expresiones:" - -Nautilus open. - -SmalltalkImage current aboutThisSystem. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 3: Imprimiendo', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Now you\'re a Do It master ! Let\'s talk about printing. -It\'s a Do It which prints the result next to the expression you\'ve selected. -For example, select the text below, open the menu and click on \'print it (p)\':" - -1 + 2. - -"You\'ve seen the letter \'p\' between parentheses next to \'print it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -Try ALT-p (or CMD-p or CTRL-p) on the following expressions:" - -Date today. - -Time now. - -"The result is selected, so you can erase it using the backspace key. Try it !" - -SmalltalkImage current datedVersion. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 4: Inspeccionando', - #key : '', - #body : '"Now you\'re a Do It and Print It master ! Let\'s talk about inspecting. -It\'s a Do It which opens an Inspector on the result of evaluating the expression you\'ve selected. -The Inspector is a tool that allows you to have a look inside an object. - -For example, select the text below, open the menu and click on \'inspect it (i)\':" - -1 / 2. - -"You\'ve seen the letter \'i\' between parentheses next to \'inspect it\' ? It indicates the -ALT- (or CMD- or CTRL-) shortcut to execute this command. - -You can use Ctrl+g to get and embedded inspector. - -Try ALT-i (or CMD-i or CTRL-i) on the following expressions:" - -DateAndTime today. - -Float pi. - -SystemVersion current. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tipos básicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 5: Números', - #key : '', - #body : '"You now know how to execute Pharo code. - -Now let\'s talk about basic objects. - -1, 2, 100, 2/3 ... are Numbers, and respond to many messages evaluating mathematical expressions. -Evaluate these ones:" - -2. - -20 factorial. - -1000 factorial / 999 factorial. - -(1/3). - -(1/3) + (4/5). - -(1/3) asFloat. - -1 class. - -1 class maxVal class. - -. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 6: Caracteres', - #key : '', - #body : '"Un caracter puede ser instanciado usando el operador $" - -$A. - -$A class. - -$@ charCode. - -Character cr. - -Character space. - -"Puedes imprimir todos los 256 caracteres del código extendido ASCII" - -Character allByteCharacters. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 7: Cadenas', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un String o cadena es una colección de caracteres. -Usa comillas simples para crear un objeto String. -Imprime estas expresiones" - -\'a\' class. - -$a class. - -\'PharoTutorial\'. - -\'PharoTutorial\' size. - -\'abc\' asUppercase. - -\'NO more Hello World!\' reverse. - -\'Adan no calla con nada\' reverse. - -\'Anita lava la tina\' reverse. - -"Puedes acceder a cada caracter usando \'at:mensaje\'" - -\'PharoTutorial\' at:6. - -"La concatenación de String usa el operador coma:" - -[\'PharoTutorial\', \' is cool\']. "versión cambiada" - -\'Pharo tutorial \', \' is cool\', \' when i active the code \'. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 8: Símbolos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Un \'Symbol\' es un String único globalmente. - -Hay uno y solo un Symbol #PharoTutorial. Pueden existir varios objetos String \'PharoTutorial\' - -(Message=retorna \'true\' si los dos objetos son IGUALES)" - -\'PharoTutorial\' asSymbol. - -#PharoTutorial asString. - -"Notra: En mátemáticas hay dos tipos de igualdad: - -x = 3 <- Aginación. A la variable x, le estamos asignando el valor 3. -2 = 3 <- Comparación: dados dos elementos conocidos decir si es o no el mismo. - -Para Smalltalk es: - -x := 3. <- Aginación. -2 = 3 <- Comparación. -a == a <- Comparación fuerte. Se trata del mismo símbolo? -" - -\'PharoTutorial\' = \'PharoTutorial\'. -\'PharoTutorial\' == \'PharoTutorial\'. - -#PharoTutorial = \'PharoTutorial\'. -#PharoTutorial == \'PharoTutorial\'. - -(2 asString) == (2 asString). - - -(2 asString) asSymbol == (2 asString) asSymbol. - - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 9: Arreglos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos son maneras de guardar información información diversa. -Los hay de dos tipos, estáticos y dinámicos. Acá veremos los primeros" -#(1 2 3). - -#( 1 2 3 #(4 5 6)) size. - -#(1 2 4) isEmpty. - -#(1 2 3) first. - -#(\'hello\' \'World\') - at: 2 put: \'Pharo\'; - yourself. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/7FXPZYUXWU54' - ] - }, - GrafoscopioNode { - #header : 'Lección 10: Arreglos dinámicos', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los arreglos dinámicos son creados durante el tiempo de ejecución, es decir que podemos -guardar en ellos cálculos que luego se ejecutarán y determinarán lo que en ellos se guarda" - -{ (2+3).(6*6) }. - -"Comparemos este arreglo estático" - -#( (2+3) (6+6) \'hello\' , \'Stef\') size. - -"con este arreglo dinámico:" - -{ (2+3) . (6+6) . \'hello\' , \'Stef\' } size. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1127, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Mensajes', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Lección 11: Unarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes son enviados a objetos. -Hay tres tipos de mensajes: unary (unarios), binary (binary) y keyword. - -Los mensajes unarios tienen la forma siguiente. - -anObject aMessage - -Tu ya has enviado mensajes unarios. Por ejemplo:" - -1 class. -#b class. - -$b class. - -true not. - -false not. - -Time now. - -Date today. - -Date yesterday. - -Date tomorrow. - -Float pi. - -"Ahora ve a la siguiente lección" -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 12: Binarios', - #headers : OrderedCollection [ ], - #key : '', - #body : '"Los mensajes binarios tienen la forma siguiente: -anObjecto aMessage anotherObject" - -3 + 2. - -25 * 25. - -1 + 1 = 2. - -Date today + 3 weeks. - -Date today + 3 years. - -Date today - 3 years. - -false | false. - - -true | false. - - -true | true. - -false | true. - - -true & true. - -true & false. - -10 @ 100. - -10 <= 12. - - -10 >= 12. - -\'ab\', \'cd\'. - -Date today < Date yesterday. -Date today > Date yesterday. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 13: keywords', - #key : '', - #body : '"Los mensajes \'keyword\' son mensajes con argumentos. Tienen la siguiente forma: - anObject akey: anotherObject akey2: anotherObject2" - - -4 between: 0 and: 5. - -"El mensaje lo que nos dice es: si (4) esta entre (0 y 10) cuya respuesta es verdadero, pero si cambio el valor del 0 por 3, el resultado es falso" - -1 max: 3. - -"determina el valor máximo" - -Color r:1 g:0 b:0. - -"El mensaje es r:g:b: implementado en la clase Color. Note que también puede escribir" - -Color -\tr: 15 -\tg: 99 -\tb: 100. - -\t -"Si quieres usar código RGB usando valores de 0 a 255, como es la práctica usual, deberás -escribirlos como cociente, de forma que sean un número entre 0 y 1. -Por ejemplo r: x/255 g: y/255 b: z/255, donde x,y,z son los valores entre 0 y 255 correspondientes al código que color que queremos obtener." -\t -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 14: Prioridad', - #key : '', - #body : '"los mensajes unarios son ejectuados primero, los mensajes binarios son ejecutados despues -y finalmente las cadenas de mensajes: paréntesis > Unary > Binary > Keywords" - -2 + 3 raisedTo: 2. - -2 + 3 + 4. - - -2 raisedTo: (3 + 2). - -(0@0) class. - -0@0 corner: 100@200. - -(0@0 corner: 100@200) class. - -"entre mensajes de procedencia similar, las expresiones son ejectuadas de izquierda a derecha" - --3 abs negated reciprocal. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 15: Cambiar prioridad de los mensajes', - #key : '', - #body : '"usar parentesis cambia el orden de evaluación de la sentencia, primero se ejecuta la parte interna() -y posteriormente la sentencia" - -(2 + 3) squared. - -(2 raisedTo: 3) + 2. - -(0@0 extent: 100@200) bottomRight. - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 16: Prioridad de los mensajes matemáticos', - #key : '', - #body : '"Las reglas tradicionales de las matematicas NO aplican dentro de Pharo." - -2 * 10 + 2. - -"aqui el mensaje por (*) es enviado a dos, corresponde a 20, entonces 20 reciben el mensaje +, - -recuerde que todos los mensajes simpre siguen una regla precente de izquierda a derecha, sin excepciones." - -2 + 2 * 10. - -2 + (2 * 10). - -(2 * 10) + 2. - -8 - 5 / 2. - -(8 - 5) / 2. - -8-(5/2). - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Lección 17: Mensajes en cascada', - #key : '', - #body : '"; es un operador en cascada. Es usado para enviar mensajes al mismo receptor -Abrir un Transcript (consola):" - -Transcript open. - -"Entonces:" - -Transcript show: \'hola\'. -Transcript cr. -Transcript show: \'Pharo\'. - - -"Es igual a:" - -Transcript -\t show: \'hello\'; -\t cr; -\t show: \'Pharo\'. - -"Intenta ir a la siguiente leccion con un cascada de dos mensjaes \'siguiente\'" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 18: Perdido?', - #key : '', - #body : '"Esta era una lección que venía en el viejo tutorial. Fue mantenida para -preservar la numeración. No es necesario hacer nada" - -"Ahora ve a la siguiente lección"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1153, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 19: Bloques', - #key : '', - #body : '"Los mensajes en cascada son chéveres. Ahora hablemos de los bloques. -Los bloques son métodos anónimos que pueden ser almacenados en variables y ejecutados por demanda. - -Los bloques están delimitados por paréntesis cuadrados: []" - -[Nautilus open]. - -"No abre un Nautilus porque el bloque no es ejecutado. - -Acá hay otro bloque que suma 2 a su argumento (su argumento se llama x):" - -[:x | x+2]. - -"Podemos ejecutar un bloque enviandole mensajes \'value\' " -[:x | x+2] value: 5. - -[Nautilus open] value. - -[:x | x+2] value: 10. - -[:x :y | x - y] value:3 value:5. - -"Ahora ve a la siguiente lección"', - #tags : @1087, - #children : @1088, - #parent : @1108, - #level : 2, - #links : @1090 - }, - GrafoscopioNode { - #header : 'Lección 20: Asignación de Bloques', - #key : '', - #body : '"Los bloques pueden ser asignados a variables y ejecutados después. - -Note que |b| es la declaración de una variable llamada \'b\' y que \':=\' asigna un valor a una variable. - -Selecciona las siguientes tres líneas e imprimelas (Print it)" - -| b | - -[:x | x+2] value: 20. - - -b := [:x | x+2]. - - -b value: 20. - - -"Ahora ve a la siguiente lección"', - #tags : @1092, - #children : @1093, - #parent : @1108, - #level : 2, - #links : @1095 - }, - GrafoscopioNode { - #header : 'Lección 21: Condicionales', - #key : '', - #body : '"Los condicionales son sólo menajes enviados a objetos Boolean (booleanos)" - -1 < 2 - ifTrue: [Transcript show: \'Es cierto\'] - ifFalse: [Transcript show: \'Es falso\']. - -"Aquí el mensajes es ifTrue:ifFalse - -Prueba esto:" - -Transcript open. - -3 > 10 -\tifTrue: [Transcript show: \'Quizás hay un error ....\'] -\tifFalse: [Transcript show: \'No: 3 es menor que 10\']. - -3=3 ifTrue: [ProfStef openPharoZenWorkspace]. - -"Ahora ve a la siguiente lección"', - #tags : @1097, - #children : @1098, - #parent : @1108, - #level : 2, - #links : @1100 - }, - @1107, - GrafoscopioNode { - #header : 'Lección 23: Colecciones', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Opcional', - #key : '', - #body : Text { - #string : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #runs : RunArray { - #runs : [ - 467 - ], - #values : [ - [ ] - ], - #lastIndex : 1, - #lastRun : 1, - #lastOffset : 0 - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Buttons example', - #key : '', - #body : '"Los objetos son instancias de sus clases. Usualmente, enviamos el mensaje #new a una clase -para crear una instancia de esta clase. - -El mensaje #allInstances enviado a una clase, responde un arreglo con todas las instancias de esta clase. - -Por ejemplo, miremos cuántas instancias de SimpleButtonMorph existen, imprimiendo la siguiente línea:" - -SimpleButtonMorph allInstances size. - -"Ahora creemos una nueva instancia de él" - -SimpleButtonMorph new -\tlabel: \'Un agradable botón\'; -\topenCenteredInWorld. - -"Ves el botón centrado en el mundo? La lista de todas las instancias debería contener una instancia más:" - -SimpleButtonMorph allInstances size. - -"Juguemos con él:" - -SimpleButtonMorph allInstances last -\tlabel: \'El Tutorial de Pharo es cheeevere !\'; -\tcolor: Color cyan. -\t -"Borrémosla y pidámosle al sistema limpiar la memoria:" - -SimpleButtonMorph allInstances last delete. -Smalltalk garbageCollect. -SimpleButtonMorph allInstances size. - -"Haz click sobre el botón para ir a la siguiente lección:" - -SimpleButtonMorph new -\tlabel: \'Go to next lesson\'; -\ttarget: [ProfStef next. -\t\t\tSimpleButtonMorph allInstances last delete]; -\tactionSelector: #value; -\topenCenteredInWorld. -\t -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Chaning a live running system', - #key : '', - #body : '"Puedes inspeccionar y cambiar el sistema en tiempo de ejecución. - -Mira el código fuente del método #ifFalse:ifTrue: de la clase True:" - -(True>>#ifFalse:ifTrue:) definition. - -"O sólo su comentario:" - -(True>>#ifFalse:ifTrue:) comment. - -"Acá están todos los métodos que implementa el ProfStef, base de este notebook:" - -ProfStef selectors. - -"Creemos un nuevo método para ir a la siguiente lección:" - -ProfStef class compile:\'goToNextLesson - self next\'. - -"Wow! No puedo esperar a usar mi nuevo método!" - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cleaning methods', - #key : '', - #body : '"Tan chévere, ¿no? Antes de ir más allá, removamos este método:" - -ProfStef respondsTo: #goToNextLesson. - -ProfStef class removeSelector: #goToNextLesson. - -ProfStef respondsTo: #goToNextLesson. - -"Ahora mover hacia adelante" - - - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Exploring objects', - #key : '', - #body : '"Pharo is full of objects. There are windows, text, numbers, dates, colors, points and much more. You can interact with objects in a much more direct way than is possible with other programming languages. - -Every object understands the message \'explore\'. As a result, you get an Explorer window that shows details about the object." - -Date today explore. - -"This shows that the date object consists of a point in time (start) and a duration (one day long)." - -ProfStef explore. - -"You see, class has a lot of objects. Let\'s take a look at my code:" - -ProfStef browse. - -"Ahora ve a la siguiente lección"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lección 28', - #body : '', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Making your own tutorials', - #body : '"This tutorial is done. Enjoy programming with Pharo. - -Don\'t forget to read \'Pharo By Example\' found here: - -\thttp://pharobyexample.org/ - -You can run this tutorial again by evaluating:" - -ProfStef go. - -"Do you want to create your own interactive tutorial with ProfStef? That\'s very easy!! How ? There\'s a ProfStef interactive tutorial for that :D -Just evaluate the following code:" - -ProfStef goOn: HowToMakeYourOwnTutorial - -"But, of course, if you are reading this as a Grafoscopio notebook, you will be able to create -other tutorials as interactive notebooks, like this one in a really easy way. - -Please explore the next parts of this interactive notebook or go to the Grafoscopio page to learn -more about it: - -http://mutabit.com/grafoscopio/ <~ Spanish page -http://mutabit.com/grafoscopio/index.en.html <~ Engish page - -" - -"See you soon !"', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1190, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Cierre', - #body : 'Esta parte del tutorial ha introducido la sintaxis y los elementos básicos del lenguaje. -Las lecciones venideras construyen sobre ello y profundizan en Pharo, aplicándolo a -problemas cada vez más complejos y específicos, desde los cuales esperamos puedas -construir tus propias recontextualizaciones y adaptaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1108, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Presentación', - #key : '', - #body : 'El presente documento tiene como finalidad ayudarte a comprender el funcionamiento básico de Pharo y Grafoscopio. -Se trata de un documento rápido. Para una introducción alternativa a Grafoscopio, su historia, inspiraciones e innovación, -puedes revisar el "Manual de grafoscopio", que está disponible desde el menú ̀Ayuda ̀ en sus distintos formatos. -Tanto este tutorial como el manual están construyéndose y podrían llegar a integrarse luego en un único documento. - -Para navegar este tutorial, si lo estás viendo como un documento interactivo dentro de grafoscopio, -(si no lo estás viendo así, te recomendamos que lo abras para hacer la experiencia más interactiva) -basta con que hagas click en cada uno de los nodos que aparecen en el árbol lateral izquierdo. -Dichos nodos pueden contener otros subnodos lo cual se indica por un pequeño triángulo a la izquierda del nombre -del nodo, que puede estar apuntando a la derecha, para indicar que los contenidos del nodo están comprimidos -o hacia abajo, cuando están extendidos. -Para desplegar o contraer los contenidos de un nodo que agrupa a otros, haces click en dicho triángulo. -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Actos de extrañeza', - #key : '', - #body : 'Este tutorial puede lucir un poco extraño, particularmente si no eres programador. -Esto es porque la primera parte es la adaptación de un tutorial para programadores, -que presupone muchos conceptos familiares con la jerga de la programación. -Si eres un programador notarás que, si bien los conceptos son familiares, las maneras -de implementarlos en Smalltalk son distintas y, de hecho más puros y cercanos a las -ideas originales (allí se inició mucho de la computación actual, aunque lo que tenemos -es distinto de lo que se soño). -No te inquietes, iremos explorando y entendiendo con el tiempo esos artefactos extraños, -y si lees esto como parte de un taller cara a cara (como el Data Week) tendremos tiempo -para conversarlos con mayor detalle. -Además las versiones de este tutorial han cambiado y mejorado con el tiempo, por -lo cual, una versión posterior de grafoscopio y su documentación tendrán mejores -formas de abordar los conceptos. - -Por lo pronto te invitamos a que mires este ejercicio de manera casi que etnográfica: -Te aproximarás a un cultura (la de la programación) desde los artefactos prototípicos -que sus pobladores (los programadores) usan, pero en la medida en que lo vayas haciendo -dicha cultura te parecerá menos extraña y ayudarás a construir artefactos menos ajenos, -que brinden bienvenidas más cálidas y conectadas con personas de culturas más diversas, -como tu.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Agradecimientos', - #key : '', - #body : 'Este tutorial es producto del trabajo realizado durante varios talleres en el hackerspace - [Hackbo](http://hackbo.co) en Bogotá, Colombia, entre ellos: - - - Los talleres de indie web science, ( 1 noviembre de 2014) - - Los talleres del [Data Week](http://mutabit.com/dataweek) y sus eventos preparatorios y posteriores. - -Agradecemos a las personas que asistieron a los talleres y ayudaron con su presencia a probar este material, -Entre ellos: César Augusto Arias, Claudia Baez, Carlos Barreneche, Luis Alejandro Bernal, Fernando Castro, -Felix Gerlof, Florencia Goldsman, Camilo Hurtado, Luis Linares, Offray Luna, Rafael Medida, Gloria Meneses, -Fredy Pulido, Iván Pulido, Sebastian Pulido y David Salvador.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - @1108, - GrafoscopioNode { - #header : 'Intermedio: Scripting', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : '"one liners"', - #key : '', - #body : 'Estos scripts de una sóla línea (o "casi una" :-P) que fueron tomados de -[elegant pharo code](https://medium.com/concerning-pharo/elegant-pharo-code-bb590f0856d0#.6kmkvmvre). -Recomendamos que le des una mirada esta excelente entrada de blog com más detalles e -ir completando los ejemplos que iniciamos acá.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Get the HTML source of a web page', - #key : '', - #body : '\'http://www.pharo.org\' asUrl retrieveContents -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Compute difference in days between two dates', - #key : '', - #body : '(\'2014-070-01\' asDate - \'2013/2/1\' asDate) days', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Decimal digit length of 42!', - #key : '', - #body : '42 factorial decimalDigitLength', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Set up an HTTP server that returns the current timestamp', - #key : '', - #body : '(ZnServer startDefaultOn: 8080) - onRequestRespond: [ :request | - ZnResponse ok: (ZnEntity with: DateAndTime now printString) ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Take an email address and get its respective avatar from Gravatar when exits', - #key : '', - #body : '| email url | -email := \'Gpmeneses@gmail.com\'. -email trimBoth asLowercase. -(MD5 hashMessage: email trimBoth asLowercase) hex. - -url := - \'http://www.gravatar.com/avatar/\', - (MD5 hashMessage: email trimBoth asLowercase) hex, - \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Convert all JPG files in the current directory to PNG format', - #key : '', - #body : '(FileLocator workingDirectory filesMatching: \'*.jpg\') do: [ :each | - (each withExtension: \'png\') writeStreamDo: [ :out | - each readStreamDo: [ :in | - (PNGReadWriter on: out) nextPutImage: - (JPEGReadWriter on: in) nextImage ] ] ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Sum of the primes up to 64', - #key : '', - #body : '(Integer primesUpTo: 64) sum', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1245, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : '"Few liners" ;-)', - #key : '', - #body : 'Estos son otros scripts interesantes que fueron tomados de ejemplos de la comunidad. -Los créditos al autor original están colocados en los comentarios de cada script.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Composición y escalado de morphs (elementos gráficos)', - #key : '', - #body : '"Este script toma una image grande, la coloca como fondo y coloca dos morphs simples, un -círculo y un rectángulo escalados sobre ella. Puede tardar un poco en ejecutarse" -| window pane board background scaler| - -background := AlphaImageMorph withForm: -\t(ZnEasy getJpeg: \'http://i.imgur.com/K1QR9vA.jpg\'). -background lock. - -board := PasteUpMorph new. -board -color: Color gray; -borderWidth: 3; -borderColor: Color black; -extent: 2000@2000; -backgroundMorph: background; -addMorph: (CircleMorph new color: Color cyan; position: 41@23; yourself); -addMorph: (Morph new color: Color orange; position: 1200@1200; yourself). - -scaler := TransformMorph new. -scaler extent: 1000@1000. -scaler scale: 0.5@0.5. -scaler addMorph: board. - -pane := ScrollPane new. -pane scroller addMorph: scaler. - -window := pane openInWindow. -window position: 20@20; extent: 420@420. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Traer un avatar asociado a un correo electrónico', - #key : '', - #body : '| email url | -email := \'gpmeneses@gmail.com\'. -url := \'http://www.gravatar.com/avatar/\', (MD5 hashMessage: email trimBoth asLowercase) hex, \'.jpg\'. -(ZnEasy getJpeg: url) asMorph openInWindow -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Graficar un AST (árbol de sintaxis abstracta)', - #key : '', - #body : '| ast builder | -ast := RBParser parseExpression: \'self foo. super foo\'. - builder := RTMondrian new. - builder shape ellipse size: 15. - builder nodes: ast allChildren. - builder edges connectFrom: #parent. - builder layout tree. - builder', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'OSM: Consultar Nominatim', - #key : '', - #body : '"Thanks to Henrik Nergard" -"Nominatim es un motor de búsqueda para OpenStreetMap. -Para mayor información sobre este consultar: - -http://nominatim.openstreetmap.org/ - -Este pequeño script extrae resultados de Nominatim y entrega -un polígo que delimita una zona geográfica, reconocida por un nombre, -por ejemplo \'Teusaquillo\',en Bogotá -" - -| baseURL query settings result entries | - -query := UIManager default request: \'Find location for\' . - -baseURL := \'http://nominatim.openstreetmap.org/search/\'. -settings := \'?format=jsonv2&limit=10\'. - -result := MCFileTreeJsonParser parse: (baseURL , query asString, settings) asZnUrl retrieveContents. - -(result collect: [ :dct | -\t(dct at: \'display_name\') -> -\t\t((dct at: \'lat\') asNumber @ (dct at: \'lon\') asNumber) -]) inspect .', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Lista de las capitales del mundo', - #key : '', - #body : '"Thanks to Hernán Morales Durand" -((NeoJSONReader fromString: ( - ZnEasy - get: \'http://api.geonames.org/countryInfoJSON\' - username: \'demo\' - password: \'\') contents) at: #geonames) collect: [ : d | d at: #capital ]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Jugando un poco con Open Movie Database', - #key : '', - #body : 'Veremos cómo consultar la base de datos de Open -Movie Data Base y extraer datos particulares. - -Los ejemplos acá están basados en variaciones de -código provisto por Hernan Morales Durand.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Afiche de tu película favorita', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplos', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Blade Runner', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Blade Runner\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Back to the future', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Back to the future\'; - get; - contents)) at: #Poster)) -', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Ghost in the Shell', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'ghost in the shell\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Good will hunting', - #key : '', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Good will hunting\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Magnolia', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Magnolia\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6IAL3JKJRYBU' - ], - #output : @1310 - }, - GrafoscopioNode { - #header : 'Life Is Beautiful', - #body : '(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: \'Life Is Beautiful\'; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1294, - #level : 5, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/L27MW66U41R3' - ], - #output : @1313 - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo el ejemplo', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Película con variable', - #key : '', - #body : '| aTitle | - -aTitle := \'Fight club\'. - -(ZnEasy getJpeg: ((NeoJSONReader fromString: - (ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents)) at: #Poster)) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con bloques para contenidos traer el JSON)', - #key : '', - #body : '| getJSONString temp myDict | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -temp := getJSONString value: \'Magnolia\'. -temp. -myDict := NeoJSONReader fromString: temp. -"myDict at: #Director." - -ZnEasy getJpeg: (myDict at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/N002L3K1ZU80' - ] - }, - GrafoscopioNode { - #header : 'Usando dos bloques', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'Fight club\'. - -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. - - -ZnEasy getJpeg:((movieInfoFromJSONString value: jsonDataString) at: #Poster) -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Con llaves para diferentes atributos de la peli', - #key : '', - #body : '| getJSONString movieInfoFromJSONString jsonDataString movieInfoForKey getPoster | - -getJSONString := [ :aTitle | ZnClient new - url: \'http://www.omdbapi.com/\'; - queryAt: \'t\' put: aTitle; - get; - contents]. - -jsonDataString := getJSONString value: \'E.T.\'. -movieInfoFromJSONString := [ :aJSONString | NeoJSONReader fromString: aJSONString]. -movieInfoForKey := [ :aKey | (movieInfoFromJSONString value: jsonDataString) at: aKey ]. -movieInfoForKey value: #Actors. -getPoster := [:key | ZnEasy getJpeg:(movieInfoForKey value: key)] value: #Poster -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1317, - #level : 6, - #links : OrderedCollection [ ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Trivia', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'And the oscar winner is...', - #body : '| o i | -o := #[76 97 32 76 97 32 76 97 110 100] asString asText. -i := GTInspector openOn: o. -[ 1 second wait. -o - addAttribute: TextEmphasis struckOut; - append: #[77 111 111 110 108 105 103 104 116] asString. -i model update ] fork. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1333, - #level : 6, - #links : OrderedCollection [ - '', - 'http://ws.stfx.eu/6MEJ55EXLSOA' - ] - } - ], - #parent : @1291, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1288, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1270, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1242, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'CInemania: Creando el primer paquete', - #key : '', - #body : 'Acá tomaremos el ejemplo anterior de Open Movie Data Base y lo convertiremos en una aplicación. -Esto nos permitirá entender la lógica con la que eso se hace y "leer" la forma en que otras aplicaciones -están hechas.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Los de Offray', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Crear un nuevo paquete', - #key : '', - #body : '"Esta es la ventana que nos pide el nombre de un paquete que estamos agregando al sistema" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/create-new-package.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Paquete recien creado', - #key : '', - #body : '"Una vez hallamos creado el paquete cinemanía veremos lo siguiente:" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/new-package-created.png\' - -"Este es el paquete vacio, aún sin ningún objeto en particular"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: por llenar', - #key : '', - #body : '"Recien se crea una clase, aparece un símbolo de admiración al lado izquierdo -de su nombre. Si hacemos click en el botón \'Comments\' podremos indicar el propósito de dicha -clase, como se muestra en la siguiente pantalla" -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments.png\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Comentarios de una clase: llenándolos (dirty)', - #key : '', - #body : '"Reemplazamos la plantilla de comentarios que se nos da por omisión, por alguna descripción de lo que hace el paquete. -Veremos que la esquina superior derecha está resaltada, lo que indica que el comentario aún no se ha salvado, -como muestra esta pantalla" - -ZnEasy getPng: \'http://mutabit.com/repos.fossil/grafoscopio/doc/tip/Docs/Es/Tutoriales/Cinemania/add-comments-filled.png\' - -"y luego salvamos usando Comand S (Mac), Ctrl S (Windows, Gnu/Linux) o el menú"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1347, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1344, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Nix: Instalación de software', - #key : '', - #body : 'En ocasiones el software que tenemos instalado en nuestra máquina es insuficiente para -realizar la tareas que queremos. -En ese caso, apelamos a sistemas de instalación de paquetes y existen distintos que son -multiplataforma ([Zero Install]( )) o específicos de ciertas plataformas. -Por ejemplo, en plataformas Gnu/Linux contamos con sistemas como `apt-get` o `pacman` -para gestionar la instalación de software. -Sin embargo, dichos gestores de instalación de software son específicos de una distribución -y sus derivados ( ̀apt-get ̀ funciona para Debian y Ubuntu, ̀pacman ̀ para Arch y Mnajaro) y -en ocasiones queremos instalar software que no está disponible en nuestra distribución -o que es inconpatible con las versiones actuales de lo que tenemos instalado -(particularmente para las que manejas ramas, como Debian y sus derivados) o queremos -abstraer el proceso para que no depende de una variante particular de Linux, entre las más -de 300 distribuciones disponibles (ver [Distro Watch]()). -En dichos casos, un gestor de paquetes como Nix nos brinda una alternativa para -despreocuparnos de la distribución subyacente funcionando sobre distintas variantes del -sistema Unix, incluidos Gnu/Linux, Solaris y Mac. - -Para mayor información ver: - - - [https://nixos.org/nix/manual/](https://nixos.org/nix/manual/ ). - - [NixOS](https://nixos.org/ ): The Purely Functional Linux Distribution. Una distribución basada en este gestor de paquetes. - - [About NixOS](https://nixos.org/nixos/about.html )', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Fossil: Colaboración y control de versiones minimalista.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Mustache: automatizando la creación de HTML', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : OrderedCollection [ - 'text' - ], - #children : @1374, - #parent : GrafoscopioNode { - #header : 'twitter.com', - #key : '', - #body : 'Twitter: La más popular red social de microblogging, basada en comunicación vía -mensajes de un límite de hasta 140 caracteres', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 4 - }, - GrafoscopioNode { - #header : 'Cargar soporte Pecha Kucha', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1389, - #level : 3 - } - ], - #parent : @1386, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Básico', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - }, - GrafoscopioNode { - #header : 'Cargar mensajes', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| aMessagesFile | -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -TPMessages new splitMessagesByTypeFrom: aMessagesFile. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1398, - #level : 3 - } - ], - #parent : @1383, - #level : 2 - } - ], - #level : 1 - }, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Crear con moustache el archivo de data selfies', - #key : '', - #body : '| workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'TwitterDataSelfies\'.. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> \'offrayLC\'. - \'page_title\' -> \'Mi data selfie de Twitter\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\'. -\t\'month\' -> \'2013_02.png\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (context at: #screen_name) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'http://ws.stfx.eu/1N9FKAUI2UI0', - #key : '', - #body : '| profile workingFolder moustacheTplFile templateContent context rendered targetFile tempStream | - -profile := TwitterProfileOverview new -\tscreenName: \'LuLinGar\'. - -"Ubicación de la plantilla en el sistema de archivos" -workingFolder := FileLocator root / \'media\' / \'hackbo\' / \'memoluis\' / \'dataweek\' / \'repo-dataselfies\'. -moustacheTplFile := (workingFolder / \'templates\' / \'index.html\') asFileReference. - -"Leer el template como string" -templateContent := moustacheTplFile contents asString. - -"Estos datos de contexto deben ser llenados desde Twitter" -context := { - \'screen_name\' -> (profile screenName). - \'page_title\' -> \'Mi data selfie\'. - \'bio_message\' -> \'Esto viene de Twitter\'. - \'url_link\' -> \'http://algo.com\' } asDictionary. - -"Procesar la plantilla con los datos de contexto" -rendered := (MustacheTemplate on: templateContent) value: context. - -"Guardar el contenido renderizado en un archivo" -targetFile := (workingFolder / \'profiles\' / (profile screenName) / \'index.html\') asFileReference. -tempStream := targetFile writeStream. -tempStream nextPutAll: rendered. -tempStream close. -', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1377, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1372, - @1375, - @1406, - @1409 - ], - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : '', - #tags : '', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Minitutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'zeroflag\' project: \'Teapot\'; - configuration; - loadStable.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello World', - #key : '', - #body : 'Teapot on - GET: \'/welcome\' -> \'Hello World!\'; - start. - -"Do it and view at: http://localhost:1701/welcome"', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Hello User', - #key : '', - #body : 'Teapot on - GET: \'/hi\' -> \'Bonjour!\'; - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]; -start', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1416, - #level : 4, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : GrafoscopioNode { - #header : 'Teapot: constructor minimalista de aplicaciones web', - #key : '', - #body : Text { - #string : '', - #runs : RunArray { - #runs : [ ], - #values : [ ] - } - }, - #tags : '', - #children : @1415, - #parent : @1383, - #level : 2 - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Tealight', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalación', - #key : '', - #body : 'Metacello new - repository: \'github://astares/Tealight/repository\'; - baseline: \'Tealight\'; - load ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Acceder a un Teapot por omisión', - #key : '', - #body : 'TLWebserver teapot', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Definir una ruta para una instancia de Teapot', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi\' -> \'HelloWorld\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Hola usuario', - #key : '', - #body : 'TLWebserver teapot - GET: \'/hi/\' -> [:req | \'Hello \', (req at: #user)]', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Transformadores de respuestas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'A json', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/jsonlist\' -> #(1 2 3 4); output: #json', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'A texto plano', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/textoplano\' -> \'Esto es texto plano\'; output: #text', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Descargas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/descargas\' -> [\'/tmp/prueba.txt\' asFileReference readStream]; output: #stream', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1449, - #level : 5, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Plantillas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Instalar soporte Mustache', - #key : '', - #body : 'Gofer it - smalltalkhubUser: \'NorbertHartl\' project: \'Mustache\'; - configuration; - loadStable', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Usarlas', - #key : '', - #body : 'TLWebserver teapot -\tGET: \'/saludo\' -> {\'phrase\' -> \'Hello\'. \'name\' -> \'World\'}; -\toutput: (TeaOutput mustacheHtml: \'{{phrase}} {{name}}!\')', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1462, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Manejo de errores', - #key : '', - #body : '3', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Servir archivos locales', - #key : '', - #body : 'Hello World!', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Mirar procesos de Tealight', - #key : '', - #body : 'TLWebserver teapot inspect', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1434, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1428, - #level : 3, - #links : OrderedCollection [ - '', - 'https://github.com/astares/Tealight' - ] - } - ], - #parent : @1227, - #level : 1, - #nodesInPreorder : OrderedCollection [ - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478 - ], - #links : OrderedCollection [ - '' - ] - }, - GrafoscopioNode { - #header : 'Borradores', - #key : '', - #body : 'Acá encontrarás código que aún no está tan maduro como el que has visto hasta el momento. -Son algunos apuntes de diferentes prototipos que están avanzando y algún código que no continuo. -Pharo es un entorno dinámico que mejora continuamente. -Al darte una mirada de estos borradores puedes ver parte del proceso de construcción del cierto -código y vincularte al proceso. - -Futuras versiones de este cuaderno interactivo, tendrán ediciones más maduras y robustas del -código.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización de datos', - #key : '', - #body : 'Acá están recopilados algunos ejemplos que hemos hecho con data scrapping (raspado de datos)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Twitter', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Usando algunos scrappers predefinidos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1: Un perfil', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2: Dos perfiles', - #key : '', - #body : '| perfil1 perfil2 perfiles | - -perfil1 := TwitterProfile new. -perfil2 := TwitterProfile new. - -"Vmmos a crear un nuevo perfil" -perfil1 scrapDataForProfile: \'PetroGustavo\'. -perfil2 scrapDataForProfile: \'JuanManSantos\'. - -perfiles := OrderedCollection new. -perfiles -\tadd: perfil1; -\tadd: perfil2. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 3: Varios perfiles', - #key : '', - #body : '| perfil perfiles misPoliticos | - -misPoliticos := #(\'PetroGustavo\' "Alcalde de Bogotá" -\t\t\t\t\t\t\'JuanManSantos\' "Presidente de Colombia" -\t\t\t\t\t\t\'ginaparody\' "Ministra de educación de Colombia" -\t\t\t\t\t\t\'CFKArgentina\' "Presidenta de Argentina"). - -perfiles := OrderedCollection new. - -misPoliticos do: [:politico | -\t \tperfil := TwitterProfile new. -\t\tperfil scrapDataForProfile: politico. -\t\tperfiles add: perfil.]. -perfiles.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1493, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Deconstruyendo un scrapper.', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Traerse el html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Encontrar algo dentro del html', - #key : '', - #body : '\t| client anUrl aProfileName | -\taProfileName := \'dominemosLasTIC\'. -\tanUrl := \'https://twitter.com/\', aProfileName. -\tclient := ZnClient new. -\tclient get: anUrl.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1506, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1490, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Contratos públicos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Visualización Guía: Treemapping', - #key : '', - #body : 'Para mirar cómo se han realizado los gastos presupuestales, usaremos como visualización guía una que es producida por -la técnica de *treemapping* y que permite explorar cómo una jerarquía está compuesta por partes disyuntas que la conforman -(como en el caso de la división de presupuestos). -Para mayor información sobre dicha técnica véase la -[página de la wikipedia sobre treemapping](https://en.wikipedia.org/wiki/Treemapping)', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Ejemplo 1', - #key : '', - #body : '\t| b | -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\t -\tb from: (1 to: 17) using: [#()]. -\tb weight: #yourself. -\tb build. -\t^ b view', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Ejemplo 2', - #key : '', - #body : 'RTTreeMapExample new exampleNumber', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Integrando datos a la visualización', - #key : '', - #body : '| aFile aCharacter table b | - -aFile := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -aCharacter := $,. -table := RTTabTable new input: aFile contents usingDelimiter: aCharacter. -table valuesOfColumn: 2. - -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color veryLightGray. -\tb from: (2 to: table numberOfRows) using: [#()]. -\tb weight: [:n | (table valuesOfColumn: 2) at: n ]. -\tb build. -\tb view. -table values', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Probando OpenSpending', - #key : '', - #body : '| contratos archivo | - -archivo := (FileLocator documents / \'DataWeek\' / \'query-subtotales-por-segmentos.csv\') asFileReference. -contratos := OpenSpending new. -contratos loadDataFromCSV: archivo usingDelimiter: $,. -contratos', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Treemap con etiquetas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Primera versión', - #key : '', - #body : '| b labels popup | -\tlabels := RTLabel elementsOn: #(\'uno\' \'dos\' \'tres\' \'cuatro\' \'cinco\'). -\tpopup := RTPopup new. -\tpopup text: [:object | labels at: object ]. -\tb := RTTreeMapBuilder new. -\tb shape fillColor: Color random. -\tb from: (1 to: 5) using: [#()]. -\tb weight: [:n | n]. -\tb build. -\tb view elements @ RTLabelled. -\t^ b view.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - }, - GrafoscopioNode { - #header : 'Entendiendo popups dinámicos', - #key : '', - #body : '', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @1535, - #level : 5, - #links : OrderedCollection [ ] - } - ], - #parent : @1520, - #level : 4, - #links : OrderedCollection [ ] - } - ], - #parent : @1517, - #level : 3, - #links : OrderedCollection [ ] - } - ], - #parent : @1487, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1484, - #level : 2, - #links : OrderedCollection [ ] - } - ], - #parent : @1227, - #level : 1, - #links : OrderedCollection [ ] - } - ], - #level : 0, - #nodesInPreorder : OrderedCollection [ - @1227, - @1230, - @1234, - @1238, - @1108, - @1112, - @1116, - @1120, - @1124, - @1127, - @1130, - @1133, - @1136, - @1140, - @1144, - @1148, - @1153, - @1156, - @1160, - @1164, - @1167, - @1170, - @1173, - @1176, - @1179, - @1183, - @1184, - @1185, - @1107, - @1104, - @1186, - @1190, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - @1223, - @1242, - @1245, - @1248, - @1251, - @1254, - @1257, - @1260, - @1263, - @1266, - @1270, - @1273, - @1276, - @1279, - @1282, - @1285, - @1288, - @1291, - @1294, - @1296, - @1300, - @1304, - @1307, - @1310, - @1313, - @1317, - @1320, - @1323, - @1326, - @1329, - @1333, - @1336, - @1344, - @1347, - @1350, - @1353, - @1356, - @1359, - @1364, - @1368, - @1372, - @1375, - @1406, - @1409, - @1414, - @1416, - @1419, - @1422, - @1425, - @1434, - @1437, - @1440, - @1443, - @1446, - @1449, - @1452, - @1455, - @1458, - @1462, - @1465, - @1468, - @1472, - @1475, - @1478, - @1484, - @1487, - @1490, - @1493, - @1496, - @1499, - @1502, - @1506, - @1509, - @1512, - @1517, - @1520, - @1523, - @1526, - @1529, - @1532, - @1535, - @1538, - @1541 - ] - }, - #level : 1, - #links : OrderedCollection [ ] - }, - #level : 2, - #links : OrderedCollection [ - '' - ] - }, - #level : 3, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1101, - @1104 - ], - #links : @1551 - }, - GrafoscopioNode { - #header : 'Colections', - #key : '', - #body : '"El mensaje do: es enviado a una colección de objetos (Array, Set, OrderedCollection), -evaluando el bloque para cada elemento. - -Acá queremos imprimir todos los números sobre el Transcript (una consola)" - -| miColeccion | - -#(11 38 3 -2 10) do: [:each | - Transcript show: each*2; cr]. - -"Some other really nice iterators" - -miColeccion := #(11 38 3 -2 10) collect: [:each | each abs]. - -#(11 38 3 -2 10) collect: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each odd]. - -#(11 38 3 -2 10) select: [:each | each >= 10]. - -#(11 38 3 -2 10) reject: [:each | each > 10]. - -#(11 38 3 -2 10) - do: [:each | Transcript show: each printString] - separatedBy: [Transcript show: \'.\']. - -#(11 38 3 -2 10) detect: [ :el | el = 0 ] -\tifFound: [ Transcript show: \'Encontrado\' ] - \tifNone: [ ^ nil ] - -"Ahora ve a la siguiente lección"', - #tags : @1187, - #children : @1188, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1554 - ], - #links : @1189 - }, - GrafoscopioNode { - #header : 'Optional', - #key : '', - #body : 'Las siguientes lecciones son algo más avanzadas y referidas a elementos de interfaces gráficas -(botones, morphs) y cambios en caliente en los métodos de Smalltalk. -Si bien son importantes, las exploraremos con detalle en otros lugares, así que puedes -pasar al cierre de este tutorial y luego ir a otros nodos como los de -código elegante en Pharo y otros ejemplos minimalistas para terminar en los distintos -proyectos del nodo titulado "Visualización de datos".', - #tags : @1196, - #children : @1197, - #parent : @623, - #level : 2, - #nodesInPreorder : OrderedCollection [ - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218 - ], - #links : @1222 - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @626, - @629, - @1053, - @1058, - @1062, - @1066, - @1070, - @1074, - @1086, - @1091, - @1096, - @1101, - @1104, - @1554, - @1556, - @1198, - @1202, - @1206, - @1210, - @1214, - @1218, - GrafoscopioNode { - #header : 'Modelling data', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Data adquiring & manipulation', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Open Movie Data Base', - #body : 'This first exercise will be related with Open Movie Data Base.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'http://www.omdbapi.com/' - ] - }, - GrafoscopioNode { - #header : 'Líderes amenazados en Colombia', - #body : '| contents data totalHombres totalMujeres b labeledData lb | -"Let\'s get the data" -contents := \'https://tupale.co//milfs/api.php?id=410&tipo=simple\' asUrl retrieveContents. -data := NeoJSONReader fromString: contents. -totalHombres := (data select: [ :item | (item at: \'Sexo\') = \'Hombre\']) size. -totalMujeres := data size - totalHombres. -labeledData := { \'Hombres\' -> totalHombres . \'Mujeres\' -> totalMujeres }. -"Here we build the Pie Graphics" -b := RTPieBuilder new. -b interaction popup. -b objects: labeledData. -b slice: #value. -b labeled. -b normalizer distinctColor. -"Legend" -lb := RTLegendBuilder new. -lb view: b view. -lb addText: \'Líderes amenazados en Colombia 2016\'. -lb build. -^ b', - #tags : OrderedCollection [ - 'código' - ], - #children : OrderedCollection [ ], - #parent : @1562, - #level : 3, - #links : OrderedCollection [ - '', - 'https://tupale.co//milfs/api.php?id=410&tipo=simple', - 'http://ws.stfx.eu/GR43R3BV92KC' - ] - } - ], - #parent : @1559, - #level : 2, - #links : OrderedCollection [ - '' - ] - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @1562, - @1565, - @1569, - GrafoscopioNode { - #header : 'What\'s next', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - } - ] - }, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @8, - @12, - @76, - @97, - @149, - @157, - @623, - @1559, - @1575 -] DELETED Participantes/intro.md Index: Participantes/intro.md ================================================================== --- Participantes/intro.md +++ Participantes/intro.md @@ -1,13 +0,0 @@ -# Participantes - -Esta carpeta contiene una copia de las libretas interactivas de algunos de -los participantes en distintas ediciones de los talleres y hackatones realizadas, -principalmente en el formato de Data Weeks y Data Rodas. -Fue una idea desarrollada a finales de 2017, en la medida en que la metodología, -temáticas y tecnologías detrás de estas experiencias se hacía más madura. -Otras formas de memoria son los etherpads que creamos en cada edición de los -Data Weeks y Data Rodas y que están referenciados en la portada del repositorio -del cual este documento hace parte (ver ). - -La intensión es ir reconstruyendo esta memoria a partir de documentos interactivos -en Grafoscopio. DELETED css/layouts/pricing-old-ie.css Index: css/layouts/pricing-old-ie.css ================================================================== --- css/layouts/pricing-old-ie.css +++ css/layouts/pricing-old-ie.css @@ -1,227 +0,0 @@ -/* - * -- BASE STYLES -- - * Most of these are inherited from Base, but I want to change a few. - */ - -body { - color: #526066; -} - -h2, -h3 { - letter-spacing: 0.25em; - text-transform: uppercase; - font-weight: 600; -} - -p { - line-height: 1.6em; -} - -/* - * -- Layout Styles -- - */ - -.l-content { - margin: 0 auto; -} - -.l-box { - padding: 0.5em 2em; -} - -/* - * -- MENU STYLES -- - * Make the menu have a very faint box-shadow. - */ - -.pure-menu { - box-shadow: 0 1px 1px rgba(0,0,0, 0.10); -} - -/* - * -- BANNER -- - * The top banner with the headings. By using a combination - * of `display: table;` and `display: table-cell;`, we can - * vertically center the text. - */ - -.banner { - background: transparent url('http://24.media.tumblr.com/ccb268832580ac12951828a1c179de69/tumblr_mo2xbk8JUK1st5lhmo1_1280.jpg') 0 0 no-repeat fixed; - text-align: center; - background-size: cover; - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://24.media.tumblr.com/ccb268832580ac12951828a1c179de69/tumblr_mo2xbk8JUK1st5lhmo1_1280.jpg', sizingMethod='scale'); - height: 200px; - width: 100%; - margin-bottom: 3em; - display: table; -} - -.banner-head { - display: table-cell; - vertical-align: middle; - margin-bottom: 0; - font-size: 2em; - color: white; - font-weight: 500; - text-shadow: 0 1px 1px black; -} - -/* - * -- PRICING TABLE WRAPPER -- - * This element wraps up all the pricing table elements - */ - -.pricing-tables, -.information { - max-width: 980px; - margin: 0 auto; -} - -.pricing-tables { - margin-bottom: 3.125em; - text-align: center; -} - -/* - * -- PRICING TABLE -- - * Every pricing table has the .pricing-table class - */ - -.pricing-table { - border: 1px solid #ddd; - margin: 0 0.5em 2em; - padding: 0 0 3em; -} - -/* - * -- PRICING TABLE HEADER COLORS -- - * Choose a different color based on the type of pricing table. - */ - -.pricing-table-free .pricing-table-header { - background: #519251; -} - -.pricing-table-biz .pricing-table-header { - background: #2c4985; -} - -/* - * -- PRICING TABLE HEADER -- - * By default, a header is black/white, and has some styles for its

name. - */ - -.pricing-table-header { - background: #111; - color: #fff; -} - -.pricing-table-header h2 { - margin: 0; - padding-top: 2em; - font-size: 1em; - font-weight: normal; -} - -/* - * -- PRICING TABLE PRICE -- - * Styles for the price and the corresponding per month - */ - -.pricing-table-price { - font-size: 6em; - margin: 0.2em 0 0; - font-weight: 100; -} - -.pricing-table-price span { - display: block; - text-transform: uppercase; - font-size: 0.2em; - padding-bottom: 2em; - font-weight: 400; - color: rgba(255, 255, 255, 0.5); - *color: #fff; -} - -/* - * -- PRICING TABLE LIST -- - * Each pricing table has a
    which is denoted by the .pricing-table-list class - */ - -.pricing-table-list { - list-style-type: none; - margin: 0; - padding: 0; - text-align: center; -} - -/* - * -- PRICING TABLE LIST ELEMENTS -- - * Styles for the individual list elements within each pricing table - */ - -.pricing-table-list li { - padding: 0.8em 0; - background: #f7f7f7; - border-bottom: 1px solid #e7e7e7; -} - -/* - * -- PRICING TABLE BUTTON -- - * Styles for the "Choose" button at the bottom of a pricing table. - * This inherits from Pure Button. - */ - -.button-choose { - border: 1px solid #ccc; - background: #fff; - color: #333; - border-radius: 2em; - font-weight: bold; - position: relative; - bottom: -1.5em; -} - -.information-head { - color: black; - font-weight: 500; -} - -.footer { - background: #111; - color: #888; - text-align: center; -} - -.footer a { - color: #ddd; -} - -/* - * -- TABLET MEDIA QUERIES -- - * On tablets, we want to slightly adjust the size of the banner - * text and add some vertical space between the various pricing tables - */ - -.banner-head { - font-size: 4em; -} - -.pricing-table { - margin-bottom: 0; -} - -/* - * -- PHONE MEDIA QUERIES -- - * On phones, we want to reduce the height and font-size of the banner further - */ - -.banner { - height: 400px; -} - -.banner-head { - font-size: 3em; -} DELETED css/layouts/pricing.css Index: css/layouts/pricing.css ================================================================== --- css/layouts/pricing.css +++ css/layouts/pricing.css @@ -1,226 +0,0 @@ -/* - * -- BASE STYLES -- - * Most of these are inherited from Base, but I want to change a few. - */ -body { - color: #526066; -} - -h2, h3 { - letter-spacing: 0.25em; - text-transform: uppercase; - font-weight: 600; -} - -p { - line-height: 1.6em; -} - - -/* - * -- Layout Styles -- - */ -.l-content { - margin: 0 auto; -} - -.l-box { - padding: 0.5em 2em; -} - -/* - * -- MENU STYLES -- - * Make the menu have a very faint box-shadow. - */ -.pure-menu { - box-shadow: 0 1px 1px rgba(0,0,0, 0.10); -} - - -/* - * -- BANNER -- - * The top banner with the headings. By using a combination - * of `display: table;` and `display: table-cell;`, we can - * vertically center the text. - */ - -.banner { - background: transparent url('../../images/portada.png') 0 0 no-repeat fixed; - text-align: center; - background-size: cover; - filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../images/portada.png', sizingMethod='scale'); - - height: 200px; - width: 100%; - margin-bottom: 3em; - display: table; -} - - .banner-head { - display: table-cell; - vertical-align: middle; - margin-bottom: 0; - font-size: 2em; - color: white; - font-weight: 500; - text-shadow: 0 1px 1px black; - } - - - -/* - * -- PRICING TABLE WRAPPER -- - * This element wraps up all the pricing table elements - */ - .pricing-tables, - .information { - max-width: 980px; - margin: 0 auto; - } -.pricing-tables { - margin-bottom: 3.125em; - text-align: center; -} - -/* - * -- PRICING TABLE -- - * Every pricing table has the .pricing-table class - */ -.pricing-table { - border: 1px solid #ddd; - margin: 0 0.5em 2em; - padding: 0 0 3em; -} - -/* - * -- PRICING TABLE HEADER COLORS -- - * Choose a different color based on the type of pricing table. - */ -.pricing-table-free .pricing-table-header { - background: #519251; -} - -.pricing-table-biz .pricing-table-header { - background: #2c4985; -} - -/* - * -- PRICING TABLE HEADER -- - * By default, a header is black/white, and has some styles for its

    name. - */ -.pricing-table-header { - background: #111; - color: #fff; -} - .pricing-table-header h2 { - margin: 0; - padding-top: 2em; - font-size: 1em; - font-weight: normal; - - } - - -/* - * -- PRICING TABLE PRICE -- - * Styles for the price and the corresponding per month - */ -.pricing-table-price { - font-size: 6em; - margin: 0.2em 0 0; - font-weight: 100; -} - .pricing-table-price span { - display: block; - text-transform: uppercase; - font-size: 0.2em; - padding-bottom: 2em; - font-weight: 400; - color: rgba(255, 255, 255, 0.5); - *color: #fff; - } - - - -/* - * -- PRICING TABLE LIST -- - * Each pricing table has a
      which is denoted by the .pricing-table-list class - */ -.pricing-table-list { - list-style-type: none; - margin: 0; - padding: 0; - text-align: center; -} - - -/* - * -- PRICING TABLE LIST ELEMENTS -- - * Styles for the individual list elements within each pricing table - */ -.pricing-table-list li { - padding: 0.8em 0; - background: #f7f7f7; - border-bottom: 1px solid #e7e7e7; -} - - -/* - * -- PRICING TABLE BUTTON -- - * Styles for the "Choose" button at the bottom of a pricing table. - * This inherits from Pure Button. - */ -.button-choose { - border: 1px solid #ccc; - background: #fff; - color: #333; - border-radius: 2em; - font-weight: bold; - position: relative; - bottom: -1.5em; -} - -.information-head { - color: black; - font-weight: 500; -} - -.footer { - background: #111; - color: #888; - text-align: center; -} - .footer a { - color: #ddd; - } - - - -/* - * -- TABLET MEDIA QUERIES -- - * On tablets, we want to slightly adjust the size of the banner - * text and add some vertical space between the various pricing tables - */ -@media(min-width: 767px) { - - .banner-head { - font-size: 4em; - } - .pricing-table { - margin-bottom: 0; - } - -} - -/* - * -- PHONE MEDIA QUERIES -- - * On phones, we want to reduce the height and font-size of the banner further - */ -@media (min-width: 480px) { - .banner { - height: 400px; - } - .banner-head { - font-size: 3em; - } -} DELETED dataweek.ston Index: dataweek.ston ================================================================== --- dataweek.ston +++ dataweek.ston @@ -1,656 +0,0 @@ -OrderedCollection [ - GrafoscopioNode { - #header : 'Description', - #key : '', - #body : 'This is a hackathon+workshop about interactive documentation, reproducible research and data activism / visualization, where participants learn how to work and connect symbolic (code) and graphical ( visualization) representations of data. It is a workshop because is oriented towards learning by doing and is a hackathon because is oriented towards prototyping and releasing. The objective is to approach to the building, understanding and improvement of a shared world, mediated by data.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : GrafoscopioNode { - #header : 'Arbol principal', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : @1, - #level : 0, - #nodesInPreorder : OrderedCollection [ - @5, - @2, - GrafoscopioNode { - #header : 'Introductorio', - #key : '', - #body : 'All memories of the data week can be found in the source code repository at: http://mutabit.com/repos.fossil/dataweek/ - -This are some notes with more structure, result of the previous editions of the Data Week. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Day 1: Intro', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Welcome to the space/event', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - }, - GrafoscopioNode { - #header : 'Participants presentation', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - }, - GrafoscopioNode { - #header : 'Introduction to Etherpad as a collaborative note taking tool', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - }, - GrafoscopioNode { - #header : 'Presenting the data week & Grafoscopio', - #key : '', - #body : '- A critical approach to "big data" and data literacy.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - }, - GrafoscopioNode { - #header : 'Alternative and parallel histories of computing: unix fathers, dynabook children and their legacy', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - }, - GrafoscopioNode { - #header : 'Installing Grafoscopio', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @11, - #level : 3 - } - ], - #parent : @8, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 2: Basic tutorial', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Playgrounds', - #key : '', - #body : 'ATENCIÓN: Una versión anterior que explica los playgrounds, publicada en we la puedes -leer desde: - -http://mutabit.com/repos.fossil/grafoscopio/wiki?name=playground - -Los *playgrounds* son espacios interactivos para la escritura de código. -Sirven para prototipar y lanzar scripts, que o bien son desechados luego, -o se incorporan al sistema porque su código termina en unos objetos, o -como nodos en cuadernos interactivos de Grafoscopio (como el tutorial -de Pharo que quizás has usado ya).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Abrirlos', - #key : '', - #body : 'Para abrir los playgrounds existen 3 métodos: - - - Haciendo click en cualquier espacio libre (no ocupado por una ventana o una barra) y seleccionando - la opción Playground de dicho menú (llamado el menú del mundo). - - Presionando la combinación de teclas Ctrl + W + O (o Command + W + O en Mac). - - Desde el *docking bar* de Grafoscopio siguiendo la ruta de menú: ̀Launch > Playground ̀. ', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @35, - #level : 4 - }, - GrafoscopioNode { - #header : 'Compartirlos', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @35, - #level : 4 - } - ], - #parent : @32, - #level : 3 - }, - GrafoscopioNode { - #header : 'Open notebooks form url', - #key : '', - #body : ' - is.gd as a recommeded "ethical" shorter. - - Notebook opening.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @32, - #level : 3 - }, - GrafoscopioNode { - #header : 'Updating Grafoscopio', - #key : '', - #body : 'Gofer new -\t\tsmalltalkhubUser: \'Offray\' project: \'Grafoscopio\'; - \t\tpackage: \'Grafoscopio\'; - \tload. -GrafoscopioGUI updateUI.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @32, - #level : 3 - }, - GrafoscopioNode { - #header : 'Realizando el tutorial.', - #key : '', - #body : 'Usando las instrucciones anteriores, abrimos el documento en: - -', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @32, - #level : 3 - }, - GrafoscopioNode { - #header : 'Preguntas / Comentarios', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @32, - #level : 3 - }, - GrafoscopioNode { - #header : 'Pimping Grafoscopio', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Peter\'s file dialog', - #key : '', - #body : 'See https://github.com/peteruhnak/file-dialog for details.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Installation', - #key : '', - #body : 'Metacello new - baseline: \'FileDialog\'; - repository: \'github://peteruhnak/file-dialog/repository\'; - load.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @58, - #level : 5 - }, - GrafoscopioNode { - #header : 'Making it default system wide', - #key : '', - #body : 'FDMorphicUIManager new beDefault', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @58, - #level : 5 - } - ], - #parent : @55, - #level : 4 - } - ], - #parent : @32, - #level : 3 - } - ], - #parent : @8, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 3: Intermedium tutorial, first package & Twitter export', - #key : '', - #body : 'From the intermedium exmaple, we learn how to read JSON. -Now for our first package we use that, to create a block with arguments (i.e: movie name, director, etc) -and then we go from there to the creation of the first package (Cinemania) and -messages with arguments. - -We learn also how to use monticello to synchronize work among the participants. - -From here we start a bridge to the twitter data selfie open project.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @8, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 4', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @8, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 5', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles).', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Breve recuento', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @71, - #level : 3 - }, - GrafoscopioNode { - #header : 'Repositorios de código (continuación)', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ ], - #parent : @71, - #level : 3 - }, - GrafoscopioNode { - #header : 'Leer el hash de un archivo en disco duro', - #key : '', - #body : '50c736b95c5748145fdafde98ee1b5190ed1e9f8', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @71, - #level : 3 - }, - GrafoscopioNode { - #header : 'Navegar el árbol hasta llegar al hash de un archivo', - #key : '', - #body : '50c736b95c5748145fdafde98ee1b5190ed1e9f8', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @71, - #level : 3 - }, - GrafoscopioNode { - #header : 'Obtener el número hash de un archivo particular en un repositorio', - #key : '', - #body : '| dataWeekRepo urlTemp miniBrowser | -dataWeekRepo := FossilRepo new url: \'http://mutabit.com/repos.fossil/dataweek\'. -dataWeekRepo lastHashNumberFor: \'dataweek.ston\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @71, - #level : 3 - } - ], - #parent : @8, - #level : 2 - }, - GrafoscopioNode { - #header : 'Day 6: Twitter Data Selfies part 3 & closure', - #key : '', - #body : 'This part is related with the hackathon open project. -There is no particular agenda and the work is determined by the problem advance (or obstacles). - -We make a wrap up of the event and take suggestions for future events and the growth of the -community.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'El último playground del #DataWeek4', - #key : '', - #body : '| tweetsFile overview ourPalette | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2013_01.js\' ) asFileReference. -ourPalette := { Color orange . Color black . Color red }. -overview := TwitterProfileOverview new. -overview -\tgetAvatarForProfile: \'offrayLC\'; -\tsplitMessagesByTypeFrom: tweetsFile. -overview\t -\ttaggedWheelTweetsSized: 12 -\tretweetsSized: 10 -\tmentionsSized: 14 -\tcoloredWith: ourPalette. -', - #tags : 'código', - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Deconstruyendo el script', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Obtener el avatar', - #key : '', - #body : '| tweetsFile overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2013_01.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tgetAvatarForProfile: \'didtux\'', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @91, - #level : 5 - }, - GrafoscopioNode { - #header : 'Partir los mensajes', - #key : '', - #body : '| tweetsFile overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @91, - #level : 5 - }, - GrafoscopioNode { - #header : 'Dibujando el data selfie', - #key : '', - #body : '| tweetsFile tweetsWords overview | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -overview -\tfrequentTweetedWordsShown: 10 - \tretweetedProfilesShown: 80 -\tmentionedProfilesShown: 70', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @91, - #level : 5 - }, - GrafoscopioNode { - #header : 'Sólo la circunferencia interna', - #key : '', - #body : '| tweetsFile overview ourPalette | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -ourPalette := { Color orange . Color black . Color red }. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -overview avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @91, - #level : 5 - } - ], - #parent : @89, - #level : 4 - }, - GrafoscopioNode { - #header : 'Deconstruyendo el código del Data Selfie', - #key : '', - #body : 'Acá miraremos cómo deconstruir el código que dibuja todo el data selfie a partir del mensaje principal que construye', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Consultas', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Palabras más tuiteadas', - #key : '', - #body : '"This script organizes the twitted words by frecuency" -| tweetsFile overview aWorldAmount | -tweetsFile := (FileLocator documents / \'Grafoscopio/Twitter/data/js/tweets/2016_05f.js\' ) asFileReference. -overview := TwitterProfileOverview new. -overview -\tsplitMessagesByTypeFrom: tweetsFile. -aWorldAmount := 19. -overview messages wordsByFrequencyInTweets. -overview messages wordsByFrequencyInTweetsUpTo: 10', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @105, - #level : 6 - } - ], - #parent : @102, - #level : 5 - } - ], - #parent : @89, - #level : 4 - } - ], - #parent : @86, - #level : 3 - } - ], - #parent : @8, - #level : 2 - } - ], - #parent : @5, - #level : 1 - }, - @11, - @14, - @17, - @20, - @23, - @26, - @29, - @32, - @35, - @38, - @41, - @44, - @47, - @49, - @52, - @55, - @58, - @61, - @63, - @65, - @68, - @71, - @74, - @77, - @80, - @82, - @84, - @86, - @89, - @91, - @94, - @96, - @98, - @100, - @102, - @105, - @108, - GrafoscopioNode { - #header : 'Temático', - #key : '', - #body : '', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte para MDL en Seaside', - #key : '', - #body : 'Metacello new - githubUser: \'DuneSt\' project: \'MaterialDesignLite\' commitish: \'development\' path: \'src\'; - baseline: \'MaterialDesignLite\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @110, - #level : 2 - }, - GrafoscopioNode { - #header : 'Micrositio Web', - #key : '', - #body : 'Este nodo explicará como crear un micrositio web para publicar en línea resultados de las -visualizaciones.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Pecha Kucha', - #key : '', - #body : 'Para detalles ver: https://github.com/Pharophile/PechaKucha - -Gracias a Philippe Back por esto.', - #tags : OrderedCollection [ - 'text' - ], - #children : OrderedCollection [ - GrafoscopioNode { - #header : 'Cargar soporte', - #key : '', - #body : 'Metacello new - githubUser: \'Pharophile\' - project: \'PechaKucha\' - commitish: \'master\' - path: \'packages\'; - baseline: \'PechaKucha\'; - onWarningLog; - load', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @118, - #level : 3 - }, - GrafoscopioNode { - #header : 'Iniciar la aplicación', - #key : '', - #body : 'PKApplication declareApplicationAndStartServer.', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @118, - #level : 3 - } - ], - #parent : @115, - #level : 3 - } - ], - #parent : @110, - #level : 2 - }, - GrafoscopioNode { - #header : 'Prototipo Data Selfie', - #key : '', - #body : '"Esto supone que ya se ha descargado y descompreso el archivo de mensajes de Twitter" -| profile aMessagesFile | -profile := TwitterProfileOverview new -\tscreenName: \'offrayLC\'. -profile getAvatar. -aMessagesFile := (FileLocator documents / \'Grafoscopio\' / \'Projects\' / \'DataSelfies\' / \'Twitter\' / \'DataDumps\' / \'offrayLC\' / \'data\' / \'js\' / \'tweets\' /\'2013_02.js\') asFileReference. -profile splitMessagesByTypeFrom: aMessagesFile. -profile avatarWheel ', - #tags : 'código', - #children : OrderedCollection [ ], - #parent : @110, - #level : 2 - } - ], - #parent : @5, - #level : 1, - #links : OrderedCollection [ - '' - ] - }, - @113, - @115, - @118, - @121, - @123, - @125 - ] - }, - #level : 1 - }, - @8, - @110 -] DELETED images/avatars.png Index: images/avatars.png ================================================================== --- images/avatars.png +++ images/avatars.png cannot compute difference between binary files DELETED images/data-env4.png Index: images/data-env4.png ================================================================== --- images/data-env4.png +++ images/data-env4.png cannot compute difference between binary files DELETED images/example-work07.jpg Index: images/example-work07.jpg ================================================================== --- images/example-work07.jpg +++ images/example-work07.jpg cannot compute difference between binary files DELETED images/example-work08.jpg Index: images/example-work08.jpg ================================================================== --- images/example-work08.jpg +++ images/example-work08.jpg cannot compute difference between binary files DELETED images/header-bg.jpg Index: images/header-bg.jpg ================================================================== --- images/header-bg.jpg +++ images/header-bg.jpg cannot compute difference between binary files DELETED images/meds.png Index: images/meds.png ================================================================== --- images/meds.png +++ images/meds.png cannot compute difference between binary files DELETED images/network.png Index: images/network.png ================================================================== --- images/network.png +++ images/network.png cannot compute difference between binary files DELETED images/photo.jpg Index: images/photo.jpg ================================================================== --- images/photo.jpg +++ images/photo.jpg cannot compute difference between binary files DELETED images/portada.png Index: images/portada.png ================================================================== --- images/portada.png +++ images/portada.png cannot compute difference between binary files DELETED images/public-code.png Index: images/public-code.png ================================================================== --- images/public-code.png +++ images/public-code.png cannot compute difference between binary files DELETED images/software-publico.png Index: images/software-publico.png ================================================================== --- images/software-publico.png +++ images/software-publico.png cannot compute difference between binary files DELETED images/time-to-run2.png Index: images/time-to-run2.png ================================================================== --- images/time-to-run2.png +++ images/time-to-run2.png cannot compute difference between binary files DELETED index.html Index: index.html ================================================================== --- index.html +++ index.html @@ -1,334 +0,0 @@ - - - - - - - - - - Data Week: Taller + Hackatón de visualización de datos - - - - - - - - - -
      -
      -
      - -

      Data Week: Taller + Hackatón

      -

      co-creación + visualización + datos abiertos + activismos + herramientas digitales adaptables

      -
      -
      -
      - -
      -
      - -
      -
      -
      -
      - - -
      -
      -

      ¿Qué es el Data Week?

      -
      -
      -
      -

      - Es un taller-hackatón sobre visualización y activismo de datos donde aprendemos a trabajar e interconectar las - representaciones simbólicas (código) y las visuales (visualizaciones) referidas a los datos. - Es un taller porque está orientado al aprendizaje mediante la práctica y el ejemplo y una - hackatón por su caracter intensivo y orientado a prototipos. - La intensión es aproximarse de manera crítica a la construcción, comprensión y mejoramiento de un mundo - compartido mediado por tales datos. -

      -
      -
      -
      -
      -
      - -
      -
      -

      ¿Qué hacemos / aprendemos?

      -
      -
      -
      -

      - Se enseña como usar Grafoscopio, una herramienta flexible y amoldable - para documentación interactiva, visualización y activismo de datos. - Combinamos algo de historia y fundamentación con ejercicios progresivamente más complejos. - Luego abordamos un problema común que nos permitirá mostrar cómo se usa, adapta y extiende Grafoscopio, cuáles son - sus diferencias y valores agregados y, si nos queda tiempo, trataremos problemas diversos, propuestos por los participantes - con sus propios conjuntos de datos. - Elegimos problemas que pueden ser entendidos mejor con visualización de datos y usaremos una aproximación alternativo al - "Big Data", que usa pequeños datos significativos (frictionless data) y sus visualizaciones. - La intensión es que el problema común nos de herramientas y saberes para que luego podamos abordar por nuestra cuenta los - problemas e inquietudes propias, que pueden ser considerados para talleres y eventos venideros. -

      -

      - También se hará extensiva la participación de los asistentes a vincularse a distintas comunidades locales e internacionales - relacionadas con visualización y activismo de datos, herramientas amoldables y datos abiertos, entre otras. -

      -
      -
      -
      -
      -
      - -
      -
      -

      ¿Cuánto tiempo dura?

      -
      -
      - 30 horas, repartidas en dos fines de semana seguidos, de jueves a sábado. - Las 15 horas de cada fin de semana tienen el siguiente horario: -
        -
      • Jueves y viernes de 5:00 PM a 9:00 PM.
      • -
      • Sábado de 2:30 PM a 9:30 PM
      • -
      -
      -
      -

      Fecha y lugar

      -
      -
      - La 10a edición se hará en HackBo, Bogotá, Colombia. -
        -
      • Primera sesión: Jueves 23 Nov a Sábado 25 Nov. 2017
      • -
      • Segunda sesión: Jueves 30 Nov a Sábado 2 Dic. 2017
      • -
      -
      -
      -
      -
      -
      -
      - -
      -
      -

      ¿A quién está dirigido?

      -
      -
      - Hay un total de 10 cupos que se llenaran de acuerdo al orden de recepción - de las inscripciones y si los datos solicitados están bien diligenciados. - Habrá lugares para novatos y expertos. - En la inscripción tendrán prioridad personas que puedan asistir todo el evento, hayan - ayudado con el sostenimiento económico y/o de actividades de espacios comunitarios, - hacker o maker, estudiantes y personas vinculadas al activismo, al conocimiento y los - datos abiertos, el procomún y relacionados. - Si este es tu caso indícanos cómo han sido y dónde podemos encontrar tus aporte, en - el procedimiento de inscripción (abajo). -
      - -
      -
      -
      - -
      -
      -

      ¿Qué traer?

      -
      -
      - Debes traer: -
        -
      • Ganas de aprender y una actitud proactiva y constructiva.
      • -
      • Computador portátil con Windows, Gnu/Linux o Mac.
      • -
      • Inscripción previamente diligenciada y aprobada (mira abajo)
      • -
      - Las bebidas y alimentación corren por cuenta de los asistentes.
      - Es posible que pidamos una donación voluntaria para el sostenimiento del - hackerspace. -
      -
      -
      -
      - -
      -
      -

      El problema / proyecto

      -
      -
      - Trabajaremos sobre el proyecto de la - - Biblioteca Digital de Bogotá, - preguntándonos cómo las publicaciones sobre dichos projectos pueden hacer más públicas y abiertas. - Para esto usaremos algunas técnicas de scraping, anotaciones, control de versiones y visualización de datos, que desarrollamos y empleamos en nuestros prototipos del - Manual de Periodismo de Datos y el - - Portal de Software Público Colombia. -
      -
      - -
      - -
      -
      -
      - -
      -
      -

      Referentes Extra

      -
      -
      -

      - Si puedes, antes del evento dale una mirada a estos enlaces: -

    • Sitio web de Grafoscopio.
    • -
    • Visualising advocacy: - Sitio del libro con varios ejemplos de cómo el activismo (advocacy) puede ser comunicado - más efectivamente mediante visualizaciones.
    • -
    • - The Data Visualisation Catalogue: What do you want to show?
    • -
    • - Beyond Data Literacy: Reinventing Community Engagement and Empowerment in the Age of Data
    • -
    • Information is beautiful: Blog y libros que muestran - varias visualizaciones.
    • -
    • Phratch: Un entorno de programación sencillo que puede servir como - introducción a la manera de pensar con abstracciones y datos.
    • -
    • Agile Visualization: Un libro en línea que explica el motor de - visualización empleado por Grafoscopio.
    • -
    • Memorias de las ediciones anteriores.
    • -

      -
      -
      -
      -
      - -
      -
      -

      Inscripciones

      -
      -
      - - -

      Las inscripciones deben hacerse enviando un correo a - info@mutabit.com con el siguiente formato: - -

    • Tema (subject): Inscripción Data Week 10a edición.
    • -
    • El cuerpo del mensaje debe indicar qué sistema operativo tiene - el computador que se va a llevar.
    • -
    • ¿Cuáles son los intereses respecto al taller? (brevemente).
    • -
    • ¿Puede asistir durante toda la semana?: sí o no y en caso de que no, - en qué horarios sí podría. La intensión es tener un estimado del total - de horas en que nos acompañarían durante el evento. Es importante - (aunque no obligatorio) que consideren asistir ojalá todo el primer día, - pues se darán las bases para el trabajo del resto de la semana. -
    • - - -

      -
      -
      -
      -
      -

      Agradecimientos

      -
      - -
      -

      - Data Week no sería posible sin la ayuda continua de las personas vinculadas - a comunidades y empresas de la cultura y el conocimiento libres y abiertos. - Agradecemos a las personas asistieron previamente a los talleres de - Indie Web Science y Grafoscopio en - HackBo, así como a las comunidades de - Moose, - Roassal, - Pharo y - OpenDataCo - y la empresa - mutabiT. -

      -
      -
      -
      -
      -

      Sinergias

      -
      - -
      -

      EL Data Week ha ocurrido en el contexto de una investigación doctoral en Diseño y Creación, - de la Universidad de Caldas (ediciones 3 a 10), - de las investigación Ciudad de Datos, de la Universidad Javeriana - y la Universidad de Antioquia (ediciones 2 a 4), y la participación de - el CISC + Laboratorio de Ideas y el Colaboratorio MDE (edición 4). -

      -
      -
      -
      - -
      -
      - - - DELETED styles.css Index: styles.css ================================================================== --- styles.css +++ styles.css @@ -1,170 +0,0 @@ -.portfolio-header { - position: relative; - background-image: url(images/header-bg.jpg); -} - -.portfolio-header .mdl-layout__header-row { - padding: 0; - -webkit-justify-content: center; - -ms-flex-pack: center; - justify-content: center; -} - -.mdl-layout__title { - font-size: 14px; - text-align: center; - font-weight: 300; -} - -.is-compact .mdl-layout__title span { - display: none; -} - -.portfolio-logo-row { - min-height: 200px; -} - -.is-compact .portfolio-logo-row { - min-height: auto; -} - -.portfolio-logo { - background: url(images/logo.png) 50% no-repeat; - background-size: cover; - height: 150px; - width: 150px; - margin: auto auto 10px; -} - -.is-compact .portfolio-logo { - height: 50px; - width: 50px; - margin-top: 7px; -} - -.portfolio-navigation-row { - background-color: rgba(0, 0, 0, 0.08); - text-transform: uppercase; - height: 45px; -} - -.portfolio-navigation-row .mdl-navigation { - text-align: center; - max-width: 900px; - width: 100%; -} - -.portfolio-navigation-row .mdl-navigation__link { - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - line-height: 42px; -} - -.portfolio-header .mdl-layout__drawer-button { - background-color: rgba(197, 197, 197, 0.44); -} - -.portfolio-navigation-row .is-active { - position: relative; - font-weight: bold; -} - -.portfolio-navigation-row .is-active:after { - content: ""; - width: 70%; - height: 2px; - display: block; - position: absolute; - bottom: 0; - left: 0; - background-color: rgb(255,64,129); - left: 15%; -} - -.portfolio-card .mdl-card__title { - padding-bottom: 0; -} - -.portfolio-blog-card-full-bg { - background: url(images/example-blog03.jpg) center / cover; -} - -.portfolio-blog-card-event-bg { - background: url(images/example-blog05.jpg) center / cover; -} - -.portfolio-blog-card-strip-bg { - background: url(images/example-blog06.jpg) center / cover; -} - -.portfolio-blog-card-compact .mdl-card__title { - padding-bottom: 0; -} - -.portfolio-blog-card-bg > .mdl-card__actions { - height: 52px; - padding: 16px; - background: rgba(0, 0, 0, 0.2); -} - -img.article-image { - width: 100%; - height: auto; -} - -.portfolio-max-width { - max-width: 900px; - margin: auto; -} - -.portfolio-copy { - max-width: 700px; -} - -.no-padding { - padding: 0; -} - -.no-left-padding{ - padding-left: 0; -} - -.no-bottom-padding { - padding-bottom: 0; -} - -.padding-top { - padding: 10px 0 0; -} - -.portfolio-share-btn { - position: relative; - float: right; - top: -4px; -} - -.demo-card-event > .mdl-card__actions { - -webkit-align-items: center; - -ms-flex-align: center; - align-items: center; - box-sizing: border-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; -} - -.portfolio-contact .mdl-textfield { - width: 100%; -} - -.portfolio-contact form { - max-width: 550px; - margin: auto; -} - -footer { - background-image: url(images/footer-background.png); - background-size: cover; -} -