Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
| Comment: | Trazabilidad: Scripts iniciales para asociar los checksums de las revisiones a los archivos fuentes que crearon los PDFs y otros archivos derivados. |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | trunk |
| Files: | files | file ages | folders |
| SHA1: |
61adb46ab210861b8b3a095ac8c56619 |
| User & Date: | offray 2018-11-16 04:54:18 |
|
2018-11-16
| ||
| 04:54 | Trazabilidad: Scripts iniciales para asociar los checksums de las revisiones a los archivos fuentes que crearon los PDFs y otros archivos derivados. Leaf check-in: 61adb46ab2 user: offray tags: trunk | |
|
2018-10-29
| ||
| 21:27 | Agregando referencias antes de pasar versión editada al Doctorado. check-in: 5662acf706 user: offray tags: trunk | |
Changes to Tesis/Escrito/TextoIntegrado/bibliography.bib.
| ︙ | ︙ | |||
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
url = {http://people.untyped.org/damien.pollet/software/citezen/},
urldate = {2014-10-12},
author = {Pollet, Damien},
note = {00000}
}
@incollection{sharp_chapter_1997,
title = {Chapter 12. {Strings}},
isbn = {0-07-913036-4},
shorttitle = {sbe-strings},
url = {http://stephane.ducasse.free.fr/FreeBooks/ByExample/14%20-%20Chapter%2012%20-%20Strings.pdf},
booktitle = {Smalltalk by {Example}: the {Developer}'s {Guide}},
author = {Sharp, Alex},
year = {1997},
note = {00000}
}
@techreport{pollet_citezen_2009,
title = {Citezen, a nicer bibliography toolkit},
| > > | 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
url = {http://people.untyped.org/damien.pollet/software/citezen/},
urldate = {2014-10-12},
author = {Pollet, Damien},
note = {00000}
}
@incollection{sharp_chapter_1997,
address = {New York},
title = {Chapter 12. {Strings}},
isbn = {0-07-913036-4},
shorttitle = {sbe-strings},
url = {http://stephane.ducasse.free.fr/FreeBooks/ByExample/14%20-%20Chapter%2012%20-%20Strings.pdf},
booktitle = {Smalltalk by {Example}: the {Developer}'s {Guide}},
publisher = {McGraw Hill},
author = {Sharp, Alex},
year = {1997},
note = {00000}
}
@techreport{pollet_citezen_2009,
title = {Citezen, a nicer bibliography toolkit},
|
| ︙ | ︙ | |||
1090 1091 1092 1093 1094 1095 1096 |
url = {http://mutabit.com/repos.fossil/piamed/doc/tip/linea-base-aras-iecas.html},
urldate = {2018-04-17},
author = {Gil Rojas, Yanneth and Luna Cárdenas, Offray Vladimir},
month = aug,
year = {2014}
}
| < < < < < < < < < | 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 |
url = {http://mutabit.com/repos.fossil/piamed/doc/tip/linea-base-aras-iecas.html},
urldate = {2018-04-17},
author = {Gil Rojas, Yanneth and Luna Cárdenas, Offray Vladimir},
month = aug,
year = {2014}
}
@misc{granger_jupyterlab:_2016,
title = {{JupyterLab}: {Building} {Blocks} for {Interactive} {Computing} {\textbar} {SciPy} 2016},
shorttitle = {{JupyterLab}},
url = {https://www.youtube.com/watch?v=Ejh0ftSjk6g},
urldate = {2018-04-18},
author = {Granger, Brian},
year = {2016},
|
| ︙ | ︙ | |||
1713 1714 1715 1716 1717 1718 1719 |
title = {I {Don}'t {Like} {Notebooks} - {Joel} {Grus} - \#{JupyterCon} 2018},
url = {https://docs.google.com/presentation/d/1n2RlMdmv1p25Xy5thJUhkKGvjtV-dkAIsUXP-AL4ffI},
urldate = {2018-10-29},
author = {Grus, Joel},
month = aug,
year = {2018}
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 |
title = {I {Don}'t {Like} {Notebooks} - {Joel} {Grus} - \#{JupyterCon} 2018},
url = {https://docs.google.com/presentation/d/1n2RlMdmv1p25Xy5thJUhkKGvjtV-dkAIsUXP-AL4ffI},
urldate = {2018-10-29},
author = {Grus, Joel},
month = aug,
year = {2018}
}
@book{sharp_smalltalk_1997,
address = {New York},
title = {Smalltalk by example: the developer's guide},
isbn = {978-0-07-913036-5},
shorttitle = {Smalltalk by example},
publisher = {McGraw Hill},
author = {Sharp, Alec},
year = {1997},
keywords = {Smalltalk (Computer program language), VisualWorks}
}
@misc{luna_cardenas_grafoscopio:_2015,
title = {Grafoscopio: {Iceberg} metaphor for writing and data visualization},
shorttitle = {Grafoscopio},
url = {http://mutabit.com/offray/static/blog/output/posts/grafoscopio-idea-and-initial-progress.html},
abstract = {This post describes a project I have been working on in Smalltalk as an alternative way to
approach open/garage/citizen science \& research by bulding a tool for "deep" / emergent data
narratives and v},
language = {es},
urldate = {2018-10-30},
journal = {Palimpsesto, hipertexto, destripa/atrapa musas},
author = {Luna Cárdenas, Offray Vladimir},
month = jan,
year = {2015}
}
@article{colquhoun_publish-or-perish:_2011,
chapter = {Science},
title = {Publish-or-perish: {Peer} review and the corruption of science {\textbar} {David} {Colquhoun}},
issn = {0261-3077},
shorttitle = {Publish-or-perish},
url = {https://www.theguardian.com/science/2011/sep/05/publish-perish-peer-review-science},
abstract = {David Colquhoun: Pressure on scientists to publish has led to a situation where any paper, however bad, can now be printed in a journal that claims to be peer-reviewed},
language = {en-GB},
urldate = {2018-10-30},
journal = {The Guardian},
author = {Colquhoun, David},
month = sep,
year = {2011},
keywords = {Alternative medicine, Controversies, Education, Health, Higher education, Medical research, Peer review and scientific publishing, Science, Science and scepticism, Society}
}
@book{santos_end_2018,
address = {Durham},
title = {The end of the cognitive empire: the coming of age of epistemologies of the {South}},
isbn = {978-1-4780-0000-6 978-1-4780-0015-0},
shorttitle = {The end of the cognitive empire},
publisher = {Duke University Press},
author = {Santos, Boaventura de Sousa},
year = {2018},
keywords = {Developing countries, Knowledge, Sociology of, Social epistemology, Social justice}
}
|
Changes to Tesis/Escrito/TextoIntegrado/dataweek.tex.
| ︙ | ︙ | |||
386 387 388 389 390 391 392 |
suficientemente intensivas para avanzar el el problema.
Una particularidad acá fue el cambio del problema, para adecuarlo a las necesidades percibidas
en la investigación Ciudad de Datos, según uno de los coinvestigadores.
Esto trajo la ventaja de triangular información: ya no estábamos más centrados en los temas de
redes sociales, sino que podíamos poner a circular en ellas información extraida de otros lados,
en este caso del portal de contratación pública, en aras de articularnos con la naciente comunidad
\emph{Open Data Colombia} (OpenDataCo) y el \emph{scrapper} de contratos del portal
| | | 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 |
suficientemente intensivas para avanzar el el problema.
Una particularidad acá fue el cambio del problema, para adecuarlo a las necesidades percibidas
en la investigación Ciudad de Datos, según uno de los coinvestigadores.
Esto trajo la ventaja de triangular información: ya no estábamos más centrados en los temas de
redes sociales, sino que podíamos poner a circular en ellas información extraida de otros lados,
en este caso del portal de contratación pública, en aras de articularnos con la naciente comunidad
\emph{Open Data Colombia} (OpenDataCo) y el \emph{scrapper} de contratos del portal
gubernamental colombiano ``contratos.gov.co''. % (prizbilla-xxx)
Además nos alineaba con otras comunidades como OpenBugets\footnote{\url{http://openbudgets.eu/}},
OpenSpending\footnote{\url{https://openspending.org/}} y algunos proyectos y temáticas de la
Open Knowledge Foundation\footnote{\url{https://discuss.okfn.org/}}.
\begin{figure}[htb]
\includegraphics[width=\linewidth]{./Parte2/open-spending.png}%
\caption[Gasto público]
|
| ︙ | ︙ | |||
1011 1012 1013 1014 1015 1016 1017 |
final de este capítulo.
El encuentro mismo era una forma de participación que permanentemente construía cosificaciones sobre
los aprendizajes y la memoria que se estructuraban progresivamente.
La siguiente parte menciona las formas de cosificación creadas durante los Data Weeks y Data Rodas,
por los participantes, así como los canales de comunicación permanentes.
A los prototipos desarrollados, les damos su lugar particular en el capítulo \ref{prototipos}.
| | | 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 |
final de este capítulo.
El encuentro mismo era una forma de participación que permanentemente construía cosificaciones sobre
los aprendizajes y la memoria que se estructuraban progresivamente.
La siguiente parte menciona las formas de cosificación creadas durante los Data Weeks y Data Rodas,
por los participantes, así como los canales de comunicación permanentes.
A los prototipos desarrollados, les damos su lugar particular en el capítulo \ref{prototipos}.
\section{Espacios virtuales: Pads, Fossil, Lista de correo, Telegram}\label{encuentro-digital}
El software social, en la definición de Tom A. Coates (\citeyear{coates_my_2003,coates_addendum_2005})
es aquel de propicia, extiende y deriva valor de las interacciones sociales.
Este ha sido divido en dos grupos\footnote{La taxonomía entre software social conversacional o dialógico
la encontré en un wiki, cuyos contenidos no puedo recuperar nuevamente.
Si mal no estoy se traba de \url{http://wiki.c2.com/}.
Dicha taxonomía me ha sido útil para encontrar los énfasis en la interacción de un software
|
| ︙ | ︙ | |||
1040 1041 1042 1043 1044 1045 1046 | La documentación juega un papel activo a lo largo de las varias ediciones del Data Week. Para ello se usan varios sistemas de documentación que permitían capturar lo emergente, complementar el encuentro cara a cara, ser resilientes y minimalistas, de modo que era posible para los asistentes de las últimas ediciones, llevarse una copia con la memoria de todos los eventos desde el comienzo, con una infraestructura sencilla pero potente. | | > | | | | | | | 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 |
La documentación juega un papel activo a lo largo de las varias ediciones del Data Week.
Para ello se usan varios sistemas de documentación que permitían capturar lo emergente,
complementar el encuentro cara a cara, ser resilientes y minimalistas, de modo que era
posible para los asistentes de las últimas ediciones, llevarse una copia con la memoria
de todos los eventos desde el comienzo, con una infraestructura sencilla pero potente.
Se emplearon mayoritariamente etherpads\footnote{\url{http://etherpad.org/}} y luego
CodiMD\footnote{\url{https://demo.codimd.org/}}, que son sistemas de escritura colaborativa
de documentos textuales en tiempo real, llamados tambien \emph{pads} a los que se unen los
participantes con sólo compartir un enlace web.
Dichos enlaces, que iniciaban el pad, se compartían empleando un acortador de direcciones
ético, que no rastrea a quienes lo emplean, disponible en \hyperlink{https://is.gd}{is.gd}.
Las memorias se fueron organizando de modo que el primer pad se usaba como una índice para
los otros pads que guardaban la memoria cronológica o temática desarrollada durante cada una
de las sesiones diarias que constituían el Data Week (o Data Roda).
Debido a la reubicación de algunos miembros de la comunidad a países europeos con otros
usos horarios, la documentación empezó a volverse más estructurada, para facilitar así
la participación remota.
Esto hizo que empezáramos a escribir los pads empleando el lenguaje de etiquetamiento
ligero Markdown, de modo que pudiéramos expresar tanto la estructura como la presentación
visual del documento a través de marcas sencillas (etiquetas).
|
| ︙ | ︙ |
Added Tesis/Escrito/TextoIntegrado/dkjson.lua.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 |
-- Module options:
local always_try_using_lpeg = true
local register_global_module_table = false
local global_module_name = 'json'
--[==[
David Kolf's JSON module for Lua 5.1/5.2
Version 2.5
For the documentation see the corresponding readme.txt or visit
<http://dkolf.de/src/dkjson-lua.fsl/>.
You can contact the author by sending an e-mail to 'david' at the
domain 'dkolf.de'.
Copyright (C) 2010-2013 David Heiko Kolf
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
--]==]
-- global dependencies:
local pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset =
pairs, type, tostring, tonumber, getmetatable, setmetatable, rawset
local error, require, pcall, select = error, require, pcall, select
local floor, huge = math.floor, math.huge
local strrep, gsub, strsub, strbyte, strchar, strfind, strlen, strformat =
string.rep, string.gsub, string.sub, string.byte, string.char,
string.find, string.len, string.format
local strmatch = string.match
local concat = table.concat
local json = { version = "dkjson 2.5" }
if register_global_module_table then
_G[global_module_name] = json
end
local _ENV = nil -- blocking globals in Lua 5.2
pcall (function()
-- Enable access to blocked metatables.
-- Don't worry, this module doesn't change anything in them.
local debmeta = require "debug".getmetatable
if debmeta then getmetatable = debmeta end
end)
json.null = setmetatable ({}, {
__tojson = function () return "null" end
})
local function isarray (tbl)
local max, n, arraylen = 0, 0, 0
for k,v in pairs (tbl) do
if k == 'n' and type(v) == 'number' then
arraylen = v
if v > max then
max = v
end
else
if type(k) ~= 'number' or k < 1 or floor(k) ~= k then
return false
end
if k > max then
max = k
end
n = n + 1
end
end
if max > 10 and max > arraylen and max > n * 2 then
return false -- don't create an array with too many holes
end
return true, max
end
local escapecodes = {
["\""] = "\\\"", ["\\"] = "\\\\", ["\b"] = "\\b", ["\f"] = "\\f",
["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t"
}
local function escapeutf8 (uchar)
local value = escapecodes[uchar]
if value then
return value
end
local a, b, c, d = strbyte (uchar, 1, 4)
a, b, c, d = a or 0, b or 0, c or 0, d or 0
if a <= 0x7f then
value = a
elseif 0xc0 <= a and a <= 0xdf and b >= 0x80 then
value = (a - 0xc0) * 0x40 + b - 0x80
elseif 0xe0 <= a and a <= 0xef and b >= 0x80 and c >= 0x80 then
value = ((a - 0xe0) * 0x40 + b - 0x80) * 0x40 + c - 0x80
elseif 0xf0 <= a and a <= 0xf7 and b >= 0x80 and c >= 0x80 and d >= 0x80 then
value = (((a - 0xf0) * 0x40 + b - 0x80) * 0x40 + c - 0x80) * 0x40 + d - 0x80
else
return ""
end
if value <= 0xffff then
return strformat ("\\u%.4x", value)
elseif value <= 0x10ffff then
-- encode as UTF-16 surrogate pair
value = value - 0x10000
local highsur, lowsur = 0xD800 + floor (value/0x400), 0xDC00 + (value % 0x400)
return strformat ("\\u%.4x\\u%.4x", highsur, lowsur)
else
return ""
end
end
local function fsub (str, pattern, repl)
-- gsub always builds a new string in a buffer, even when no match
-- exists. First using find should be more efficient when most strings
-- don't contain the pattern.
if strfind (str, pattern) then
return gsub (str, pattern, repl)
else
return str
end
end
local function quotestring (value)
-- based on the regexp "escapable" in https://github.com/douglascrockford/JSON-js
value = fsub (value, "[%z\1-\31\"\\\127]", escapeutf8)
if strfind (value, "[\194\216\220\225\226\239]") then
value = fsub (value, "\194[\128-\159\173]", escapeutf8)
value = fsub (value, "\216[\128-\132]", escapeutf8)
value = fsub (value, "\220\143", escapeutf8)
value = fsub (value, "\225\158[\180\181]", escapeutf8)
value = fsub (value, "\226\128[\140-\143\168-\175]", escapeutf8)
value = fsub (value, "\226\129[\160-\175]", escapeutf8)
value = fsub (value, "\239\187\191", escapeutf8)
value = fsub (value, "\239\191[\176-\191]", escapeutf8)
end
return "\"" .. value .. "\""
end
json.quotestring = quotestring
local function replace(str, o, n)
local i, j = strfind (str, o, 1, true)
if i then
return strsub(str, 1, i-1) .. n .. strsub(str, j+1, -1)
else
return str
end
end
-- locale independent num2str and str2num functions
local decpoint, numfilter
local function updatedecpoint ()
decpoint = strmatch(tostring(0.5), "([^05+])")
-- build a filter that can be used to remove group separators
numfilter = "[^0-9%-%+eE" .. gsub(decpoint, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0") .. "]+"
end
updatedecpoint()
local function num2str (num)
return replace(fsub(tostring(num), numfilter, ""), decpoint, ".")
end
local function str2num (str)
local num = tonumber(replace(str, ".", decpoint))
if not num then
updatedecpoint()
num = tonumber(replace(str, ".", decpoint))
end
return num
end
local function addnewline2 (level, buffer, buflen)
buffer[buflen+1] = "\n"
buffer[buflen+2] = strrep (" ", level)
buflen = buflen + 2
return buflen
end
function json.addnewline (state)
if state.indent then
state.bufferlen = addnewline2 (state.level or 0,
state.buffer, state.bufferlen or #(state.buffer))
end
end
local encode2 -- forward declaration
local function addpair (key, value, prev, indent, level, buffer, buflen, tables, globalorder, state)
local kt = type (key)
if kt ~= 'string' and kt ~= 'number' then
return nil, "type '" .. kt .. "' is not supported as a key by JSON."
end
if prev then
buflen = buflen + 1
buffer[buflen] = ","
end
if indent then
buflen = addnewline2 (level, buffer, buflen)
end
buffer[buflen+1] = quotestring (key)
buffer[buflen+2] = ":"
return encode2 (value, indent, level, buffer, buflen + 2, tables, globalorder, state)
end
local function appendcustom(res, buffer, state)
local buflen = state.bufferlen
if type (res) == 'string' then
buflen = buflen + 1
buffer[buflen] = res
end
return buflen
end
local function exception(reason, value, state, buffer, buflen, defaultmessage)
defaultmessage = defaultmessage or reason
local handler = state.exception
if not handler then
return nil, defaultmessage
else
state.bufferlen = buflen
local ret, msg = handler (reason, value, state, defaultmessage)
if not ret then return nil, msg or defaultmessage end
return appendcustom(ret, buffer, state)
end
end
function json.encodeexception(reason, value, state, defaultmessage)
return quotestring("<" .. defaultmessage .. ">")
end
encode2 = function (value, indent, level, buffer, buflen, tables, globalorder, state)
local valtype = type (value)
local valmeta = getmetatable (value)
valmeta = type (valmeta) == 'table' and valmeta -- only tables
local valtojson = valmeta and valmeta.__tojson
if valtojson then
if tables[value] then
return exception('reference cycle', value, state, buffer, buflen)
end
tables[value] = true
state.bufferlen = buflen
local ret, msg = valtojson (value, state)
if not ret then return exception('custom encoder failed', value, state, buffer, buflen, msg) end
tables[value] = nil
buflen = appendcustom(ret, buffer, state)
elseif value == nil then
buflen = buflen + 1
buffer[buflen] = "null"
elseif valtype == 'number' then
local s
if value ~= value or value >= huge or -value >= huge then
-- This is the behaviour of the original JSON implementation.
s = "null"
else
s = num2str (value)
end
buflen = buflen + 1
buffer[buflen] = s
elseif valtype == 'boolean' then
buflen = buflen + 1
buffer[buflen] = value and "true" or "false"
elseif valtype == 'string' then
buflen = buflen + 1
buffer[buflen] = quotestring (value)
elseif valtype == 'table' then
if tables[value] then
return exception('reference cycle', value, state, buffer, buflen)
end
tables[value] = true
level = level + 1
local isa, n = isarray (value)
if n == 0 and valmeta and valmeta.__jsontype == 'object' then
isa = false
end
local msg
if isa then -- JSON array
buflen = buflen + 1
buffer[buflen] = "["
for i = 1, n do
buflen, msg = encode2 (value[i], indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end
if i < n then
buflen = buflen + 1
buffer[buflen] = ","
end
end
buflen = buflen + 1
buffer[buflen] = "]"
else -- JSON object
local prev = false
buflen = buflen + 1
buffer[buflen] = "{"
local order = valmeta and valmeta.__jsonorder or globalorder
if order then
local used = {}
n = #order
for i = 1, n do
local k = order[i]
local v = value[k]
if v then
used[k] = true
buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
prev = true -- add a seperator before the next element
end
end
for k,v in pairs (value) do
if not used[k] then
buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end
prev = true -- add a seperator before the next element
end
end
else -- unordered
for k,v in pairs (value) do
buflen, msg = addpair (k, v, prev, indent, level, buffer, buflen, tables, globalorder, state)
if not buflen then return nil, msg end
prev = true -- add a seperator before the next element
end
end
if indent then
buflen = addnewline2 (level - 1, buffer, buflen)
end
buflen = buflen + 1
buffer[buflen] = "}"
end
tables[value] = nil
else
return exception ('unsupported type', value, state, buffer, buflen,
"type '" .. valtype .. "' is not supported by JSON.")
end
return buflen
end
function json.encode (value, state)
state = state or {}
local oldbuffer = state.buffer
local buffer = oldbuffer or {}
state.buffer = buffer
updatedecpoint()
local ret, msg = encode2 (value, state.indent, state.level or 0,
buffer, state.bufferlen or 0, state.tables or {}, state.keyorder, state)
if not ret then
error (msg, 2)
elseif oldbuffer == buffer then
state.bufferlen = ret
return true
else
state.bufferlen = nil
state.buffer = nil
return concat (buffer)
end
end
local function loc (str, where)
local line, pos, linepos = 1, 1, 0
while true do
pos = strfind (str, "\n", pos, true)
if pos and pos < where then
line = line + 1
linepos = pos
pos = pos + 1
else
break
end
end
return "line " .. line .. ", column " .. (where - linepos)
end
local function unterminated (str, what, where)
return nil, strlen (str) + 1, "unterminated " .. what .. " at " .. loc (str, where)
end
local function scanwhite (str, pos)
while true do
pos = strfind (str, "%S", pos)
if not pos then return nil end
local sub2 = strsub (str, pos, pos + 1)
if sub2 == "\239\187" and strsub (str, pos + 2, pos + 2) == "\191" then
-- UTF-8 Byte Order Mark
pos = pos + 3
elseif sub2 == "//" then
pos = strfind (str, "[\n\r]", pos + 2)
if not pos then return nil end
elseif sub2 == "/*" then
pos = strfind (str, "*/", pos + 2)
if not pos then return nil end
pos = pos + 2
else
return pos
end
end
end
local escapechars = {
["\""] = "\"", ["\\"] = "\\", ["/"] = "/", ["b"] = "\b", ["f"] = "\f",
["n"] = "\n", ["r"] = "\r", ["t"] = "\t"
}
local function unichar (value)
if value < 0 then
return nil
elseif value <= 0x007f then
return strchar (value)
elseif value <= 0x07ff then
return strchar (0xc0 + floor(value/0x40),
0x80 + (floor(value) % 0x40))
elseif value <= 0xffff then
return strchar (0xe0 + floor(value/0x1000),
0x80 + (floor(value/0x40) % 0x40),
0x80 + (floor(value) % 0x40))
elseif value <= 0x10ffff then
return strchar (0xf0 + floor(value/0x40000),
0x80 + (floor(value/0x1000) % 0x40),
0x80 + (floor(value/0x40) % 0x40),
0x80 + (floor(value) % 0x40))
else
return nil
end
end
local function scanstring (str, pos)
local lastpos = pos + 1
local buffer, n = {}, 0
while true do
local nextpos = strfind (str, "[\"\\]", lastpos)
if not nextpos then
return unterminated (str, "string", pos)
end
if nextpos > lastpos then
n = n + 1
buffer[n] = strsub (str, lastpos, nextpos - 1)
end
if strsub (str, nextpos, nextpos) == "\"" then
lastpos = nextpos + 1
break
else
local escchar = strsub (str, nextpos + 1, nextpos + 1)
local value
if escchar == "u" then
value = tonumber (strsub (str, nextpos + 2, nextpos + 5), 16)
if value then
local value2
if 0xD800 <= value and value <= 0xDBff then
-- we have the high surrogate of UTF-16. Check if there is a
-- low surrogate escaped nearby to combine them.
if strsub (str, nextpos + 6, nextpos + 7) == "\\u" then
value2 = tonumber (strsub (str, nextpos + 8, nextpos + 11), 16)
if value2 and 0xDC00 <= value2 and value2 <= 0xDFFF then
value = (value - 0xD800) * 0x400 + (value2 - 0xDC00) + 0x10000
else
value2 = nil -- in case it was out of range for a low surrogate
end
end
end
value = value and unichar (value)
if value then
if value2 then
lastpos = nextpos + 12
else
lastpos = nextpos + 6
end
end
end
end
if not value then
value = escapechars[escchar] or escchar
lastpos = nextpos + 2
end
n = n + 1
buffer[n] = value
end
end
if n == 1 then
return buffer[1], lastpos
elseif n > 1 then
return concat (buffer), lastpos
else
return "", lastpos
end
end
local scanvalue -- forward declaration
local function scantable (what, closechar, str, startpos, nullval, objectmeta, arraymeta)
local len = strlen (str)
local tbl, n = {}, 0
local pos = startpos + 1
if what == 'object' then
setmetatable (tbl, objectmeta)
else
setmetatable (tbl, arraymeta)
end
while true do
pos = scanwhite (str, pos)
if not pos then return unterminated (str, what, startpos) end
local char = strsub (str, pos, pos)
if char == closechar then
return tbl, pos + 1
end
local val1, err
val1, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta)
if err then return nil, pos, err end
pos = scanwhite (str, pos)
if not pos then return unterminated (str, what, startpos) end
char = strsub (str, pos, pos)
if char == ":" then
if val1 == nil then
return nil, pos, "cannot use nil as table index (at " .. loc (str, pos) .. ")"
end
pos = scanwhite (str, pos + 1)
if not pos then return unterminated (str, what, startpos) end
local val2
val2, pos, err = scanvalue (str, pos, nullval, objectmeta, arraymeta)
if err then return nil, pos, err end
tbl[val1] = val2
pos = scanwhite (str, pos)
if not pos then return unterminated (str, what, startpos) end
char = strsub (str, pos, pos)
else
n = n + 1
tbl[n] = val1
end
if char == "," then
pos = pos + 1
end
end
end
scanvalue = function (str, pos, nullval, objectmeta, arraymeta)
pos = pos or 1
pos = scanwhite (str, pos)
if not pos then
return nil, strlen (str) + 1, "no valid JSON value (reached the end)"
end
local char = strsub (str, pos, pos)
if char == "{" then
return scantable ('object', "}", str, pos, nullval, objectmeta, arraymeta)
elseif char == "[" then
return scantable ('array', "]", str, pos, nullval, objectmeta, arraymeta)
elseif char == "\"" then
return scanstring (str, pos)
else
local pstart, pend = strfind (str, "^%-?[%d%.]+[eE]?[%+%-]?%d*", pos)
if pstart then
local number = str2num (strsub (str, pstart, pend))
if number then
return number, pend + 1
end
end
pstart, pend = strfind (str, "^%a%w*", pos)
if pstart then
local name = strsub (str, pstart, pend)
if name == "true" then
return true, pend + 1
elseif name == "false" then
return false, pend + 1
elseif name == "null" then
return nullval, pend + 1
end
end
return nil, pos, "no valid JSON value at " .. loc (str, pos)
end
end
local function optionalmetatables(...)
if select("#", ...) > 0 then
return ...
else
return {__jsontype = 'object'}, {__jsontype = 'array'}
end
end
function json.decode (str, pos, nullval, ...)
local objectmeta, arraymeta = optionalmetatables(...)
return scanvalue (str, pos, nullval, objectmeta, arraymeta)
end
function json.use_lpeg ()
local g = require ("lpeg")
if g.version() == "0.11" then
error "due to a bug in LPeg 0.11, it cannot be used for JSON matching"
end
local pegmatch = g.match
local P, S, R = g.P, g.S, g.R
local function ErrorCall (str, pos, msg, state)
if not state.msg then
state.msg = msg .. " at " .. loc (str, pos)
state.pos = pos
end
return false
end
local function Err (msg)
return g.Cmt (g.Cc (msg) * g.Carg (2), ErrorCall)
end
local SingleLineComment = P"//" * (1 - S"\n\r")^0
local MultiLineComment = P"/*" * (1 - P"*/")^0 * P"*/"
local Space = (S" \n\r\t" + P"\239\187\191" + SingleLineComment + MultiLineComment)^0
local PlainChar = 1 - S"\"\\\n\r"
local EscapeSequence = (P"\\" * g.C (S"\"\\/bfnrt" + Err "unsupported escape sequence")) / escapechars
local HexDigit = R("09", "af", "AF")
local function UTF16Surrogate (match, pos, high, low)
high, low = tonumber (high, 16), tonumber (low, 16)
if 0xD800 <= high and high <= 0xDBff and 0xDC00 <= low and low <= 0xDFFF then
return true, unichar ((high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)
else
return false
end
end
local function UTF16BMP (hex)
return unichar (tonumber (hex, 16))
end
local U16Sequence = (P"\\u" * g.C (HexDigit * HexDigit * HexDigit * HexDigit))
local UnicodeEscape = g.Cmt (U16Sequence * U16Sequence, UTF16Surrogate) + U16Sequence/UTF16BMP
local Char = UnicodeEscape + EscapeSequence + PlainChar
local String = P"\"" * g.Cs (Char ^ 0) * (P"\"" + Err "unterminated string")
local Integer = P"-"^(-1) * (P"0" + (R"19" * R"09"^0))
local Fractal = P"." * R"09"^0
local Exponent = (S"eE") * (S"+-")^(-1) * R"09"^1
local Number = (Integer * Fractal^(-1) * Exponent^(-1))/str2num
local Constant = P"true" * g.Cc (true) + P"false" * g.Cc (false) + P"null" * g.Carg (1)
local SimpleValue = Number + String + Constant
local ArrayContent, ObjectContent
-- The functions parsearray and parseobject parse only a single value/pair
-- at a time and store them directly to avoid hitting the LPeg limits.
local function parsearray (str, pos, nullval, state)
local obj, cont
local npos
local t, nt = {}, 0
repeat
obj, cont, npos = pegmatch (ArrayContent, str, pos, nullval, state)
if not npos then break end
pos = npos
nt = nt + 1
t[nt] = obj
until cont == 'last'
return pos, setmetatable (t, state.arraymeta)
end
local function parseobject (str, pos, nullval, state)
local obj, key, cont
local npos
local t = {}
repeat
key, obj, cont, npos = pegmatch (ObjectContent, str, pos, nullval, state)
if not npos then break end
pos = npos
t[key] = obj
until cont == 'last'
return pos, setmetatable (t, state.objectmeta)
end
local Array = P"[" * g.Cmt (g.Carg(1) * g.Carg(2), parsearray) * Space * (P"]" + Err "']' expected")
local Object = P"{" * g.Cmt (g.Carg(1) * g.Carg(2), parseobject) * Space * (P"}" + Err "'}' expected")
local Value = Space * (Array + Object + SimpleValue)
local ExpectedValue = Value + Space * Err "value expected"
ArrayContent = Value * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp()
local Pair = g.Cg (Space * String * Space * (P":" + Err "colon expected") * ExpectedValue)
ObjectContent = Pair * Space * (P"," * g.Cc'cont' + g.Cc'last') * g.Cp()
local DecodeValue = ExpectedValue * g.Cp ()
function json.decode (str, pos, nullval, ...)
local state = {}
state.objectmeta, state.arraymeta = optionalmetatables(...)
local obj, retpos = pegmatch (DecodeValue, str, pos, nullval, state)
if state.msg then
return nil, state.pos, state.msg
else
return obj, retpos
end
end
-- use this function only once:
json.use_lpeg = function () return json end
json.using_lpeg = true
return json -- so you can get the module using json = require "dkjson".use_lpeg()
end
if always_try_using_lpeg then
pcall (json.use_lpeg)
end
return json
|
Changes to Tesis/Escrito/TextoIntegrado/grafoscopio.tex.
| ︙ | ︙ | |||
31 32 33 34 35 36 37 | \\ Mis estudiantes de la cohorte 11B de la Maestría en Didáctica de las Ciencias de la Fundación Universitaria Autónoma de Colombia leyeron, como una de las actividades de nuestro seminario de software libre y educación, borradores de este artículo e hicieron valiosos comentarios. }. | | | | | | | | | | | | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
\\
Mis estudiantes de la cohorte 11B de la Maestría en Didáctica de las
Ciencias de la Fundación Universitaria Autónoma de Colombia leyeron,
como una de las actividades de nuestro seminario de software libre y
educación, borradores de este artículo e hicieron valiosos comentarios.
}.
Grafoscopio es una herramienta amoldable para publicación e investigación reproducible y narrativas
y visualización ágiles de datos \cite{luna_cardenas_grafoscopio:_2017}, que permite mezclar prosa, código,
datos y gráficos.
Realiza varios aportes, dentro del contexto indagar por la modificación recíproca
entre comunidades y artefactos digitales, desde perspectivas críticas: es altamente cambiable,
debido a estar realizado en el metasistema Pharo (un sistema hecho en sí mismo);
posee una metáfora uniforme para trabajar a lo largo del entorno (un enfoque objetual
puro), lo cual facilita su aprendizaje y modificación, contrastando con otros entornos que
mezclan distintos paradigmas y tecnologías incrementando la complejidad incidental del problema
(aquella que no es esencial del mismo, sino producto de otras cosas, como las tecnologías con
las cuales se aborda -- \cite{luna_cardenas_grafoscopio:_2015});
tiene una perspectiva centrada en el Sur Global, desde la apuesta por lo que se llamó
``infraestructuras de bolsillo'' (sencillas, auto-contenidas y que funcionan bien en y fuera de
línea).
Al permitir narrativas computacionales e investigación y publicación reproducibles, realiza un
puente entre el mundo impreso y el mundo computacional, pues al combinar prosa, código, texto, datos
y visualizaciones, con una fuerte apuesta por la llamada tecnología cívica, permite un ingreso de más
saberes y sujetos, además de los habituales desarrolladores de software o los científicos de la computación.
Se mostrarán las ideas claves sobre los temas relacionados de esta tesis respecto
a la construcción de artefactos autorreferenciales, que complementan las dinámicas
autopoiéticas propias de las comunidades de práctica, y del desarrollo de
software como labor artesanal y desde actos de empoderamiento ciudadano.
Si bien Grafoscopio habita un ecosistema donde otras alternativas parecidas
existen\footnote{El Manual de Usuario Grafoscopio (\emph{Grafoscopio User Manual},
|
| ︙ | ︙ | |||
94 95 96 97 98 99 100 | %Ello permitirá la conexión con los dos capítulos siguientes, referidos a las %dinámicas que se desarrollaron alrededor de Grafoscopio (Data Weeks, Data Rodas y %otros encuentros), así como los otros artefactos digitales que se construyeron %gracias a la interacción entre Grafoscopio y tales dinámicas. | | < | > > > > > > > > > | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
%Ello permitirá la conexión con los dos capítulos siguientes, referidos a las
%dinámicas que se desarrollaron alrededor de Grafoscopio (Data Weeks, Data Rodas y
%otros encuentros), así como los otros artefactos digitales que se construyeron
%gracias a la interacción entre Grafoscopio y tales dinámicas.
\section{Investigaciones y ciencias otras, objetos de investigación reproducibles y activistas}\label{iccag-intro}
Como se apreció en los antecedentes, Grafoscopio tenía la intención de explorar
formas de escribir diferentes, que permitieran amplificar las voces de las comunidades
de base, usando maneras de argumentar desde los datos y las visualizaciones, en particular
en relación con las interacciones entre dichas comunidades y entidades estatales.
Ejemplos de ello se empezaron a avisorar en la Gobernatón y los prototipos de
\emph{Indie Web Science}, antes abordados.
Grafoscopio también tenía la intención de visibilizar los múltiples objetos
de investigación, de los cuales la academia suele no dar cuenta, debido a las
prácticas de validación de saberes que privilegian excesivamente lo escrito y la
publicación indexada\footnote{Un número creciente de
académicos y posturas críticas se suman a esta lectura sobre el fetichismo y la mafia
de los artículos y la publicación indexada, desde artículos en periódicos, como
\emph{Publish-or-perish: Peer review and the corruption of science} (\cite{colquhoun_publish-or-perish:_2011})
hasta blogs dedicados a estas posturas críticas, como \emph{Elephant in the room}
(\url{https://is.gd/elelab}) y libros, como \emph{The end of the cognitive empire: the coming of
age of epistemologies of the South} (\cite{santos_end_2018}), que establecen otras epistemologías, narrativas,
objetos y formas de dar cuenta del conocimiento, que van más allá de lo la mayoría de instituciones y académicos,
con mirada positivista, reduccionista y/o extractivista reconocen como lo que es el conocimiento, sus sujetos
y sus objetos y los circuitos de publicación donde se mobilizan y visibilizan.}.
Como se vera en detalle más adelante, estas dos búsquedas tenían una intención común:
construir nuevas metáforas que a su vez permitiesen adquirir nuevos alfabetismos
sobre escritura, mediada por código, datos y visualización, lo que, a su vez,
permitiera re y co-construir la metáfora original: \emph{cambiando así el artefacto que nos cambia}.
En ese sentido las elecciones hechas, por ejemplo, que el texto se presente como un árbol,
son temporales y puntos de partida para reconfigurar y desplegar dichas elecciones nuevamente.
|
| ︙ | ︙ | |||
322 323 324 325 326 327 328 |
científicas.
\end{quote}
Una posibilidad similar hemos visto desde HackBo, cuando participamos desde
infraestructuras como Grafoscopio en debates sobre asuntos públicos o cuando
deconstruimos investigaciones de Big Data haciéndolas accesibles para muchos
(el capítulo \ref{prototipos} lo muestra en detalle).
| | | | | | < < | 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 |
científicas.
\end{quote}
Una posibilidad similar hemos visto desde HackBo, cuando participamos desde
infraestructuras como Grafoscopio en debates sobre asuntos públicos o cuando
deconstruimos investigaciones de Big Data haciéndolas accesibles para muchos
(el capítulo \ref{prototipos} lo muestra en detalle).
Ahí estamos haciendo posible que el ciudadano participe del debate, rete al
experto o muestre que esta no es una esfera siempre cerrada y que, por el
contrario, puede incluir voces diversas.
Por su parte, \cite{lafuente_amateurs_2014} conecta a la ciencia ciudadana con
el movimiento hacker cuando dice que tal movimiento resistía la corporatización
del saber, pues era tan absurdo como privatizar las leyes de Newton o los teoremas
matemáticos y conecta este movimiento con otros movimientos e iniciativas, como
la Wikipedia, los Creative Commons, el movimiento punk y de hecho muestra una
perspectiva similar a la de Wark, Coleman o Schrock, antes vistas, cuando plurariza
el fenómeno hacker y lo conecta con diferentes sujetos y maneras de hacer conocimiento:
\begin{quote}
La cultura hacker pronto resonó con la cultura punk. Ambas daban forma a
los anhelos anticonsumistas, antimonopolistas y antielitistas. Ambas
representaban una apuesta por la cultura del DIY, las formas
cooperativas, las prácticas de garaje y la innovación maker. Hace ya
cinco décadas que su presencia no deja de contagiar el mundo de los
|
| ︙ | ︙ | |||
370 371 372 373 374 375 376 |
empresarial.
\end{quote}
Grafoscopio se relaciona críticamente con los movimientos de la ciencia de garage y ciudadana,
pues precisamente ha ocurrido en el Hackerspace de Bogotá, HackBo, a propósito de dinámicas
relacionadas con otras maneras de apropiar la tecnología y la ciencia y participar desde dicha
apropiación de la vida social y pública.
| | | | | | > | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
empresarial.
\end{quote}
Grafoscopio se relaciona críticamente con los movimientos de la ciencia de garage y ciudadana,
pues precisamente ha ocurrido en el Hackerspace de Bogotá, HackBo, a propósito de dinámicas
relacionadas con otras maneras de apropiar la tecnología y la ciencia y participar desde dicha
apropiación de la vida social y pública.
Acá se piensa la investigación y ciencia ciudadana y de garage como aquellas que usa los métodos
de las ciencias y la investigación para diversificar las voces que participan en ellas, y que se preocupa,
particularmente, por la reproductibilidad, verificabilidad y construcción sobre lo dicho, incluso más allá
de las prácticas de publicación actuales.
Grafoscopio procura brindar un amplificador de voces locales, que apela a lo textual, los datos
y la visualización (y los alfabetismos relacionados con ellos) para dicha amplificación,
como se verá en los capítulos \ref{dataweek} y \ref{prototipos}.
Vemos que lo que se comparte en las diferentes iniciativas ICACG es la búsqueda de apertura,
transparencia y horizontalidad, pero las preguntas, metodologías y artefactos pueden ser muy
diversos y con posturas que tienen distintos niveles de diálogo y contrapeso a las dinámicas
más hegemónicas de la investigación y la ciencia tradicionales institucionalizadas.
Sin embargo, estos artefactos comparten el hecho de estar descentrados del texto y mediados
por las tecnologías y representaciones digitales, además de permitir las búsquedas mencionadas.
|
| ︙ | ︙ | |||
731 732 733 734 735 736 737 | pues al igual que muchos de ellos combina y provee funcionalidades para la prosa y el código con visualizaciones, en libretas y documentos interactivas. Sin embargo, se distancia de estos al desarrollarse en un entorno continuo de computo, que no separa en capas disyuntas, lenguaje de programación, entorno integrado de desarrollo (IDE, por sus siglas en inglés), los gestores de código, la aplicación y el documento, facilitando difuminar la distinción entre usuario y hacedor (problema central para esta investigación) y usa representaciones simbólicas (código) y gráficas (visualizaciones) para abordar un problema. | | | | | | | 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 |
pues al igual que muchos de ellos combina y provee funcionalidades para la prosa y el código con
visualizaciones, en libretas y documentos interactivas.
Sin embargo, se distancia de estos al desarrollarse en un entorno continuo de computo, que no
separa en capas disyuntas, lenguaje de programación, entorno integrado de desarrollo (IDE, por
sus siglas en inglés), los gestores de código, la aplicación y el documento, facilitando difuminar
la distinción entre usuario y hacedor (problema central para esta investigación) y usa representaciones
simbólicas (código) y gráficas (visualizaciones) para abordar un problema.
El Manual de Usuario de Grafoscopio\footnote{\url{https://is.gd/grafoscopio_manual}}
(\cite{luna_cardenas_grafoscopio_2017}) muestra en detalle el lugar de este software en medio de las
otros similares, las ideas de las cuales se inspira y las apuestas de valor agregado del mismo.
Otra tradición importante que Grafoscopio recoge es la mirada tecnopolítica del Software Libre,
pues se acoge a una de las licencias que lo cobijan (la MIT) y explicita, en muchos de los
talleres que se hicieron, la idea de la tecnología digital como una manera de hacer viable (o no)
la idea del conocimiento como bien común.
También expresa las tensiones que estas otras formas de pensar el derecho de autor enfrenta,
pues si bien el código es MIT, su manual (\cite{luna_cardenas_grafoscopio_2017}) emplea la
licencia de producción entre pares, que alienta relaciones cooperativas y no coloca el usufructo
de la creación comunitaria y de los comunes en igualdad de condiciones para todos, sino que realiza
una discriminación positiva para cooperativas y cooperantes.
|
| ︙ | ︙ | |||
885 886 887 888 889 890 891 | de los elementos restantes para producir el PDF deben ser instalados localmente en la máquina donde se trabaja el documento y para dar cuenta de su historia vía Internet la configuración en línea se hizo manualmente, gracias a repositorios en Fossil, además se desarrollo una funcionalidad puente entre Fossil y Grafoscopio. En ese sentido, no está dentro de los alcances presentes del prototipo el ser complemente portable, ni multiplataforma, y por lo pronto permite de modo autónomo sólo la escritura, (re)organización del texto en la interface gráfica y su exportación al formato ligero Markdown, | | | 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 | de los elementos restantes para producir el PDF deben ser instalados localmente en la máquina donde se trabaja el documento y para dar cuenta de su historia vía Internet la configuración en línea se hizo manualmente, gracias a repositorios en Fossil, además se desarrollo una funcionalidad puente entre Fossil y Grafoscopio. En ese sentido, no está dentro de los alcances presentes del prototipo el ser complemente portable, ni multiplataforma, y por lo pronto permite de modo autónomo sólo la escritura, (re)organización del texto en la interface gráfica y su exportación al formato ligero Markdown, mientras que apela al software externo Pandoc para la conversión a HTML y, junto con \LaTeX, se puede realizar la exportación a PDF. Se espera que futuras versiones del software integren los elementos faltantes y puedan jalonarlos de maneras progresivas, de acuerdo a las necesidades de la comunidad y los recursos para ello, siguiendo con la idea de poner a circular e iterar prototipos mínimos y funcionales desde los cuales detonar dichas experiencias futuras y reevaluar las elecciones de diseño del pasado. |
| ︙ | ︙ | |||
982 983 984 985 986 987 988 | y referencias bibliográficas integradas por ellos. Se puede tener un texto sucinto y de fácil lectura, pero que oculta las complejidades que lo construyen, lo cual dificulta la participación y transparencia posterior, propia de los procesos de Innovación Abierta y Comunitaria, (como los que alentaba PIAMED) o bien un texto completo y complejo, que al mostrar sus diversas capas en simultáneo, se enfrenta a la misma dificultad. | < < < < < < < < < < < < < < < < < < < < < < < < < < < | 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 |
y referencias bibliográficas integradas por ellos.
Se puede tener un texto sucinto y de fácil lectura, pero que oculta las complejidades que
lo construyen, lo cual dificulta la participación y transparencia posterior, propia de los
procesos de Innovación Abierta y Comunitaria, (como los que alentaba PIAMED) o bien un texto
completo y complejo, que al mostrar sus diversas capas en simultáneo, se enfrenta a la misma
dificultad.
Además el \emph{IPython Notebook} está hecho en varios lenguajes: Python, C, Javascript
y HTML, con lo cual la curva de aprendizaje para la intervención de la interface misma se
hace complicada.
Por tanto, no era muy adecuado como base para explorar la idea de un sistema de escritura
donde lo arboreo permita lidiar con la complejidad y el caracter emergente de la misma.
Una descripción detallada de las dificultades de lidiar con dicha complejidad incidental,
que toma la forma de diversas tecnologías, lenguajes, \emph{frameworks}, modelos conceptuales
|
| ︙ | ︙ | |||
1039 1040 1041 1042 1043 1044 1045 |
Esta es una muestra interesante de cómo Grafoscopio madura a buen ritmo, sin ser subsumido
o desactualizado por proyectos con mucho más recursos, desarrolladores, apoyo y visibilidad
y que sigue aportando valor diferencial y lugares de interlocución desde los márgenes.
La figura \ref{fig:grafoscopio-jupyter} muestra cómo tanto Grafoscopio como Jupyter Lab
permiten la integración de distintos elementos de un Entorno Interactivo de Desarrollo,
yendo más allá de la sóla libreta interactiva.
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 |
Esta es una muestra interesante de cómo Grafoscopio madura a buen ritmo, sin ser subsumido
o desactualizado por proyectos con mucho más recursos, desarrolladores, apoyo y visibilidad
y que sigue aportando valor diferencial y lugares de interlocución desde los márgenes.
La figura \ref{fig:grafoscopio-jupyter} muestra cómo tanto Grafoscopio como Jupyter Lab
permiten la integración de distintos elementos de un Entorno Interactivo de Desarrollo,
yendo más allá de la sóla libreta interactiva.
\begin{figure*}[tb]
\centering
\includegraphics[height={\textwidth}]{./Parte2/narrativa-zooms.png}
\caption[Narrativas de datos integradas usando el IPython \emph{notebook}]
{Narrativas de datos integradas usando el IPython \emph{notebook} (\cite{gil_rojas_narrativas_2014}).
En la mitad está todo el documento con la narrativa completa y a los lados dos
\emph{zooms} de unos trozos del mismo.
Los trapecios cyan indican qué parte central es ampliada en el zoom.
Como se puede ver, un documento único se hace de dificil manejo de todos
los niveles que integra la narrativa (descripciones textuales, algoritmos, datos
y visualizaciones).
La opción de separarlo en distintos subdocumentos, no es muy amigable, si en ellos
se trabajan los mismos datos y hay que cargarlos una y otra vez, o si a partir de
los mismos se crean varios productos derivados dirigidos a públicos distintos, como
suele ocurrir.
Otros autores y practicantes de escritura científica, de datos y de documentos interactivos
han ampliado esta crítica al modelo de documentos interactivos que alienta IPython recientemente,
particularmente cuando se trata de escribir documentos largos, tipo libros.
(véase \cite{grus_i_2018}, \emph{Why I don't like IPython notebooks})
La alternativa propuesta con Grafoscopio es usar la escritura interactiva por capas o arbórea,
que permite ver el todo y las partes en simultáneo a la vez que establecer recorridos a
medida del árbol para diferentes públicos y ha sido probado en la práctica para la escritura de
e ingeniería reversa de documentos largos como el propio Manual de Grafoscopio y el Manual de
Periodismo de datos (\ref{mapeda}).}
\label{fig:narrativas-ipython-notebook}
\end{figure*}
\clearpage
Para los prototipos de Grafoscopio se preservó la idea de una experiencia de escritura arbórea
centrada en estructura y palabras con una interface sin adornos de Leo, así como la de un
sistema de escritura interactiva, que soportara la recolección y visualización de datos en
concordancia con lo que permite el IPython \emph{notebook}.
\begin{figure*}[tb]%
\centering
\subfloat[Trozo mapa del Data Week sobre la relación entre Jupyter y Grafoscopio]{
\includegraphics[width=0.7\linewidth]{Parte2/jupyter-grafoscopio.png}
\label{subfig:jupyter-grafoscopio}}
\\
\subfloat[Grafoscopio: Panama Papers]{
\includegraphics[width=0.45\linewidth]{Parte2/data-environment-full.png}
|
| ︙ | ︙ | |||
1063 1064 1065 1066 1067 1068 1069 |
\ref{subfig:data-environment} Captura del Entorno Interactivo de Desarrollo de Grafoscopio,
tomada del los Panama Papers en \url{http://is.gd/panama_papers_e}.
\ref{subfig:ipython-markdown} Captura del Entorno Interactivo de Desarrollo de JupyterLab,
tomada de \emph{JupyterLab: Ready for Users} en \url{https://is.gd/JRmGNY}.}
\label{fig:grafoscopio-jupyter}%
\end{figure*}
| < < < < | 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 |
\ref{subfig:data-environment} Captura del Entorno Interactivo de Desarrollo de Grafoscopio,
tomada del los Panama Papers en \url{http://is.gd/panama_papers_e}.
\ref{subfig:ipython-markdown} Captura del Entorno Interactivo de Desarrollo de JupyterLab,
tomada de \emph{JupyterLab: Ready for Users} en \url{https://is.gd/JRmGNY}.}
\label{fig:grafoscopio-jupyter}%
\end{figure*}
Se consideraron otros lenguajes con la característica de auto-referencialidad e introspección,
es decir, el hecho de que el código fuente pueda usarse como datos, de modo que, a su vez, se
pueda usar una parte del código fuente para reprogramar el sistema, en particular su interfaz
y sistema de escritura.
Dentro de las opciones estaba el editor de código LightTable\footnote{\url{http://lighttable.com/}},
que está hecho en ClojureScript\footnote{\url{https://clojurescript.org/}} (un descendiente
|
| ︙ | ︙ | |||
1185 1186 1187 1188 1189 1190 1191 |
Se dirige a varias categorías de personas:
\begin{itemize}
\item
investigadores en el área de análisis de software, minería e
ingeniería inversa.
\item
| | | 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 |
Se dirige a varias categorías de personas:
\begin{itemize}
\item
investigadores en el área de análisis de software, minería e
ingeniería inversa.
\item
ingenieros y arquitectos quienes quieren entender sistemas y datos y
\item
constructores de herramientas.
\end{itemize}
\end{quote}
%PENDIENTE: Escribir a Alex sobre la versión que decía esto:
\item El proyecto de Visualización Agil, construido sobre estas plataformas,
afirma (``Agile Visualization'' n.d.):
|
| ︙ | ︙ | |||
1228 1229 1230 1231 1232 1233 1234 |
una de las ventajas fundamentales de entorno continuo de programación ofrecido por Pharo,
en el que no se diferencia entre la aplicación, el entorno de desarrollo y el código fuente,
pues si se encuentra una funcionalidad interesante, es posible acceder a sus instrucciones y
copiarlas o modifcarlas hasta lograr una experiencia de uso cercana a la deseada.
En este periodo inicial se aprendió esencialmente sobre la jerarquía de clases, la definición
de objetos y métodos (\cite{bergel_deep_2013}) y el uso de colecciones (\cite{noauthor_pharo_nodate})
| > | | | 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 |
una de las ventajas fundamentales de entorno continuo de programación ofrecido por Pharo,
en el que no se diferencia entre la aplicación, el entorno de desarrollo y el código fuente,
pues si se encuentra una funcionalidad interesante, es posible acceder a sus instrucciones y
copiarlas o modifcarlas hasta lograr una experiencia de uso cercana a la deseada.
En este periodo inicial se aprendió esencialmente sobre la jerarquía de clases, la definición
de objetos y métodos (\cite{bergel_deep_2013}) y el uso de colecciones (\cite{noauthor_pharo_nodate})
y cadenas de texto (Sharp [1997]), % \cite{sharp_smalltalk_1997} ~\cite{sharp_chapter_1997} , <-- No funcionan!
que permitieron definir el modelo y comportamiento base para sobre ellos hacer la Interfaz Gráfica
de Usuario (GUI, por sus siglas en inglés).
\begin{figure}[th]
\begin{center}
\includegraphics[width=\linewidth]{Parte2/arbol-ayuda-pharo.png}
\caption[Sistema de ayuda de Pharo]
{Sistema de ayuda de Pharo. Se puede ver que formar una jerarquía se hace programando. La idea de Grafoscopio era evitar eso para
que cualquiera pudiera crearlas desde una interface gráfica
|
| ︙ | ︙ | |||
1302 1303 1304 1305 1306 1307 1308 |
\ref{ui-auto-actualizar}).
Desnudar al problema para llegar a su escencia fue proceso que tardó casi semana y media y fue
de los más demorado de entender y programar en mi posición de novato.
Sin embargo, esta experiencia de un ejemplo funcional mínimo que representara la esencia del
problema, para pedir ayuda en las comunidades de Pharo o brindarla en las comunidades locales,
demostró ser un aprendizaje clave para el futuro.
| | | 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 |
\ref{ui-auto-actualizar}).
Desnudar al problema para llegar a su escencia fue proceso que tardó casi semana y media y fue
de los más demorado de entender y programar en mi posición de novato.
Sin embargo, esta experiencia de un ejemplo funcional mínimo que representara la esencia del
problema, para pedir ayuda en las comunidades de Pharo o brindarla en las comunidades locales,
demostró ser un aprendizaje clave para el futuro.
\begin{figure*}[tbh]%
\centering
\includegraphics[width=0.45\linewidth]{Parte2/autoactualizacion-en-navegador-minimalista-panel-original.png}
\qquad
\includegraphics[width=0.45\linewidth]{Parte2/autoactualizacion-en-navegador-minimalista-panel-actualizado.png}
\caption[Navegador minimalista para probar la auto-actualización]
{Navegador minimalista para probar la auto-actualización. Izquierda,
en su estado original, como estaban los dos desde el código. Derecha actualizado.
|
| ︙ | ︙ | |||
1373 1374 1375 1376 1377 1378 1379 |
% etc) por fuera del documento
Más detalles en el capítulo \ref{prototipos}.}.
Las preguntas sobre este formato y sus optimizaciones fueron surgiendo de a pocos, primero garantizando
la posibilidad de guardado y recarga de documentos y luego, su uso eficiente, varios meses despues,
logrando comprensiones de casi 150 veces el tamaño de los primeros archivos.
%PENDIENTE: Referencias a los manuales dentro de este documento.
| | | 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 |
% etc) por fuera del documento
Más detalles en el capítulo \ref{prototipos}.}.
Las preguntas sobre este formato y sus optimizaciones fueron surgiendo de a pocos, primero garantizando
la posibilidad de guardado y recarga de documentos y luego, su uso eficiente, varios meses despues,
logrando comprensiones de casi 150 veces el tamaño de los primeros archivos.
%PENDIENTE: Referencias a los manuales dentro de este documento.
\begin{figure*}[tb]%
\centering
\subfloat[Explicación de la simulación]{
\includegraphics[width=0.45\linewidth]{Parte2/multiagentes-2.jpg}
\label{subfig:multiagentes-2}}
\quad
\subfloat[Ejecución de la simulación ]{
\includegraphics[width=0.45\linewidth]{Parte2/multiagentes-3.jpg}
|
| ︙ | ︙ | |||
1407 1408 1409 1410 1411 1412 1413 |
Gracias a STON, la persistencia fue muy fluida y sólo tomo cerca de una decena líneas de código.
En la figura \ref{persistencia} se ven una captura de pantalla de un trozo del árbol que
representa la estructura completa de las primeras versiones preliminares para este escrito,
incluidos nodos invisibles y otros metadatos, y, aprovechando su brevedad, el código que
implementa la persistencia del árbol en disco duro (disponible desde la opción de menú
``\texttt{Notebook\ \textgreater{}\ Save\ as...}'').
| | | 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 |
Gracias a STON, la persistencia fue muy fluida y sólo tomo cerca de una decena líneas de código.
En la figura \ref{persistencia} se ven una captura de pantalla de un trozo del árbol que
representa la estructura completa de las primeras versiones preliminares para este escrito,
incluidos nodos invisibles y otros metadatos, y, aprovechando su brevedad, el código que
implementa la persistencia del árbol en disco duro (disponible desde la opción de menú
``\texttt{Notebook\ \textgreater{}\ Save\ as...}'').
\begin{figure*}[tb]%
\centering
\subfloat[]{
\includegraphics[width=0.35\linewidth]{Parte2/arbol-detalle.png}
\label{subfig:arbol-detalle}}
\qquad
\subfloat[]{
\includegraphics[width=0.57\linewidth]{Parte2/persistencia-guardar-como.png}
|
| ︙ | ︙ | |||
1481 1482 1483 1484 1485 1486 1487 |
capítulos o nodos invisibles.
Esta realimentación entre el software de escritura y (d)escribir el software dentro de sí mismo
genero este ciclo virtuoso en el diseño del prototipo.
Una descripción detallada de este proceso está en el apendice \ref{materialidades}, debido a su
caracter clave durante toda esta investigación y sus repercusiones en otras investigaciones y
prácticas comunitarias venideras.
| < | | 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 |
capítulos o nodos invisibles.
Esta realimentación entre el software de escritura y (d)escribir el software dentro de sí mismo
genero este ciclo virtuoso en el diseño del prototipo.
Una descripción detallada de este proceso está en el apendice \ref{materialidades}, debido a su
caracter clave durante toda esta investigación y sus repercusiones en otras investigaciones y
prácticas comunitarias venideras.
\begin{figure*}[tb]
\centering
\subfloat[]{
\includegraphics[width=0.6\linewidth]{Parte2/interface-grafoscopio.png}
\label{subfig:grafoscopio-articulo-fuente}}
\\
\subfloat[]{
\includegraphics[width=0.6\linewidth]{Parte2/articulo-pdf.png}
|
| ︙ | ︙ | |||
1509 1510 1511 1512 1513 1514 1515 |
La figura \ref{subfig:grafoscopio-articulo-pdf} muestra ese texto exportado como artículo en PDF.
La figura \ref{subfig:grafoscopio-manual}, muestra, a la izquiera, una de las interfaces más
maduras y recientes, que se ha mantenido estables desde el 2017, y a derecha el Manual de
Usuario de Grafoscopio, que fue escrito dentro del mismo Grafoscopio, haciendo uso de las
funcionalidades mostradas en tal interfaz.}
\label{fig:versiones-grafoscopio}
\end{figure*}
| < < | 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 |
La figura \ref{subfig:grafoscopio-articulo-pdf} muestra ese texto exportado como artículo en PDF.
La figura \ref{subfig:grafoscopio-manual}, muestra, a la izquiera, una de las interfaces más
maduras y recientes, que se ha mantenido estables desde el 2017, y a derecha el Manual de
Usuario de Grafoscopio, que fue escrito dentro del mismo Grafoscopio, haciendo uso de las
funcionalidades mostradas en tal interfaz.}
\label{fig:versiones-grafoscopio}
\end{figure*}
La integración experimental con referencias bibliográficas se hizo a través del gestor de código
abierto Zotero vía Bibtex y las etiquetas \texttt{{[}@autor{]}} colocadas dentro del texto, que soporta
el Markdown extendido de Pandoc (véase figura \ref{integracion-zotero}).
Las referencias bibliográficas eran almacenadas en línea desde Zotero, a través de su integración
con Firefox.
También se colocaban metadatos y se hacían anotaciones y luego eran exportadas a formato BibTeX.
|
| ︙ | ︙ | |||
1544 1545 1546 1547 1548 1549 1550 |
TeXstudio\footnote{\url{https://www.texstudio.org/}}, los prototipos tempranos de dicho flujo,
que integra Grafoscopio y un soporte robusto para referencias bibliográficas permitieron ver
los alcances y posibilidades al respecto para este software e incluso se preservaron
partes del mismo para el trabajo con TeXstudio, como la integración con Zotero vía BibTeX.
A su vez, probar TeXstudio y usarlo extensivamente permitirá realimentar Grafoscopio con
ideas de uso e interfaz a futuro.
| > > | | | | | | | | | | | | | | | | | | | | | | | | > > > > | 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 |
TeXstudio\footnote{\url{https://www.texstudio.org/}}, los prototipos tempranos de dicho flujo,
que integra Grafoscopio y un soporte robusto para referencias bibliográficas permitieron ver
los alcances y posibilidades al respecto para este software e incluso se preservaron
partes del mismo para el trabajo con TeXstudio, como la integración con Zotero vía BibTeX.
A su vez, probar TeXstudio y usarlo extensivamente permitirá realimentar Grafoscopio con
ideas de uso e interfaz a futuro.
\afterpage{
\begin{figure*}[tb]%
\centering
\subfloat[Zotero integrado en Firefox]{
\includegraphics[width=0.8\linewidth]{Parte2/zotero-firefox.png}
\label{subfig:zotero-firefox}}
\\
\subfloat[Depurando bibliografías de Zotero en Pharo]{
\includegraphics[width=0.8\linewidth]{Parte2/zotero-pharo-debug.jpg}
\label{subfig:zotero-pharo-debug}}
\\
\subfloat[La colección de Zotero creada para el doctorado y la maestría con casi 3500 items.]{
\includegraphics[width=0.6\linewidth]{Parte2/zotero-phd-master.png}
\label{subfig:zotero-phd-master}}
\caption[Integración preliminar con Zotero]{
Integración preliminar entre Grafoscopio y el gestor bibliográfico Zotero.
\ref{subfig:zotero-firefox} Zotero utilizado como plugin del navegador Firefox
al comienzo de la escritura de este capítulo.
\ref{subfig:zotero-pharo-debug} Inicio de la depuración en Pharo de la bibliografía
para soporte de llaves bibliográficas personalizadas.
\ref{subfig:zotero-phd-master} Colección/grupo de Zotero creada para el doctorado y la
maestría, al final del artículo con cerca de 240 items y del doctorado con 3495 items.
Ver \url{https://is.gd/zoterophd}.}%
\label{integracion-zotero}%
\end{figure*}
\clearpage
}
La colección de literatura recopilada para este escrito alcanzó a tener
cerca de 240 item, si bien se citó sólo una fracción de los mismos.
La colección en este caso es diversa y cubre temas de ciencia abierta y
reproducible, programación en Smalltalk, visualización de datos y luego se
extendió a otros temas y se abrió tempranamente para la participación de otros
estudiantes de postgrado en Diseño de la Universidad de Caldas, tanto de maestría
|
| ︙ | ︙ | |||
1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 |
También se incluye en dicho repositorio otro material integrado al mismo, como gráficas y
figuras y archivos de citación bibliográfica, que permiten rastrear la historia de tales
recursos y cómo se vinculan entre sí.
De este modo, los textos allí hospedados son consistentes con los principios de trazabilidad
y reproducibilidad de la ICACG, acá mencionados, permiten la participación desde dinámicas
comunitarias y facilitan un puente entre estas y otras prácticas académicas de frontera respecto
a artículos de software que se pudieran someter a revisión de pares y publicación.
Por ejemplo, el sitio web de Grafoscopio (\cite{luna_cardenas_grafoscopio_2014-1}\footnote{\url{http://mutabit.com/grafoscopio/}},
véase figura \ref{fig:grafoscopio-web}) surgió como una página web de bienvenida, que brindara
una primera información importante y panorámica sobre el mismo.
Grafoscopio, según su sitio web, es una herramienta amoldable para investigación y publicación
reproducible y para narrativas computacionales que combinan prosa, código, datos, y visualizaciones,
usada en campos diversos, entre los que están el activismo de datos, las visualizaciones de dominio
específico y ejercicios de ciudadanía digital.
Puede ser ejecutada en una amplia varidad de software, desde memorias USB hasta computadores modestos
y servidores.
El sitio web también contiene enlaces a manuales, documentación, muestras de lo que es posible
y canales de comunicación, soporte y vinculación comunitarios, así como enlaces al código fuente
tanto del software como de la documentación.
| > > > > > > > > > > > < < < < < < < < < < < | < < | 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 |
También se incluye en dicho repositorio otro material integrado al mismo, como gráficas y
figuras y archivos de citación bibliográfica, que permiten rastrear la historia de tales
recursos y cómo se vinculan entre sí.
De este modo, los textos allí hospedados son consistentes con los principios de trazabilidad
y reproducibilidad de la ICACG, acá mencionados, permiten la participación desde dinámicas
comunitarias y facilitan un puente entre estas y otras prácticas académicas de frontera respecto
a artículos de software que se pudieran someter a revisión de pares y publicación.
\begin{figure*}[tbh]
\includegraphics[width=0.7\linewidth]{./Parte2/grafoscopio-web.png}%
\caption[Parte de la página Web Grafoscopio]
{Parte de la página Web Grafoscopio en \url{http://mutabit.com/grafoscopio/}.
Dicha página tiene también una versión en inglés en \url{https://is.gd/grafoscopio_e}.
Sin embargo, las versiones más actualizadas se hacen primero en español,
suguiendo una apuesta por priorizar lo local.
Tomado de \cite{luna_cardenas_grafoscopio_2014-1}.}%
\label{fig:grafoscopio-web}%
\end{figure*}
Por ejemplo, el sitio web de Grafoscopio (\cite{luna_cardenas_grafoscopio_2014-1}\footnote{\url{http://mutabit.com/grafoscopio/}},
véase figura \ref{fig:grafoscopio-web}) surgió como una página web de bienvenida, que brindara
una primera información importante y panorámica sobre el mismo.
Grafoscopio, según su sitio web, es una herramienta amoldable para investigación y publicación
reproducible y para narrativas computacionales que combinan prosa, código, datos, y visualizaciones,
usada en campos diversos, entre los que están el activismo de datos, las visualizaciones de dominio
específico y ejercicios de ciudadanía digital.
Puede ser ejecutada en una amplia varidad de software, desde memorias USB hasta computadores modestos
y servidores.
El sitio web también contiene enlaces a manuales, documentación, muestras de lo que es posible
y canales de comunicación, soporte y vinculación comunitarios, así como enlaces al código fuente
tanto del software como de la documentación.
%PENDIENTE > Conclusiones: Priorizar lo local
Por otro lado la publicación del artículo indexado titulado
\emph{Grafoscopio: A moldable tool for literate computing and reproducible research},
en el \emph{Journal of Open Source Software} (JOSS), fue escrito pensando en dinámicas
académicas innovadoras que vayan más allá del artículo indexado ``clásico'' y empiecen a
mostrar otros objetos no hegenónicos de conocimiento, para los cuales la descripción en palabras,
no sólo es insuficiente, sino incompleta e inadecuada comparada con otras formas de publicación
disponibles, como las del software mismo\footnote{Obsérvese acá que la crítica no es a la
escritura como objeto profundo, sino a la publicación académica indexada actual,
que no muestra muchas de las profundidades de esa escritura, ni valida otros objetos
en los que el texto escrito en prosa no es la forma principal de expresión del conocimiento,
por ejemplo el software, los ensayos sonoros y otros.
Esta crítica a las actuales formas de publicación se han unido ya varias voces que hablan
de diversificar aquello que es publicable e indexable, como una forma de diversificar las
voces y sujetos que participan de los ciclos de la ciencia y la investigación.}.
Como se dijo al comienzo del capítulo, es una muestra de que las prácticas ad-hoc referidas
al objeto de investigación y la investigación reproducible, en particular de indexación e
identidad, pueden cristalizar, a través de Grafoscopio, en objetos más formales que hacen
parte de los ciclos de publicación internacionales y las prácticas de frontera emergentes
en dichos ámbitos.
\begin{figure}[!tbh]
|
| ︙ | ︙ | |||
1696 1697 1698 1699 1700 1701 1702 |
las maneras en que el software da cuenta de dichos procesos y cómo puede describirlos de maneras más
versátiles y potentes.\footnote{El anexo \ref{materialidades} ``Diálogo de Materialidades'' da cuenta
de maneras más detalladas de este fenómeno, que es una de las bases del proceso de
\emph{boostrapping} que permite hacer puentes, de doble vía, entre la escritura de prosa y la
de código.}
%PENDIENTE: Diálogo de materialidades.
| > > > > > > > | < < < < < < < | 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 |
las maneras en que el software da cuenta de dichos procesos y cómo puede describirlos de maneras más
versátiles y potentes.\footnote{El anexo \ref{materialidades} ``Diálogo de Materialidades'' da cuenta
de maneras más detalladas de este fenómeno, que es una de las bases del proceso de
\emph{boostrapping} que permite hacer puentes, de doble vía, entre la escritura de prosa y la
de código.}
%PENDIENTE: Diálogo de materialidades.
La escogencia de idiomas para el material presente el en repositorio, pasaba del
español al inglés dependiendo de los públicos y participantes objetivo para dicho
material, elegiendo español para públicos y eventos locales e inglés para los internacionales.
Sin embargo, se dio prioridad a lo local en general, produciendo y actualizando el
material en español y luego haciendo traducciones al inglés (salvo en aquellos que
fueron escritos originalmente en inglés, pues sus públicos eran internacionales).
\begin{figure*}[tbh]
\includegraphics[width=\linewidth]{./Parte2/grafoscopio-user-manual.png}%
\caption[Parte del manual de Grafoscopio]
{Parte del Manual de Usuario Grafoscopio, hecho dentro de Grafoscopio mismo.
Disponible en \url{https://is.gd/grafoscopio_m1}.
Tomado de \cite{luna_cardenas_grafoscopio_2017}.}%
\label{fig:grafoscopio-manual}%
\end{figure*}
Sitio web, manual de usuario, y artículos académicos, hacen parte del mismo repositorio
de código fuente, lo cual permite a la comunidad, ver las distintas caras y artefactos
relacionados con Grafoscopio y su carácter polisémico.
Incluso a futuro, gracias al soporte que está brindando la comunidad de Pharo para integrar
el código fuente del software en repositorios convencionales en lugar de especializados,
sería posible integrar este repositorio de documentación con el de
software\footnote{\url{http://smalltalkhub.com/\#!/\~Offray/Grafoscopio}}, brindando
|
| ︙ | ︙ |
Changes to Tesis/Escrito/TextoIntegrado/hacker.tex.
| ︙ | ︙ | |||
26 27 28 29 30 31 32 | trazando la historia de mi pertenencia a dichas comunidades; y por otro desde como dicha cultura encarna en el hackerspace HackBo, donde esta investigación ocurre, caracterizando maneras de hacer en la comunidad de práctica y colocando lo anterior en diálogo con perspectivas teóricas y críticas que dan cuenta del fenómeno hacker como una definición abierta que puede ser leída como práctica ciudadana y cotidiana. Si bien se tocarán algunos prototipos de manera tangencial, en énfasis en los mismos | | | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
trazando la historia de mi pertenencia a dichas comunidades; y por otro desde como
dicha cultura encarna en el hackerspace HackBo, donde esta investigación ocurre,
caracterizando maneras de hacer en la comunidad de práctica y colocando lo anterior en
diálogo con perspectivas teóricas y críticas que dan cuenta del fenómeno hacker como una
definición abierta que puede ser leída como práctica ciudadana y cotidiana.
Si bien se tocarán algunos prototipos de manera tangencial, en énfasis en los mismos
se hará en los capítulos siguientes, que mostrarán las sucesivas interaciones de ellos,
en el contexto comunitario e interpersonal antes mencionado, dándo cuenta así de los
procesos de investigación no líneal mencionados por Leinonen, en los que la indagación
contextual y diseño participativo en comunidad, pasa por ciclos privados de trabajo por expertos,
que luego producen prototipos que regresan a la comunidad.
\section{Mi lugar en la comunidad}\label{mi-lugar}
La metodología de esta investigación, al igual que algunas mencionadas en la primera
parte, está \emph{informada} etnográficamente (sin ser del todo una investigación
etnográfica) y por ello es importante establecer mi lugar en la comunidad.
Para esto lo ubicaré en dos ejes: uno de ellos como activista y miembro
|
| ︙ | ︙ | |||
688 689 690 691 692 693 694 | ``la gente usa el lenguaje para describirse a sí misma y sus relaciones con los otros y cómo el lenguaje los convoca a hacer cosas con palabras y palabras con cosas que los enactuan a sí mismos''. Para estos autores esta configuración desde la auto-descripción y la auto-convocatoria (de la gente hacia y para la gente) implica entender cómo actuán en Internet, no sólo frente a cómo hablan, sino desde cómo se involucran y actuan desde dicha red y en conexión con el mundo fuera de ella, pero interconectado con la misma. | < | | 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 |
``la gente usa el lenguaje para describirse a sí misma y sus relaciones con los otros y
cómo el lenguaje los convoca a hacer cosas con palabras y palabras con cosas que los enactuan
a sí mismos''.
Para estos autores esta configuración desde la auto-descripción y la auto-convocatoria
(de la gente hacia y para la gente) implica entender cómo actuán en Internet, no sólo frente
a cómo hablan, sino desde cómo se involucran y actuan desde dicha red y en conexión con el
mundo fuera de ella, pero interconectado con la misma.
Así, en la medida en que las fuerzas de obediencia, sumisión y subversión están
presentes en los ciudadanos, estos no solo están sujetos \emph{al} poder, sino que son sujetos
\emph{de} poder, pues la presencia de una fuerza no excluye las otras.
Dicho poder lo ejercen de distintas maneras, atendiendo a `actos de verdad' en los
que se manifiestan sus personas políticas y que dan cuenta de esa miriada de actos,
prácticas y pensamientos que atienden al llamado sobre cómo gobernarse a sí mismo,
por un lado, y por otro hacen del sujeto que se pregunta eso, el lugar y laboratorio
primero de las exploraciones y respuestas sobre el autogobierno.
|
| ︙ | ︙ |
Added Tesis/Escrito/TextoIntegrado/manifest.lua.
> > > > > > > | 1 2 3 4 5 6 7 | --[[ I'm the manifest of a set of LaTeX files. I'm used to create a cryptographic hash, i.e. a unique number and letters combination to designate a set of files. I'm created by running the script revmarker.lua ]] ["materialidades","dataviz-infra","pre","preface","introduction","parte1","math","modelling-background","nd-modelling","parte2","parte3","operations-background","extrusion","incremental-construction","linking-lods","slicing","cleaning","conclusions","dictionary","summary","cv"] |
Changes to Tesis/Escrito/TextoIntegrado/parte1.tex.
1 2 3 4 5 6 7 8 9 10 11 |
% !TEX root = tesis.tex
%----------------------------------------------------------------------------------------
% PARTE 1
%----------------------------------------------------------------------------------------
\part{Perspectivas teóricas, críticas y metodológicas}
\label{part:perspectivas}
\restoregeometry
| | | < | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
% !TEX root = tesis.tex
%----------------------------------------------------------------------------------------
% PARTE 1
%----------------------------------------------------------------------------------------
\part{Perspectivas teóricas, críticas y metodológicas}
\label{part:perspectivas}
\restoregeometry
\emph{¿Cuál lugar ocupa esta tesis, desde lo epistemológico, axiológico y metodológico?}
Esta será la pregunta que se abordará en esta sección.
Para ello se realizará una panorámica de las distintas
epistemologías, se sugerirá una manera de conectarlas
y se usará una aproximación de \emph{zoom} para modificar la teoría de diseño de
\cite{jonas_design_2004,jonas_design_2007}, conectándola con la perspectiva crítica de
\cite{fuchs_autopoiesis_nodate}, cambiando el énfasis en lo social, de lo comunicativo a lo humano,
lo cual tiene repercusiones en cómo se puede investigar desde y para el diseño, específicamente
permitiendo concebir aproximaciones metodológicas al diseño que suponen al investigador/diseñador
como sujeto político, que co-diseña y habita un problema/prototipo
dentro de una comunidad (de práctica o interés) apostando
por un mundo más plural e incluyente, es decir apostando por una axiología particular.
Se finaliza con una metodología de diseño basada en investigación,
que propone al software como hipótesis, lo cual conecta las epistemologías
del diseño, contextuales y no orientadas a producir saberes
positivistas y verdades, sino saberes contextuales e hipótesis,
con la forma que tales hipótesis toman como artefactos de software
desarrollados dentro de una comunidad.
Esto permitirá entender los lugares de mirada
|
| ︙ | ︙ | |||
527 528 529 530 531 532 533 | y los individuos en ellas dejen de persistir, al margen de la popularidad. Son artefactos que hacen sentido para las personas y colectivos alrededor de ellos, que los usan y los (re)hacen de modo permanente y abordan de modo paralelo dos los problemas planteados por Sanders, pues el sentido y la filiación ayudan a resolver en simultánea el deseo y la utilidad. Algo similar se puede decir del quehacer artesanal, que se centra en lo útil, bello y usable, sin pretensiones grandilocuentes, sino ocupándose | | | 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 |
y los individuos en ellas dejen de persistir, al margen de la popularidad.
Son artefactos que hacen sentido para las personas y colectivos alrededor
de ellos, que los usan y los (re)hacen de modo permanente y abordan
de modo paralelo dos los problemas planteados por Sanders, pues el sentido
y la filiación ayudan a resolver en simultánea el deseo y la utilidad.
Algo similar se puede decir del quehacer artesanal, que se centra en
lo útil, bello y usable, sin pretensiones grandilocuentes, sino ocupándose
los problemas desde la unidad del hacer-pensar que menciona \cite{sennett_artesano_2009}.
Sin embargo, esta otra mirada del diseñar como actividad inherentemente
humana no ocurre centrada en las comunicaciones,
sino en los actos de sentido de las personas y las comunidades de práctica
que constituyen y habitan, es decir está centrada en lo humano y su relación
con el mundo.
Las comunidades de práctica son un puente que no sólo permiten pasar de
|
| ︙ | ︙ | |||
665 666 667 668 669 670 671 |
%----------------------------------------------------------------------------------------
% CHAPTER 2
%----------------------------------------------------------------------------------------
\chapter{De todos los mundos posibles, uno potenciador de lo humano, emancipador y construido en comunidad}\label{mundos-posibles-humanos-comunitarios}
En la diversidad de saberes y perspectivas epistemológicas que hay
| | | | | 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 |
%----------------------------------------------------------------------------------------
% CHAPTER 2
%----------------------------------------------------------------------------------------
\chapter{De todos los mundos posibles, uno potenciador de lo humano, emancipador y construido en comunidad}\label{mundos-posibles-humanos-comunitarios}
En la diversidad de saberes y perspectivas epistemológicas que hay
en diseño, tanto las mencionadas brevemente al comienzo de este escrito como
muchas que no, hay una cosa el común: el diseño es una actividad humana que
se ocupa del mundo posible.
La búsqueda de dicho mundo tiene dos preguntas importantes:
¿Cuál mundo de entre todos? y ¿Cómo lo creamos? Si estas preguntas reflejan preocupaciones
claves para el diseño, la formación doctoral en diseño debería ayudarnos a contestarlas,
así que el papel de la investigación en las tentativas de solución a esas
dos preguntas, también es un tema de esta sección.
Las secciones precedentes nos permitieron un recorrido que nos deja ahora
|
| ︙ | ︙ | |||
729 730 731 732 733 734 735 |
esta realidad en interacciones con el otro.
Nuestro abordaje puede ser clasificado como una variedad del realismo crítico''.
\end{itemize}
No creo que todas las preguntas preguntas sobre el deseo o lo bello, o el poder
se puedan colocar en perspectiva materialista.
Pero indudablemente el diseño debe ocuparse de un mundo posible
| | | 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 |
esta realidad en interacciones con el otro.
Nuestro abordaje puede ser clasificado como una variedad del realismo crítico''.
\end{itemize}
No creo que todas las preguntas preguntas sobre el deseo o lo bello, o el poder
se puedan colocar en perspectiva materialista.
Pero indudablemente el diseño debe ocuparse de un mundo posible
con mayores garantías para la busqueda de sentido y potencial personal y comunitario
para todos y todas y con el sostenimiento y diversidad de la vida presente\footnote{
No me ocuparé acá de si queremos diseñar otras creaturas vivas, pues no es el
texto ni el momento para abordarlo, sin embargo, el sostenimiento de la
vida presente, salvo los supervirus y otros entes vivos por el estilo
si me parece una compromiso asumible. Las negociaciones en la diversidad podrían
terminar con alguna de ella y son un tema sensible para el cual no hay espacio
suficiente}
|
| ︙ | ︙ |
Changes to Tesis/Escrito/TextoIntegrado/parte2.tex.
| ︙ | ︙ | |||
8 9 10 11 12 13 14 | \restoregeometry En la primera parte se habló de como el diseñador ``habitaba el prototipo'' cuando se acercaba a las comunidades y codiseñaba con ellas. También se reconoció el caracter de investigador como sujeto político, que no intenta describir objetivamente un fenómeno, sino que está involucrado con él | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | \restoregeometry En la primera parte se habló de como el diseñador ``habitaba el prototipo'' cuando se acercaba a las comunidades y codiseñaba con ellas. También se reconoció el caracter de investigador como sujeto político, que no intenta describir objetivamente un fenómeno, sino que está involucrado con él íntimamente. Una metodología consecuente con esta forma de conocer % está de la mano de las epistemologías feministas y se crea un viraje desde la observación participativa a la participación observante. %REF: participatory observation Los capítulos de esta segunda parte describen el problema y los prototipos desde esa perspectiva inmersa en la comunidad y si bien inician con una pregunta/objetivo relativamente claro en esta narrativa organizada que demanda la academia, |
| ︙ | ︙ | |||
37 38 39 40 41 42 43 | El capítulo 5 enfatizan varios ciclos de indagación comunitaria, diseño participativo, diseño de producto y prototipo como hipótesis, con los artefactos y dinámicas que antecedieron y fueron clave para la creación de Grafoscopio y el Data Week, mientras que los capítulos 6, 7 y 8 dan cuenta de los mismos ciclos para los artefactos y dinámicas centrales de esta tesis: el capítulos 6 se centra en Grafoscopio, el 7 en las dinámicas comunitarias que lo configuraron y se dieron gracias a este y el 8 en los protipos individuales y colectivos que muestran la amplificación de voces críticas | | > > | | 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
El capítulo 5 enfatizan varios ciclos de indagación comunitaria, diseño participativo,
diseño de producto y prototipo como hipótesis, con los artefactos y dinámicas que antecedieron
y fueron clave para la creación de Grafoscopio y el Data Week, mientras que los capítulos
6, 7 y 8 dan cuenta de los mismos ciclos para los artefactos y dinámicas centrales
de esta tesis: el capítulos 6 se centra en Grafoscopio, el 7 en las dinámicas
comunitarias que lo configuraron y se dieron gracias a este y el 8 en los
protipos individuales y colectivos que muestran la amplificación de voces críticas
gracias a Grafosocopio y el Data Week, que efectivamente nos cambiaron en la forma
de realizar prácticas ciudadanas, desde los artefactos digitales que podíamos desplegar,
intervenir, interconectar y transformar.
Lo anterior evidencia como los ciclos de realimentación de las fases de la investigación
basada en diseño producían prototipos de software que se iban modificando progresivamente
hasta llegar a aquellos que se consolidaron finalmente y cómo se entrelazan con
las dinámicas comunitarias y los cambios en ellas.
Obsérvese que la intensión no es evaluar los prototipos desde una mirada positivista
y reduccionista, sino dar cuenta de cómo ellos consolidan comunidades alrededor y
las transformas, junto a interpretaciones críticas del proceso.
El recuento de esas transformaciones en esos cinco capítulos de la segunda parte es el
recuento del despliegue de la metodología de esta tesis, que acá se pone en diálogo
recurrente con perspectivas críticas, teóricas y tecnológica.
Mientras la primera parte es más teórica y no se centra mucho en tecnologías o artefactos
específicos, esta segunda parte es más práctica y se centra en ellas.
Sin embargo además de ciertas interpretaciones teóricas a lo largo de estos capítulos,
la mayoría cierra con un breve recuento que conecta el capítulo con la teoría de la primera
parte, preparando el diálogo que se presenta en la tercera parte.
\input{hacker}
\input{prehistoria}
\input{grafoscopio}
\input{dataweek}
\input{prototipos}
|
Changes to Tesis/Escrito/TextoIntegrado/parte3.tex.
| ︙ | ︙ | |||
13 14 15 16 17 18 19 |
Este capítulo cierra la tesis recogiendo los resultados y hallazgos, reflexionando
sobre ellos y las conexiones con otras investigaciones venideras y futuralidades.
\section{Problemas difusos, prototipos y ciudadanías}
Al comienzo de esta tesis se afirmó que el diseño era un saber en red, con epistemologías
| | | | | | | | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Este capítulo cierra la tesis recogiendo los resultados y hallazgos, reflexionando
sobre ellos y las conexiones con otras investigaciones venideras y futuralidades.
\section{Problemas difusos, prototipos y ciudadanías}
Al comienzo de esta tesis se afirmó que el diseño era un saber en red, con epistemologías
particulares, que se ocupaba de problemas difusos (con enunciación difícil), en los que los prototipos
son, a la vez, un laboratorio, para explorar los problemas y llegar a hipótesis plausibles y un medio
para comunicar tanto el problema como las hipótesis sobre este (\cite{saikaly_approaches_2005}).
Dentro de las múltiples epistemologías en diseño, se adoptó una desde la perspectiva de
\cite{jonas_design_2004, jonas_design_2007}, que habla del diseño como un puente entre entidades de
caracter autopoiético, que se crean a sí mismas (lo mental, lo social y lo biológico) y heteropoiético,
que son creadas por otras (los mecanimos y lo artefactual), estableciendo un aporte desde la crítica de
\cite{fuchs_autopoiesis_nodate} a la teoría social de Luhmann, empleada por Jonas como base y cambiando
el fundamento de lo social de las comunicaciones a lo humano, revisando las consecuencias de dicho cambio
en la teoría original y derivando implicaciones para esta tesis, tanto axiológicas y metodológicas, respecto
al investigador como sujeto político y las comunidades como exploradoras de mundos posibles en los que este
investigador se encuentra implicado profundamente, extrapolando las ideas de \cite{manzini_emerging_2013}
sobre innovación social emergente.
Algunas de las tensiones que Jonas planteaba originalmente se resolvían desde este nuevo enfoque,
particularmente la naturaleza contingente de los artefactos, pues dicha naturaleza daba cuenta de
como ellos podían ser reconfigurados o recreados particularmente estudiando puntos de bifurcación
históricos y mezclando tradiciones, ahora con el beneficio del conocimiento en retrospectiva.
También vimos que otras tensiones exploradas sobre la belleza y la utilidad eran revertidas en las
comunidades de práctica, donde lo útil predomina, así no se adecue a las estéticas más generalizadas
de lo bello.
|
| ︙ | ︙ | |||
75 76 77 78 79 80 81 | con lo cual aumentarían su autonomía y su capacidad de agencia. Los primeros artefactos eran web, debido al auge de la misma y construidos en Python, y aunque tenían esa propiedad de ser modificados en ejecución desde el artefacto mismo (gracias al framework que empleé para construirlos, web2py), sus usos fueron instrumentales y no convocaron al grueso de la comunidad de HackBo a modificarlos activamente, una vez los usos básicos estuvieron listos. Esto llevó a exploraciones más arriesgadas desde tecnologías con un caracter auto-referencial, | | > > | | 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
con lo cual aumentarían su autonomía y su capacidad de agencia.
Los primeros artefactos eran web, debido al auge de la misma y construidos en Python, y aunque
tenían esa propiedad de ser modificados en ejecución desde el artefacto mismo (gracias al framework
que empleé para construirlos, web2py), sus usos fueron instrumentales y no convocaron
al grueso de la comunidad de HackBo a modificarlos activamente, una vez los usos básicos estuvieron
listos.
Esto llevó a exploraciones más arriesgadas desde tecnologías con un caracter auto-referencial,
más explícito, si bien menos populares, como Pharo, que permitió escribir Grafoscopio de modos mucho
más fluidos que los explorados previamente en los talleres de Indie Web Science (que modificaban o
extendían IPython con web2py), marcando, desde su modificabilidad extrema, una diferencia importante
con otros sistemas que se enmarcan en búsquedas similares (véase capítulo \ref{grafoscopio}).
También se establecieron aproximaciones consecuentes con las epistemologías de diseño que se
relacionan con el prototipo y la comprensión desde la acción, alejándose de perspectivas más
ingenieriles y aproximándose a aquellas más artesanales (\cite{sennett_artesano_2009}), incluso
asociadas a cómo se entiende y hace el software (\cite{blackwell_craft_2015}).
Además se lanzó un ciclo de \emph{bootstrapping} en el que un software para escribir (Grafoscopio),
era empleado para escribir sobre el software (artículos y manuales) al comienzo y luego sobre
otros temas de investigación y activismo, incluyendo varias visualizaciones (revisandos en el capítulo
|
| ︙ | ︙ | |||
104 105 106 107 108 109 110 | cuenta de un conjunto de tensiones dentro de los procesos comunitarios, particularmente en las comunidades de software libre respecto a pocos autores activos y una comunidad de participación periférica. Estas dinámicas de participación con sus tensiones y posibilidades, permite retomar o crear nuevos prototipos que a su vez amplifican las posibilidades de las comunidades de base de interactuar con instituciones públicas e iniciativas internacionales (como se mostró en detalle en los | | | 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
cuenta de un conjunto de tensiones dentro de los procesos comunitarios, particularmente en las
comunidades de software libre respecto a pocos autores activos y una comunidad de participación
periférica.
Estas dinámicas de participación con sus tensiones y posibilidades, permite retomar o crear nuevos
prototipos que a su vez amplifican las posibilidades de las comunidades de base de interactuar
con instituciones públicas e iniciativas internacionales (como se mostró en detalle en los
capítulos \ref{dataweek} y \ref{prototipos}).
Es decir que la pregunta difusa sobre cómo cambiamos los artefactos que nos cambian, muestra
un conjunto de cambios detonados por el prototipo inicial de Grafoscopio en la comunidad original
donde este se desarrolla, convocando a una comunidad más pequeña, que atiende un conjunto de
convocatorias (o llamamientos dentro de los actos digitales de \cite{isin_being_2015}) que les
permiten consolidarse como comunidad y también realizar un conjunto de aperturas (de nuevo citando
a Isin y Ruppert) de participación e infraestructuras en interacción con gobiernos y otras comunidades.
Estos cambios no estaban previstos en la pregunta original, sino que se desarrollaron de manera
|
| ︙ | ︙ | |||
135 136 137 138 139 140 141 |
sino a cómo esta amplificaba sus voces como comunidad.
El caracter de meta-sistema de Pharo alentó prácticas ágiles\footnote{Mucho más ágildes de las
que se probaron con otros lenguajes como Python, en los primeros estados de la metodología}
(de visualización, documentación y modificación de los artefactos) que permitieron a una comunidad
nacientes de hackers cívicos configurarse como tal y amplificar sus voces desde las tecnologías
digitales explicitando un diálogo estructura-agencia y cómo el diseño puede facilitar transiciones
hacia otros mundos donde varios futuros convivan, en lugar de aquellos que sólo ven las tecnologías
| | | | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
sino a cómo esta amplificaba sus voces como comunidad.
El caracter de meta-sistema de Pharo alentó prácticas ágiles\footnote{Mucho más ágildes de las
que se probaron con otros lenguajes como Python, en los primeros estados de la metodología}
(de visualización, documentación y modificación de los artefactos) que permitieron a una comunidad
nacientes de hackers cívicos configurarse como tal y amplificar sus voces desde las tecnologías
digitales explicitando un diálogo estructura-agencia y cómo el diseño puede facilitar transiciones
hacia otros mundos donde varios futuros convivan, en lugar de aquellos que sólo ven las tecnologías
digitales de manera enajenante, específicamente desde miradas capitalistas neoliberales que tienen
a hacer los mundos convergentes en uno sólo, denunciados por \cite{escobar_autonomiy_2016}.
Esta tesis muestra una manera específica en que al cambiar los artefactos que nos cambian, participamos
de otros diseños en la forma de ser (de comunidades y sus participantes) o diseños ontológicos, de
interlocutar (desde y entre las comunidades y hacia las instituciones) y en ese sentido se alinea
con los diseños para la autonomía.
En este difícil balance entre teoría y práctica que la tesis intenta, habría que trazar un derrotero
sobre los cambios futuros en artefactos y dinámicas que la tesis muestra y sobre las investigaciones
|
| ︙ | ︙ |
Changes to Tesis/Escrito/TextoIntegrado/pre.tex.
| ︙ | ︙ | |||
119 120 121 122 123 124 125 |
\vfill
\pdfbookmark[1]{Comité doctoral}{thesis:committee}
\noindent Esta disertación ha sido aprobada por
\medskip\noindent
\begin{tabular}{@{}ll@{}}
| | | | | | | | | | | | | | 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
\vfill
\pdfbookmark[1]{Comité doctoral}{thesis:committee}
\noindent Esta disertación ha sido aprobada por
\medskip\noindent
\begin{tabular}{@{}ll@{}}
\quad{}Jurado 1: & Dr.\ Eduardo \ Navas \\
\quad{}Jurado 2: & Dr.\ Alexis \ Guerra \\
%\\
%\multicolumn{2}{@{}l@{}}{Composición del comité doctoral:} \\
%\\
% \quad{}Nombre & cargo \\
% \quad{}Prof.\ dr.\ J.\ Stoter & Delft University of Technology, promotor \\
% \quad{}Dr.\ H.\ Ledoux & Delft University of Technology, copromotor \\
%\\
%\multicolumn{2}{@{}l@{}}{Miembros Independientes:} \\
%\\
% \quad{}Prof.\ dr.\ E.\ Eisemann & Delft University of Technology \\
% \quad{}Prof.\ dr.\ M.\ van\ Kreveld & Utrecht University \\
% \quad{}Dr.\ R.\ Lindenbergh & Delft University of Technology \\
% \quad{}Prof.\ dr.\ ir.\ A.\ van\ Timmeren & Delft University of Technology \\
%\\
%\multicolumn{2}{@{}l@{}}{Otros miembros:} \\
%\\
% \quad{}Dr.\ G.\ Damiand & Claude Bernard University Lyon 1 \\
\end{tabular}
%This research was supported by mutabiT S.A.S a small famility enterprise
\begin{custom-dedication}
|
| ︙ | ︙ |
Changes to Tesis/Escrito/TextoIntegrado/prehistoria.tex.
| ︙ | ︙ | |||
421 422 423 424 425 426 427 | por su soporte para referencias bibliográficas, notas al pie, metadatos expresado en YAML; la integración con el gestor blbiográfico Zotero para manejar dichas referencias y la creación de una colección abierta en el mismo para el doctorado, (que alcanzó más de 3400 items desde entonces), así como reiterar el uso de Fossil, un sistema de control de versiones distribuido, minimalista, autocontenido ligero y fácil de usar para publicar archivos de textos, imagen, código fuente y su historia. En un repositorio público de Fossil, que había creado para el doctorado desde el 2011, coloqué | | | 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 |
por su soporte para referencias bibliográficas, notas al pie, metadatos expresado en YAML; la
integración con el gestor blbiográfico Zotero para manejar dichas referencias y la creación de
una colección abierta en el mismo para el doctorado, (que alcanzó más de 3400 items desde entonces),
así como reiterar el uso de Fossil, un sistema de control de versiones distribuido, minimalista,
autocontenido ligero y fácil de usar para publicar archivos de textos, imagen, código fuente y
su historia.
En un repositorio público de Fossil, que había creado para el doctorado desde el 2011, coloqué
los escritos hechos y exportados desde Leo\footnote{véase: \url{https://mutabit.com/repos.fossil/doctorado-offray/}},
y que ha contenido la historia de varios artefactos creados durante el mismo, incluida esta misma tesis.
Las piezas de infraestructura se estaban juntado.
Pero la infraestructura misma era un medio y un fin para comunicar y explorar las ideas
sobre autonomía, cumpliendo los postulados de \cite{saikaly_approaches_2005}, y los
prototipos desarrollados en ella permitían recorridos específicos en los que las
infraestructuras cambian y se combinan para permitir argumentos más específicos sobre
|
| ︙ | ︙ |
Changes to Tesis/Escrito/TextoIntegrado/prototipos.tex.
| ︙ | ︙ | |||
477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
Latinoamérica (específicament México) con similitudes sorprendentes, a pesar de que consideraban
el activismo en el mundo editoral y no en el de los datos.
Entre tales similitudes estaban: el uso de los mismos lenguajes de etiquetamiento ligeros
(Markdown y Pandoc), la crítica al procesador de palabras y otros software comerciales, el hecho de
que la lectura y escritura ahora se hace desde y para dispositivos multi-pantalla (computadores, tabletas).
Este proyecto configuró así aprendizajes que perdurarían y se consolidarían en esta práctica de escritura
y otras venideras (váse sección \ref{bidibog} y el capítulo \ref{conclusiones-y-posibilidades-futuras}).
La automatización para las tareas de apertura del Manual implicó el uso de lenguajes externos
a Pharo, particularmente Lua\footnote{\url{https://www.lua.org/}}, que ya viene incluido en Pandoc,
y que permite acceder y programar la funcionalidad del mismo, incluyendo el acceso al árbol del
documento que emplea Pandoc para representar los formatos que reconoce y también realizar
transformaciones entre ellos.
De este modo las ideas de los participantes se pudieron implementar de maneras más elegantes,
| > > > > > > > > > > > > | 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 |
Latinoamérica (específicament México) con similitudes sorprendentes, a pesar de que consideraban
el activismo en el mundo editoral y no en el de los datos.
Entre tales similitudes estaban: el uso de los mismos lenguajes de etiquetamiento ligeros
(Markdown y Pandoc), la crítica al procesador de palabras y otros software comerciales, el hecho de
que la lectura y escritura ahora se hace desde y para dispositivos multi-pantalla (computadores, tabletas).
Este proyecto configuró así aprendizajes que perdurarían y se consolidarían en esta práctica de escritura
y otras venideras (váse sección \ref{bidibog} y el capítulo \ref{conclusiones-y-posibilidades-futuras}).
\begin{figure*}[tbh]
\includegraphics[angle=-90, width=1.1\linewidth]{./Parte2/pandoc-diagram.jpg}%
\caption[toc]
{Formatos de entrada y salida permitidos por Pandoc.
Arriba los formatos de entrada, abajo los formatos de salida.
La gráfica ampliada se puede ver en \url{https://pandoc.org/}.
El acceso a todos estos formatos y la automatización para ellos se abrió, gracias a
los \emph{scripts} en Lua, realizados para el proyecto del Manual de Periodismo de Datos
e integrados en Grafoscopio.}%
\label{fig:pandoc-diagram}%
\end{figure*}
La automatización para las tareas de apertura del Manual implicó el uso de lenguajes externos
a Pharo, particularmente Lua\footnote{\url{https://www.lua.org/}}, que ya viene incluido en Pandoc,
y que permite acceder y programar la funcionalidad del mismo, incluyendo el acceso al árbol del
documento que emplea Pandoc para representar los formatos que reconoce y también realizar
transformaciones entre ellos.
De este modo las ideas de los participantes se pudieron implementar de maneras más elegantes,
|
| ︙ | ︙ | |||
504 505 506 507 508 509 510 |
que constituyen tanto Pharo como Lua y las capacidades de metaprogramación.
Poner estos dos extremos complementarios en diálogo a través de proyectos específicos y
prácticos, como este Manual, de modo que se aprovecharan las fortalezas de cada uno y se
mostraran a los asistentes diversos paradigmas de programación, fue una exploración
interesante y primera, que valdría la pena extender en futuros proyectos, como
la extensión de Brea (véase \ref{brea}).
| | | | | | | | | > | > > | | < < < < < < < < < < < < < < < > | 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 |
que constituyen tanto Pharo como Lua y las capacidades de metaprogramación.
Poner estos dos extremos complementarios en diálogo a través de proyectos específicos y
prácticos, como este Manual, de modo que se aprovecharan las fortalezas de cada uno y se
mostraran a los asistentes diversos paradigmas de programación, fue una exploración
interesante y primera, que valdría la pena extender en futuros proyectos, como
la extensión de Brea (véase \ref{brea}).
\begin{figure}[tb]
\includegraphics[width=0.8\linewidth]{./Parte2/grafoscopio-code-permisos.png}%
\caption[Permisos en el repositorio de código de Grafoscopio]
{Detalle sobre los permisos en el repositorio de código de Grafoscopio expresado en
su línea de tiempo.
En general la política sobre los permisos para enviar nuevas versiones del código fuente
(\emph{commits}) fue extremadamente abierta: si alguien durante las sesiones de programación
en multitud \emph{mob programming}construía código que fuera funcional respecto a alguna
característica deseada, podía obtener tales permisos de modificación del código fuente,
usualmente primero en el paquete Dataviz y luego en el de Grafoscopio.
Nótese cómo los \emph{committers} se diversifican por un periodo de tiempo, antes de volver
a la autoría mayoritariamente individual.}%
\label{fig:grafoscopio-code-permisos}%
\end{figure}
También fuimos asignando permisos en el repositorio de código de Grafoscopio, (no sólo en el
de documentación del Manual), de modo que los ejercicios de programación en multitud antes
referidos fueran registrados en dicho repositorio por múltiples participantes, reconociendo
sus aportes y mejorando las contribuciones hechas por ellos (véase figura \ref{fig:grafoscopio-code-permisos}).
Sin embargo, tanto en los repositorios de software, como en los de documentación, los
aportes fueron realizados durante los eventos y se volvieron individuales luego de los mismos,
siguiendo las dinámicas habituales.
Otras formas de contribución se sostuvieron luego del evento, por un grupo pequeño de participantes,
(comparado con el total de inscritos en la lista de correo o la de telegram, pero consecuente con el
número de personas que asistían a las Data Rodas) además de las conversaciones sobre edición ramificada,
como entradas a blog\footnote{\url{https://is.gd/mapeda_blog}}, charlas en Telegram o por la lista al
respecto de dicha actividad.
Otros miembro de la comunidad de Grafoscopio sugirió e implementó la propuesta de un Club de
Lectura para el Manual\footnote{\url{https://is.gd/mapeda_club}} usando el sistema de lectura
anota vía Hypothesis, al que ya se ha hecho mención.
Sin embargo, dicha lectura anotada en el club es aún un asunto pendiente en la comunidad,
para esta y otras iniciativas.
Se dispuso una página de portada para el repositorio, que mostraba las diferentes variantes
del Manual (PDF, EPUB, código fuente en Grafoscopio y Markdown) y la inspiración detrás del proyecto,
las entradas a blog de un miembros de la comunidad y se dispuso esta información en inglés y en
español (véase figura \ref{fig:mapeda-portada}).
\begin{figure*}[tb]
\centering
\subfloat[]{
\includegraphics[width=0.32\linewidth]{./Parte2/mapeda-pagina1.png}
\label{subfig:mapeda-pagina1}}
\subfloat[]{
|
| ︙ | ︙ | |||
1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 |
lo requieran, por ejemplo en el diseño de portadas para libros y otras publicaciones
ramificadas que exploraríamos en el segundo semestre de 2018 y/o 2019, así como
los micrositios web que se desarrollarían para el Diplomado en Activismo de Datos+Codigo
y Ciudadanías Digitales.\footnote{El lector notará que este es aún nombre en contrucción
y que en otras partes del texto ha sido referido como el Diplomado en Alfabetismos
y Visualización Críticos de Datos y Código.}
\begin{figure*}[tbh]
\centering
\subfloat[ ]{
\includegraphics[width=0.45\linewidth]{./Parte2/etico-cuestionables.png}
\label{subfig:etico-cuestionables}}
\quad
\subfloat[]{
\includegraphics[width=0.42\linewidth]{./Parte2/etico-reconocimientos.png}
\label{subfig:etico-reconocimientos}}
\caption[Miniportal Etico]
{Miniportal Etico. Izquierda, comportamientos cuestionables. Derecha, comportamientos reconocidos.
Se puede visitar el portal en \url{http://mutabit.com/repos.fossil/etico/}}
\label{fig:etico}
\end{figure*}
| > > > > > > > < < < < < < < < | 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 |
lo requieran, por ejemplo en el diseño de portadas para libros y otras publicaciones
ramificadas que exploraríamos en el segundo semestre de 2018 y/o 2019, así como
los micrositios web que se desarrollarían para el Diplomado en Activismo de Datos+Codigo
y Ciudadanías Digitales.\footnote{El lector notará que este es aún nombre en contrucción
y que en otras partes del texto ha sido referido como el Diplomado en Alfabetismos
y Visualización Críticos de Datos y Código.}
Etico es un miniportal que creé usando algunas de las tecnologías exploradas en Brea
(Fossil y MDL) cuya función era emplear este tipo de infraestructuras ligeras y resilentes
para ``[visibilizar] los actos, agentes y lugares éticos cotidianos, en el comercio,
la producción, el consumo y el gobierno y alertando sobre su ausencia''.
Al igual que Brea, se espera que este ejericio unipersonal pueda escalar a contextos
comunitarios si las condiciones lo requieren.
\begin{figure*}[tbh]
\centering
\subfloat[ ]{
\includegraphics[width=0.45\linewidth]{./Parte2/etico-cuestionables.png}
\label{subfig:etico-cuestionables}}
\quad
\subfloat[]{
\includegraphics[width=0.42\linewidth]{./Parte2/etico-reconocimientos.png}
\label{subfig:etico-reconocimientos}}
\caption[Miniportal Etico]
{Miniportal Etico. Izquierda, comportamientos cuestionables. Derecha, comportamientos reconocidos.
Se puede visitar el portal en \url{http://mutabit.com/repos.fossil/etico/}}
\label{fig:etico}
\end{figure*}
\section{Otros constructos comunitarios}\label{comunidad-artefactos}
A lo largo de las distintas ediciones del Data Week, las Data Rodas y otros encuentros,
se fueron creando otro tipo de constructos comunitarios.
El primero de ellos, y de uso más evidente durante los mismos fueron las libretas
de técnicas para activismo de datos y su compañera la libreta aprendiz, que ya fueron
|
| ︙ | ︙ |
Added Tesis/Escrito/TextoIntegrado/revmarker.lua.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
--[[
I'm useful for traceability of the files involved in the creation of a particular derivated
file from one or several TeX/LaTeX file sources.
I can be used to calculate a unique identifier describing the status for all files involved in
the creation of a particular derivated file (PDF, DVI, HTML, etc.), using as sources the composition
of ona or several TeX or LaTeX files, which can be called from a single root file (the called
files there can also do more calls to other files).
I create a 'manifest.lua' file that calculates the checksum for the given root TeX/LaTeX
source file and its and does the same, recursively, for all files that are called
using the '\include{file}' or '\input{file}' command.
Once I have a such tree (a recursively created table of tables with the files),
I calculated the checksum for the files that are present in the hierachy and in the
file system, with the folder containend this script as its relative root where all
other files routes are calculated.
For example if the file main.tex contains the following lines:
\include{myFile}
\input{../myOtherFile}
I will look for the existence of such files, using as relative root for them, the place
where this script is located, and if they exits, I will calculate their checksum.
IMPORTANT: I need to be located in the same place where the TeX/LaTeX main source file is
located, so all relative paths are the same.
Copyright (C) 2018 Offray Luna Cardenas
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
]]
local preamble =
[[
I'm the manifest of a set of LaTeX files.
I'm used to create a cryptographic hash, i.e. a unique number and letters combination
to designate a set of files.
I'm created by running the script revmarker.lua
]]
function children(fileContents)
-- I Find all the calls for "\include{parameter}" or "\input{parameter}" on a
-- string taken from the contents of a LaTeX file.
local answer = {}
string.gsub(fileContents,"\\include{([^{}]*)}", function(a) table.insert(answer,a) end )
string.gsub(fileContents,"\\input{([^{}]*)}", function(a) table.insert(answer,a) end )
return answer
end
function readAll(file)
local f = assert(io.open(file, "r"))
local content = f:read("*all")
f:close()
return content
end
function createManifestFor(rootFile)
local fileContents = readAll(rootFile)
local json = require ("dkjson")
local manifest,err = io.open("manifest.lua", "w+")
if manifest then
manifest:write("--[[" .. preamble .. "]]\n")
-- manifest:write(fileContents)
manifest:write(json.encode(children(fileContents), { indent = true }))
manifest:close()
print("Manifest file created. Look the 'manifest.lua' file for more details.")
else
print("Error!...", err)
end
end
createManifestFor("tesis-test.tex")
|