forked from gregoriorobles/plantilla-memoria
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmemoria2.tex
1966 lines (1585 loc) · 86.9 KB
/
memoria2.tex
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
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Plantilla de memoria en LaTeX para la ETSIT - Universidad Rey Juan Carlos
%%
%% Por Gregorio Robles <grex arroba gsyc.urjc.es>
%% Grupo de Sistemas y Comunicaciones
%% Escuela Técnica Superior de Ingenieros de Telecomunicación
%% Universidad Rey Juan Carlos
%% (muchas ideas tomadas de Internet, colegas del GSyC, antiguos alumnos...
%% etc. Muchas gracias a todos)
%%
%% La última versión de esta plantilla está siempre disponible en:
%% https://github.com/gregoriorobles/plantilla-memoria
%%
%% Para obtener PDF, ejecuta en la shell:
%% make
%% (las imágenes deben ir en PNG o JPG)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper, 12pt]{book}
%\usepackage[T1]{fontenc}
\usepackage[a4paper, left=2.5cm, right=2.5cm, top=3cm, bottom=3cm]{geometry}
\usepackage{times}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel} % Comenta esta línea si tu memoria es en inglés
\usepackage{url}
\usepackage[dvipdfm]{graphicx}
\usepackage{graphicx}
%\usepackage[utf8]{inputenc}
\usepackage{float} %% H para posicionar figuras
\usepackage[nottoc, notlot, notlof, notindex]{tocbibind} %% Opciones de índice
\usepackage{latexsym} %% Logo LaTeX
%\usepackage{cite}
\usepackage{url}
\title{Dr.Scratch Herramienta de análisis automático de proyectos Scratch}
\author{Cristian David Chushig Muzo}
\renewcommand{\baselinestretch}{1.5} %% Interlineado
\begin{document}
\renewcommand{\refname}{Bibliografía} %% Renombrando
\renewcommand{\appendixname}{Apéndice}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PORTADA
\begin{titlepage}
\begin{center}
\begin{tabular}[c]{c c}
\includegraphics[bb=0 0 194 352, scale=0.25]{logo_vect.png} &
%\includegraphics[scale=0.25]{logo_vect.png} &
\begin{tabular}[b]{l}
\Huge
\textsf{UNIVERSIDAD} \\
\Huge
\textsf{REY JUAN CARLOS} \\
\end{tabular}
\\
\end{tabular}
\vspace{3cm}
\Large
INGENIERÍA EN TELECOMUNICACIONES E INGENIERÍA TÉCNICA EN SISTEMAS
\vspace{0.4cm}
\large
Curso Académico 2014/2015
\vspace{0.8cm}
Trabajo Fin de Carrera
\vspace{2.5cm}
\LARGE
Dr.Scratch Análisis automático de proyectos Scratch
\vspace{4cm}
\large
Autor : Cristian David Chushig Muzo \\
Tutor : Dr. Gregorio Robles \\
Co-Tutor: Jesús Moreno León
\end{center}
\end{titlepage}
\newpage
\mbox{}
\thispagestyle{empty} % para que no se numere esta pagina
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Para firmar
\clearpage
\pagenumbering{gobble}
\chapter*{}
\vspace{-4cm}
\begin{center}
\LARGE
\textbf{Proyecto Fin de Carrera}
\vspace{1cm}
\large
Dr.Scratch Análisis automático de proyectos Scratch
\vspace{1cm}
\large
\textbf{Autor :} Cristian David Chushig Muzo \\
\textbf{Tutor :} Dr. Gregorio Robles Martínez
\end{center}
\vspace{1cm}
La defensa del presente Proyecto Fin de Carrera se realizó el día \qquad$\;\,$
de \qquad\qquad\qquad\qquad \newline de 2015, siendo calificada por el siguiente tribunal:
\vspace{0.5cm}
\textbf{Presidente:}
\vspace{1.2cm}
\textbf{Secretario:}
\vspace{1.2cm}
\textbf{Vocal:}
\vspace{1.2cm}
y habiendo obtenido la siguiente calificación:
\vspace{1cm}
\textbf{Calificación:}
\vspace{1cm}
\begin{flushright}
Fuenlabrada, a \qquad$\;\,$ de \qquad\qquad\qquad\qquad de 2015
\end{flushright}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Dedicatoria
\chapter*{}
\pagenumbering{Roman} % para comenzar la numeracion de paginas en numeros romanos
\begin{flushright}
\textit{Dedicado a \\
mi madre y su incansable \\
esfuerzo de sacar adelante \\
a sus hijos}
\end{flushright}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Agradecimientos
\chapter*{Agradecimientos}
%\addcontentsline{toc}{chapter}{Agradecimientos} % si queremos que aparezca en el índice
\markboth{AGRADECIMIENTOS}{AGRADECIMIENTOS} % encabezado
Ha sido muy duro el camino, pero sin duda ha valido la pena. Afrontar la aventura de
estudiar fuera de mi país natal es uno de mis mayores aciertos
El más grande de mis agradecimientos va dirigido a mi madre, aquella mujer luchadora que
con su esfuerzo ha sacado adelante a tres hijos. Ha sido un ejemplo de cómo se tiene que
conseguir lo que se quiere. Siempre llevo los valores inculcados, las costumbres dadas y
mi identidad en cada paso que doy, cualquier logro conseguido en mi vida se lo debo a ella.
Su pasión, su valor y su amor en todos estos años no sólo me han convertido en un profesional,
sino también en una persona de provechos. Un gracias nunca será suficiente, pero el
agradecimiento de corazón queda plasmado en estas pocas palabras.
También no quisiera olvidarme de mi familia en Quito, siempre han sido constantes los apoyos
recibidos y sin duda el cariño pese a la distancia. Siempre los llevo en el corazón.
Por último, quiero agradecer a mi tutor Gregorio por la oportunidad de trabajar con él y
de participar en esta iniciativa, Dr. Scratch, que tiene un potencial enorme. Además,
me gustaría dar las gracias a Jesús Moreno León, mi co-tutor, por saber guiarme en muchas
fases del proyecto, por su paciencia y por su amabilidad, gracias de verdad.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Resumen
\chapter*{Resumen}
%\addcontentsline{toc}{chapter}{Resumen} % si queremos que aparezca en el índice
\markboth{RESUMEN}{RESUMEN} % encabezado
Este trabajo recoge el desarrollo de una plataforma web, Dr. Scratch, orientada a la
evaluación de proyectos Scratch en relación a aspectos de pensamiento computacional.
El núcleo de Dr. Scratch es \texttt{Hairball}, un framework usado para el análisis estático de
proyectos Scratch a través de una consola Linux. Dr. Scratch presenta los resultados
de Hairball adaptados al público de la aplicación.
El objetivo principal es crear una herramienta automatizada y de fácil uso para el
análisis de proyectos Scratch. Para esto, el interfaz usado es web y trata de ser
lo más amigable posible con el público, especialmente niños y jóvenes que inician
su camino en el mundo de la programación.
El proyecto se ha realizado principalmente con el framework Django en la parte del
servidor, \texttt{Hairball} como núcleo y Bootstrap como framework para el \emph{Front End}.
El proyecto Dr. Scratch se desarrolla dentro de una iniciativa del Grupo de Sistemas
y Comunicaciones (Gsyc) de la universidad Rey Juan Carlos (URJC) que investiga el
impacto del Desarrollo delpensamiento computacional y busca comprobar las destrezas
que se pueden potenciar en el contexto y proceso del aprendizaje de la programación.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Resumen en inglés
\chapter*{Summary}
%\addcontentsline{toc}{chapter}{Summary} % si queremos que aparezca en el índice
\markboth{SUMMARY}{SUMMARY} % encabezado
This work includes the development of a web platform, Dr. Scratch, oriented
Scratch evaluation of projects in relation to aspects of computational thinking.
The core of Dr. Scratch is \texttt {Hairball}, a framework used for static analysis
Scratch projects through a Linux console. Dr. Scratch presents results
\texttt{Hairball} suit the audience of the application. \\
The main objective is to create an automated and easy to use tool for Scratch
analysis projects. For this, the web interface is used and is being as friendly
as possible with the public, especially children and young people starting
its way into the world of programming. \\
The project was carried out mainly with the Django framework of the server,
\texttt{Hairball} of core and Bootstrap framework for the \emph{Front End}. \\
Dr. Scratch project is an initiative within Systems Group and Communications
(GSyC) from the University Rey Juan Carlos (URJC) researching the
development impact of computational thinking skills and looking check
which can be enhanced in the context and process of learning programming.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ÍNDICES %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Las buenas noticias es que los índices se generan automáticamente.
% Lo único que tienes que hacer es elegir cuáles quieren que se generen,
% y comentar/descomentar esa instrucción de LaTeX.
%%%% Índice de contenidos
\tableofcontents
%%%% Índice de figuras
\cleardoublepage
%\addcontentsline{toc}{chapter}{Lista de figuras} % para que aparezca en el indice de contenidos
\listoffigures % indice de figuras
%%%% Índice de tablas
%\cleardoublepage
%\addcontentsline{toc}{chapter}{Lista de tablas} % para que aparezca en el indice de contenidos
%\listoftables % indice de tablas
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INTRODUCCIÓN %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cleardoublepage
\chapter{Introducción}
\label{sec:intro} % etiqueta para poder referenciar luego en el texto con ~\ref{sec:intro}
\pagenumbering{arabic} % para empezar la numeración de página con números
El desarrollo de la tecnología está cambiando nuestros hábitos cotidianos: la forma
en que nos relacionamos con las personas, la manera de trabajar y significativamente
nuestra forma de aprender. El conocimiento ahora es global, al alcance de todos, con
una sencilla búsqueda a través de un dispositivo conectado a internet tenemos incontable
información en nuestras manos. Pero, girando la atención al uso de la tecnología en las
aulas nos encontramos con un uso pasivo, convirtiendo al estudiante en usuario de
aplicaciones. Los escolares, nativos digitales, conocen cómo buscar información en internet
y manejar aplicaciones de una manera natural, pero la tecnología de trasfondo es invisible
para ellos, lo que hace que pierdan muchas oportunidades y retos para su desarrollo en la
enseñanza de programación. \\
La programación en las aulas no es un descubrimiento nuevo, existen desde los años 60 con
\texttt{Logo}. Pero, su popularidad se ha incrementando en los últimos años gracias a nuevas
plataformas y aplicaciones como \texttt{App Inventor}, \texttt{Stencyl}, \texttt{Alice},
\texttt{Etoys} y \texttt{Scratch}. \\
Y es Scratch donde girá el presente proyecto. Scratch ha tenido una penetración importante
en la educación americana, y una de las muchas razones es su facilidad de aprendizaje. Los
bloques gráficos permiten a los usuarios un aprendizaje eficaz, y su entorno amigable permite
la potenciación de la creatividad en el diseño y desarrollo de los proyectos. \\
El objetivo de la programación en edades tempranas es brindar nuevas habilidades a niños y
jóvenes, habilidades necesarias en un entorno digital y globalizado. Encarar procesos de
autocorreción y búsqueda de errores, enfrentarse a retos de resolución de problemas son ejemplos
claros de éstas habilidades. \\
Scratch tiene un plataforma donde los usuarios pueden subir sus proyectos, compartirlos,
comentarlos y aprender de otros, ya que la filosofía es que el contenido sea libre. Actualmente
existen alrededor 9 millones de proyectos alojados en los servidores de Scratch, y la cifra
sigue creciendo. \\
En este contexto aparece Dr. Scratch. Los usuarios de Scratch crean sus proyectos, potencian
su creatividad, generan algoritmos, pero cómo saber si lo que hacen es correcto. Dr. Scratch
nace como la primera herramienta que permite a los usuarios de Scratch analizar sus proyectos
y medir sus capacidades de programación cuantificadas por medidores de habilidades de
pensamiento computacional.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OBJETIVOS %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cleardoublepage
\chapter{Objetivos}
\label{chap:objetivos}
\section{Objetivo general}
\label{sec:objetivo-general}
El objetivo general del proyecto es crear una herramienta y plataforma para que los
usuarios de Scratch puedan evaluar sus proyectos y hacer un seguimiento de su progreso
en relación a habilidades de pensamiento computacional. Esta plataforma debe ser
de fácil usabilidad y adaptado para niños que empiezan en el mundo de la
programación.
\section{Objetivos específicos}
\label{sec:objetivos-especificos}
\begin{itemize}
\item Crear una arquitectura software que permita la convergencia entre el framework
\texttt{Hairball} con las tecnologías web, con el fin de mejorar su usabilidad y
experiencia de usuario. En primera instancia el análisis de los proyectos se hará
subiéndolos a la plataforma en el formato sb2 que corresponde con el tipo de
proyectos Scratch.
\item Crear métodos de extracción y tratamiendo de los datos obtenidos por los
plugins de \texttt{Hairball} y conectarlos con las funcionalidades que ofrece
Django.
\item Construir un modelo de datos que se adapte a la salida de datos que ofrece
\texttt{Hairball} y parametrizarlo con las herramientas ofrecidas por Django.
\item Adaptar el contexto ofrecido por Django a todo el potencial que ofrece Bootstrap
como herramienta de \emph{Front End}, permitiendo crear una plataforma atractiva
desde el punto de vista del diseño y presentación.
\item Introducir técnicas de \emph{ludificación} dentro de la plataforma para atraer
la atención y uso de los usuarios.
\item Permitir un seguimiento de la evolución de los usuarios de Dr. Scratch en
términos de las habilidades de pensamiento computacional adquiridas a lo largo del
uso de la plataforma mediante los proyectos evaluados.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% ESTADO DEL ARTE %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cleardoublepage
\chapter{Estado del arte}
En este capítulo se introducirán las bases tecnológicas más importantes del proyecto.
\section{Scratch}
\label{sec:seccion2}
Scratch es un proyecto del Grupo Lifelong Kindergarten del Laboratorio de Medios del MIT.
Scratch permite programar historias interactivas, juegos y animaciones a través de un
entorno completamente visual. \\
Se fundamenta en el uso de personajes, escenarios y bloques gráficos con una funcionalidad
específica que permite crear una lógica e interacción entre los elementos.
Además Scratch es gratuito, de uso libre, multilenguaje y es muy recomendado para la
iniciación en el mundo de la programación. Su uso se ha intensificado en los últimos años
y dentro de su nube tiene millones de proyectos almacenados que pueden ser compartidos y
vistos por otros usuarios Scratch. \\
Scratch cuenta con alrededor de 9 millones proyectos almacenados en sus servidores, casi
7 millones de usuarios registrados. Los mayores consumidores de Scratch en el mundo son
Estados Unidos de América y Reino Unidom, y entre edades, los niños que más usan Scratch
son los que tienen una media de 13 años. \\
La parte visual, construida por los bloques permite una adaptación más rápida de los niños
con el entorno de programación. Este tipo de enfoque se puede comparar con piezas de puzzle
que tienen que ir encajando para obtener una solución.
\section{Hairball}
\label{sec:seccion3}
\texttt{Hairball} es un framework utilizado para el análisis de proyectos Scratch. Creado
por Bryce Boe en la universidad de Santa Barbara. \texttt{Hairball} se constituye esencialmente de
plugins. Los plugins iniciales fueron desarrollados por la universidad de Santa Barbara, y
a estos se suman otros plugins programados por la universidad Rey Juan Carlos y en concreto
por Jesús Moreno Léon. El framework es de libre acceso y está disponible en la
red.\footnote{\url{github.com/ucsb-cs-education/hairball}}.
La arquitectura de \texttt{Hairball} se fundamenta en la orientación de objetos de Python. El
creador de Hairball elige este lenguaje principalmente por el paquete Open Source \emph{Kurt},
que dota de un acceso simple a todos los elementos contenidos dentro de un proyecto Scratch,
imágenes, sonidos, escenarios, personajes y sobretodo scripts.
Los plugins que se puedan encontrar en la última versión de Hairball son:
\begin{itemize}
\item blocks.DeadCode.
Busca código que no llega a ejecutarse nunca, parametrizándolo en un valor entero.
\item blocks.BlockCounts.
Cuenta el número de bloques asociados al proyecto y devuelve su valor en un entero.
\item initialization.AttributeInitialization.
Busca propiedades de los personajes que son modificadas en algún punto del programa,
pero que no se inicializan al comenzar la ejecución del proyecto. Por cada propiedad
analizada del personaje: posición, tamaño, disfraz, visibilidad y orientación, se
muestra un valor 0 si la propiedad no se modifica, 1 si se modifica pero no se inicializa,
2 si se inicializa correctamente.
\item duplicate.DuplicateScripts.
Busca programas repetidos en el proyecto. Programas que deberían haber sido implementados
con un método definido por el programador.
\item mastery.Mastery.
Asigna una puntuación que indica el grado de maestría demostrado en la programación del
proyecto para diferentes aspectos: abstracción, paralelización, razonamiento lógico,
sincronización, control de flujo, interactividad con el usuario, representación de la información.
\end{itemize}
\section{Python}
\label{sec:seccion4}
Python es un lenguaje de programación de alto nivel, interpretado y sencillo. Gracias a su
semántica y sintaxis regular es más amigable con el desarrollador. Independiente
de la plataforma y orientado a objetos. Destacar que un desarrollo en Python optimiza tiempos para
el programador, sin olvidar que es también gratuito. \\
Python es uno de los lenguajes de scripting más comunes y populares en el mundo Open Source. Existe
innumerable conocimiento a disposición de los programadores y es apoyado por una comunidad muy
activa. Tiene capacidad de modulación y packaging. \\
Características del lenguaje
\begin{itemize}
\item Propósito general. Es posible crear cualquier tipo de programas
\item Multiplataforma. Originalmente se creó para Unix, pero actualmente puede ser usado en
muchas plataformas, siempre que exista un intérprete.
\item Interpretado. No se debe compilar el código.
\item Interactivo. Dispone de un intérprete de comandos en el que se introducen sentencias.
\item Orientado a objetos. Soporta la programación orientada a objetos.
\item Funciones y librerías. Existen disponibles muchas funciones incorporadas en el propio
lenguaje, y en las comunidades Open Source el desarrollo de librerías es importante.
\end{itemize}
\section{Django}
\label{sec:seccion5}
Django es un framework web de código abierto escrito en Python que permite construir aplicaciones
web más rápido y con menos código. Proporciona un conjunto de herramientas para crear aplicaciones
siguiendo los principios de DRY Don't Repeat Yourself, para evitar la duplicidad de líneas de código.
Se basa en el diseño MVC Modelo Vista Controlador, lo que le brinda independencia y permite que
las partes funcionales estén claramente separadas.
Django permite la conexión con distintos sistemas de bases de datos como MySQl, Oracle. \\
Características de Django:
\begin{itemize}
\item Desarrollo Eficaz. Proporciona funcionalidades y abtracciones que permiten el desarrollo
rápido de aplicaciones.
\item Seguro. Ayuda a los desarrolladores a evitar errores comunes de seguridad, tal como, inserción
SQL, Cross-Site Scripting, Cross-Site Request.
\item Escalable. Tiene la capacidad de ser flexible en términos de escalabilidad.
\item Autenticación. Tiene la capacidad de proporcionar mecanismos seguros para gestionar cuentas
de usuario y contraseñas.
\end{itemize}
\section{Bootstrap}
\label{sec:seccion6}
Bootstrap es un framework desarrollado por Twitter para crear interfaces y diseños web responsive
basados en HTML5 y CSS3. Su principal ventaja es la de adaptar la interfaz de la aplicación web
al tamaño del dispositivo desde donde se está accediendo. La documentación ofrecida permite la
construcción de webs de forma eficaz. Según \emph{Wikipedia} es el proyecto más popular de
\emph{Github}. \\
Bootstrap dispone de un soporte casi completo para HTML5 y CSS3. Tiene compatibilidad con la mayoría
de navegadores. Desde la versión 2.0 se impulsa el soporte y funcionalidad \emph{responsive}. Esto
es una de las mayores razones por las que Bootstrap ha tenido tanto éxito, el diseño y presentación
de la página se ajusta dinámicamente a distintos dispositivos. \\
Bootstrap se puede descargar compilado o a través del código fuente original. La estructura de
contenidos que tiene el framework es:
\begingroup
\fontsize{9pt}{10pt}\selectfont
\begin{verbatim}
bootstrap/
|--css/
| |--bootstrap.css
| |--bootstrap.min.css
| |--bootstrap-theme.css
| |--bootstrap-theme.min.css
|--js/
| |--bootstrap.js
| |--bootstrap.min.js
|--fonts/
|--glyphicons-halflings-regular.eot
|--glyphicons-halflings-regular.svg
|--glyphicons-halflings-regular.ttf
|--glyphicons-halflings-regular.woff
\end{verbatim}
\endgroup
Este conjunto de archivos es la manera más sencilla de utilizar Bootstrap en la mayoría
de proyecto web. A continuación se presenta algunas características más específicas
de Bootstrap que hacen que sea tan popular entre diseñadores y programadores web:
\begin{itemize}
\item Posee soporte para los preprocesadores Less y Sass.
\item Posee una documentación muy detallada y abundante.
\item Permite la utilización de JQuery.
\item Se integra con librerías Javascript.
\item Incluye grid system, utilidad para maquetar por columnas.
\end{itemize}
\section{AJAX}
\label{sec:seccion7}
AJAX no es una tecnología en sí mismo, se concibe como la unión de tecnologías independientes
actuando coherentemente y con un objetivo. Las tecnologías que forman AJAX son:
\begin{itemize}
\item XHTML y CSS con el fin de crear la presentación.
\item DOM para la manipulación dinámica de la presentación.
\item XMLy JSON con el fin de intercambio de información.
\item XMLHttpRequest con el objetivo de intercambio asíncrono de información.
\item JavaScript que busca la unión de las demás tecnologías.
\end{itemize}
AJAX permite optimizar la interacción del usuario con la aplicación, evitando las recargas
constantes de página, debido fundamentalmente a que el intercambio de información se
produce en un segundo plano. Para conseguir esta optimización se crea un elemento intermedio
entre el usuario y el servidor. Este elemento mejora la respuesta de la aplicación. \\
Las peticiones HTTP a los servidores se cambian por peticiones JavaScript que se envían al
componente AJAX. Generalmente la respuesta es inmediata si la petición es simple, ya que,
no requiere del uso del servidor. Si por el contrario, requiere la intervención del servidor
la petición se envía de forma asíncrona mediante AJAX.
\section{SDK Mozilla}
\label{sec:seccion8}
El SDK Mozilla \footnote{\url{scratch.mit.edu/}} es un conjunto de librerías que permiten crear
plugins de Firefox utilizando principalmente tecnologías web conocidas como: \emph{JavaScript},
\emph{HTML}, y \emph{CSS}. El SDK trae incorporado un API de \emph{JavaScript} que puede ser
usado para crear complementos y herramientas para generación, funcionamiento, pruebas y
empaquetado de complementos. \\
Los requisitos previos para usar el SDK es tener correctamente instalado Python, en sus versiones
2.5, 2.6, 2.7 y con menos soporte 3.0. El SDK es descargado como un tarball o fichero zip.
Dentro de la plataforma Developers Mozilla existen ejemplos muy útiles que sirven como guión para
el desarrollo de plugins personalizados. \\
Con el SDK Mozilla es posible crear realizar múltiples funciones:
\begin{itemize}
\item Interactuar con el browser. Tener la posibilidad de abrir nuevas ventanas, pestañas, "`escuchar"' la
carga de páginas, cerrar páginas, listar páginas abiertas, etc.
\item Modificación de páginas web. Se puede modificar el contenido de páginas web que coincidan con un patrón
de URL o dinámicamente modificar una pestaña particular.
\item Crear componentes para la interfaz usuario. Permite la creación de componentes de interfaz de usuario, como
por ejemplo, botones de barra de herramientas, menús contextuales, menú y cuadros de diálogo.
puede hacerse por un dispositivo móvil o tablet, sin la pérdida del diseño original.
\item Realizar peticiones AJAX. Permite poder generar peticiones asíncronas mediante AJAX con el fin de establecer
comunicación con otros sistemas o servidores.
\end{itemize}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DISEÑO E IMPLEMENTACIÓN %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cleardoublepage
\chapter{Diseño e implementación}
Este capítulo es el eje principal del proyecto, en el que se describe la arquitectura,
el diseño y se hace una descripción de las funcionalidades más importantes de Dr.
Scratch. Está dividido en tres partes: el servidor basado en Django, el framework
\texttt{Hairball} y el frontEnd basado en Bootstrap.
\section{Arquitectura general}
\label{sec:arquitectura}
La arquitectura de Dr. Scratch se muestra en la figura 4.1. Está claramente identificado
con el modelo cliente-servidor. El usuario a través de un navegador o dispositivo móvil
subirá su proyecto a la platoforma a través de un formulario creado para ello. Esta
petición será recogida por el manejador de Django. Django procesará la petición, recogiendo
la url y asociándola con un método desarrollado dentro de un fichero. En este método
se llamará a los plugins de \texttt{Hairball}, obteniendo los datos necesarios con el
objetivo de parametrizarlos de acuerdo al modelo de datos definido para su correcto
almacenamiento y su posterior extracción. La petición se responderá renderizando
el contenido en un template desarrollado por Bootstrap. \\
La siguiente figura representa la arquitectura de la plataforma. Como se puede observar
sobresalen dos componentes, cliente y servidor. El servidor está formado por Django,
la base de datos y \texttt{Hairball}, mientras en la parte del cliente el desarrollo
se hace a través de Bootstrap. Cabe recordar que no existe una aplicación móvil,
pero gracias a la funcionalidad responsive de Bootstrap, el usuario puede
navegar por Dr. Scratch sin pérdida de la calidad en la presentación. \\
\begin{figure}
\centering
\graphicspath{{img/}}
\includegraphics[bb=0 0 800 600, width=18cm, height=9cm, keepaspectratio]{arquitecturascratch.png}
\caption{Arquitectura de la plataforma Dr. Scratch}
\label{figura:foro_hilos}
\end{figure}
Se describe cada componente de Dr. Scratch.
\begin{itemize}
\item Servidor. Se basa principalmente en Django. Django permite la abstracción de la
base de datos, el modelo vista controlador y la interacción con el componente Front End.
\item \texttt{Hairball}. Es un framework que permite el análisis de proyectos Scratch. Su uso es
a través de una consola bash. Hairball se compone de plugins, para usar cada uno se
tiene que realizar una llamada independiente por consola.
\item Cliente. Generalmente el acceso a la plataforma se hace mediante un navegador. El
desarrollo de la parte Front End se realiza conjuntamente con Django y Bootstrap, este
último permite una funcionalidad responsive lo que permite que el acceso a Dr. Scratch
puede hacerse por un dispositivo móvil o tablet, sin la pérdida del diseño original.
\end{itemize}
\section{Diseño e implementación del servidor}
\label{sec:servidor}
El diseño e implementación del servidor se basa en dos partes representativas. Por un lado todo lo
correspondiente a la plataforma web con Django y por otro la incorporación de la funcionalidad de
\texttt{Hairball} y su correspondiente tratamiento de información. \\
Como se mencionó el desarrollo del servidor se realiza mediante Django. Cuando se instala un proyecto
Django se generan varios ficheros entre los que destacan models.py, urls.py, views.py, settings.py.
En el fichero settings.py principalmente se gestiona la configuración con middlewares, base de datos,
paths para directorios estáticos, especificación de la app, en nuestro caso Dr. Scratch app, y
dependencias con otras aplicaciones. \\
En el fichero models.py es donde se especificará el modelo de datos de la aplicación Django. Gracias
al potencial del framwork esta definición se realiza como si fuesen clases. La clase se corresponde
con una tabla y los atributos con campos de estas tablas. \\
Para diseñar las URLs de la aplicación se utiliza el fichero urls.py, donde se especifica cada url y
su correspondiente método en el fichero views.py. Mencionar que la especificación de url admite
expresiones regulares para capturar más diversidad de recursos.
Por último, en el fichero views.py se crean los métodos que darán la lógica a la aplicación, y esta
estrechamente relacionado con los ficheros urls.py y models.py.
\subsection{Conexión con Hairball}
\texttt{Hairball} provee la salida de datos a través de la consola. Para cada plugin de Hairball se
debe hacer una llamada a través de la consola. En esta sección se detalla con ejemplos las salidas
de cada uno de los plugins usados en Dr.Scratch, ya que esto contribuirá al entendimiento del modelo
de datos del proyecto. \\ \\
Cada uno de los plugins se ejecutan a través de una consola bash y su modo de uso es el siguiente.
\begin{center}
hairball -p "`plugin-hairball"' "`nombre-proyecto-formato-sb2"'
\end{center}
Cabe recordar que los proyectos analizados deben ser obligatoriamente de extensión sb2, que se
corresponde con el tipo de extensión de la última actualización Scratch, 2.0. Para proyectos de
versiones inferiores de Scratch, existe la posibilidad de transformarlos en formato sb2 y poder
usar Dr. Scratch para el análisis. Esto se explicará en el capítulo 5, ya que, es un nuevo
desarrollo hecho por el equipo Dr. Scratch. \\
Para evaluar las salidas de \texttt{Hairball} se usará el proyecto Scratch test-project.sb2,
un desarrollo descargado aleatoriamente a través de la nube de
Scratch.\footnote{\url{scratch.mit.edu/}} \\
Para usar el plugin DeadCode se hace la siguiente llamada.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
hairball -p blocks.DeadCode test-project.sb2
test-project.sb2
'Stage': [kurt.Script([
kurt.Block('whenIReceive', u'never'),
kurt.Block('startScene', u'castle')], pos=(366, 155)),
kurt.Script([
kurt.Block('whenIReceive', u'yeppers'),
kurt.Block('startScene', u'castle')], pos=(229, 243)),
kurt.Script([
kurt.Block('whenIReceive', u'no'),
kurt.Block('startScene', u'castle')], pos=(85, 312))]
\end{verbatim}
\endgroup
De la salida se deduce que para el proyecto Scratch test-project.sb2 existen 6 bloques de código
muerto, es decir, 6 bloques que no llegan a ejecutarse, y estos bloques pertenecen a 3 scripts.
En el estado del arte se describió que \texttt{Hairball} estaba desarrollado sobre Kurt, en la
salida de este plugin se puede apreciar de que manera trabaja Kurt y sus ventajas. Otro valor
que se almacenará en base de datos en versiones futuras de la plataforma será la información de
la posición asociada a los bloques que no se ejecutan en el flujo del programa. \\
Para el uso del plugin AttributeInitialization se presenta la siguiente salida:
\begingroup
\fontsize{8pt}{8pt}\selectfont
\begin{verbatim}
hairball -p initialization.AttributeInitialization test-project.sb2
test-project.sb2
{u'frozen_elsa_by_meddek-d6w674h': {'position': 2, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0},
u'Sprite8': {'position': 0, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0},
u'ElsaPose': {'position': 2, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0},
u'Sprite4': {'position': 2, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0},
'stage': {'background': 2},
u'Sprite2': {'position': 0, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0},
u'Sprite3': {'position': 2, 'size': 0, 'costume': 1, 'visibility': 2, 'orientation': 0},
u'Sprite1': {'position': 2, 'size': 0, 'costume': 0, 'visibility': 2, 'orientation': 0}}
\end{verbatim}
\endgroup
Este plugin busca propiedades de los personajes que son modificadas en algún punto del
proyecto, pero que no se inicializaron al comenzar el flujo del programa. Las propiedades
de los personajes en general son: position, size, costume, visibility, orientation.
Por cada propiedad analizada de cada personaje se muestra un valor parametrizado: un valor
0 si no ha modificado la propiedad, un 1 si se modifica pero no se inicializa, 2 si se inicializa
correctamente. Por lo tanto como se observa en la salida del plugin las propiedades que tienen
un valor de 1 caen un error de programación, y serán las propiedades que se almacenarán en la
base de datos para su posterior extracción. Mencionar que para el objeto stage, la única
propiedad de la que dispone es background. Esta es la única excepción que no cumpla con
las propiedades de los personajes antes mencionada. \\
Para usar el plugin SpriteNaming se hace la siguiente llamada.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
hairball -p convention.SpriteNaming test-project.sb2
test-project.sb2
5 default sprite names found:
Sprite2
Sprite8
Sprite1
Sprite4
Sprite3
\end{verbatim}
\endgroup
Este plugin busca los personajes del proyecto que han mantenido el nombre por defecto. En
la salida se puede observar un listado de los nombres de esto personajes. Lo que se
almacenará dentro de la base de datos será el nombre por defecto que aparece en el listado
de la salida del plugin. En el ejemplo anterior: Sprite2, Sprite8, Sprite1, Sprite4, Sprite3. \\
Para usar el plugin DuplicateScripts se hace la siguiente llamada.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
hairball -p duplicate.DuplicateScripts test-project.sb2
test-project.sb2
test-project.sb2
1 duplicate scripts found
['when @greenFlag clicked', 'forever', 'if s then s else s',
'hide', 's = s', 'backdrop name']
0 own defined blocks
\end{verbatim}
\endgroup
Este plugin busca programas repetidos en el proyecto, que deben ser implementados por un
método definido por el creador del proyecto. Lo que se almacenará será una variable entera
con el número de programas repetidos. \\
Este plugin busca los personajes del proyecto que han mantenido el nombre por defecto. En
la salida se puede observar un listado de los nombres de esto personajes. Lo que se
almacenará dentro de la base de datos será el nombre por defecto que aparece en el listado
de la salida del plugin. En el ejemplo anterior: Sprite2, Sprite8, Sprite1, Sprite4, Sprite3. \\
Por último, se detalla el plugin que ofrece resultados cuantificables del pensamiento
computacional, y es el más importante desde el punto de vista de información relevante
al usuario, el plugin Mastery.
\begingroup
\fontsize{7pt}{8pt}\selectfont
\begin{verbatim}
\texttt{Hairball} -p mastery.Mastery test-project.sb2
test-project.sb2
{'Abstraction': 2, 'Parallelization': 3, 'Logic': 3, 'Synchronization': 2, 'FlowControl': 2,
'UserInteractivity': 2, 'DataRepresentation': 1}
Total mastery points: 15/21
Average mastery points: 2.14/3
Overall programming competence: Proficiency
\end{verbatim}
\endgroup
Este plugin no tiene presente los errores encontrados en los otros plugins mencionados.
Analiza el proyecto Scratch y asigna una puntuación que cuantifica el grado de expertise
mostrado en la programación para diferentes aspectos del pensamiento computacional: la
abtracción, paralelización, razonamiento lógico, sincronización, control de flujo,
interactividad con el usuario y representación de la información. Cada aspecto tiene
una puntuación máxima de 3, siendo 1 el nivel más básico y 3 un nivel más experto. En
total la suma de los 7 aspectos es 21. El plugin suma los valores obtenidos en cada
aspecto del pensamiento computacional y en función del resultado sacado asigna un
nivel de maestría para el proyecto analizado, siendo los niveles: básico, en desarrollo
y profesional. Si el proyecto supera está entre 0 y 7 recibeel nivel básico, si está
entre 7 y 15 está dentro de desarrollo y si es mayor 15 se encuentra en el nivel
profesional. \\
Esto permite una visión de cómo \texttt{Hairball} funciona. Ahora, se debe adaptar estas
salida para hacerlo compatible con tecnologías web, en este punto entra Django. \\
Django adopta el paradigma modelo vista controlador, y esto permite un desarrollo de
aplicaciones de forma muy rápida. La funcionalidad de Dr. Scratch radica en varios
ficheros que genera Django automáticamente cuando se crea un proyecto, estos son el
fichero urls.py, models.py, forms.py y views.py. \\
Para obtener todos las salidas de los plugins se crean métodos dentro del fichero views.py.
Estos métodos se agrupan dentro de un conjunto denominado \emph{procs}. Estos \emph{procs}
cubren la función de parsing de la salida por consola y los nombres de estos métodos se
corresponden y tienen correlación con los plugins de Hairball. Así pues, para conseguir
los datos del plugin Mastery se construye el \emph{proc} denominado \emph{procMastery}.
Para todos los \emph{procs} se tiene sólo un parámetro de entrada denominado lines, que se
corresponde con un tipo de dato String que viene representar la salida del terminal. \\
Un visión el \emph{procMastery} se presenta a continuación:
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
def procMastery(request,lines):
"""Mastery"""
dic = {}
lLines = lines.split('\n')
d = {}
d = ast.literal_eval(lLines[1])
lLines = lLines[2].split(':')[1]
points = int(lLines.split('/')[0])
maxi = int(lLines.split('/')[1])
d_translated = translate(request,d)
dic["mastery"] = d_translated
dic["mastery"]["points"] = points
dic["mastery"]["maxi"] = maxi
return dic
\end{verbatim}
\endgroup
El \emph{proc} asociado al plugin DuplicateScript cuenta el número de programas
repetidos.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
def procDuplicateScript(lines):
"""Return number of duplicate scripts"""
dic = {}
number = 0
lLines = lines.split('\n')
if len(lLines) > 2:
number = lLines[1][0]
dic["duplicateScript"] = dic
dic["duplicateScript"]["number"] = number
return dic
\end{verbatim}
\endgroup
El \emph{proc} que se corresponde con el plugin DeadCode busca los bloques que no se
llegan a ejecutar asociados a un script.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
def procDeadCode(lines):
"""Number of dead code with characters and blocks"""
lLines = lines.split('\n')
lLines = lLines[1:]
lcharacter = []
literator = []
iterator = 0
for frame in lLines:
if '[kurt.Script' in frame:
# Found an object
name = frame.split("'")[1]
lcharacter.append(name)
if iterator != 0:
literator.append(iterator)
iterator = 0
if 'kurt.Block' in frame:
iterator += 1
literator.append(iterator)
number = len(lcharacter)
dic = {}
dic["deadCode"] = dic
dic["deadCode"]["number"] = number
for i in range(number):
dic["deadCode"][lcharacter[i]] = literator[i]
return dic
\end{verbatim}
\endgroup
El \emph{proc} que se corresponde con el plugin SpriteNaming es procSpriteNaming.
Este método almacena los nombres de los personajes a los que el usuario no
cambio el valor por defecto,
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
def procSpriteNaming(lines):
"""Return the number of default spring"""
dic = {}
lLines = lines.split('\n')
number = lLines[1].split(' ')[0]
lObjects = lLines[2:]
lfinal = lObjects[:-1]
dic['spriteNaming'] = dic
dic['spriteNaming']['number'] = str(number)
dic['spriteNaming']['sprite'] = lfinal
return dic
\end{verbatim}
\endgroup
El \emph{proc} que se corresponde con el plugin AttributeInitialization es
procInitialization. Es el método más complejo, ya que tiene procesar y
buscar las propiedades de cada personaje, y compararlo con el valor que
se parametriza como un error.
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
def procInitialization(lines):
"""Initialization"""
dic = {}
lLines = lines.split('.sb2')
d = ast.literal_eval(lLines[1])
keys = d.keys()
values = d.values()
items = d.items()
number = 0
for keys, values in items:
list = []
attribute = ""
internalkeys = values.keys()
internalvalues = values.values()
internalitems = values.items()
flag = False
counterFlag = False
i = 0
for internalkeys, internalvalues in internalitems:
if internalvalues == 1:
counterFlag = True
for value in list:
if internalvalues == value:
flag = True
if not flag:
list.append(internalkeys)
if len(list) < 2:
attribute = str(internalkeys)
else:
attribute = attribute + ", " + str(internalkeys)
if counterFlag:
number = number + 1
d[keys] = attribute
dic["initialization"] = d
dic["initialization"]["number"] = number
return dic
\end{verbatim}
\endgroup
De este modo, Dr. Scratch transforma las salidas de los plugins a través de \emph{procs}.
Pero, para poder acceder al sistema operativo desde Django se usa en el proyecto la
librería \emph{os} de Python. La librería \emph{os} permite hacer llamadas de sistema y
ejecutar comandos de bash desde programas Python, y en nuestro caso permite ejecutar las
llamadas a los plugins de Hairball desde el fichero views.py de Django. \\
Dentro del paquete \emph{os} se utiliza la función \emph{read} de la clase \emph{popen}.
A esta función se le pasa una variable tipo String con la correspondiente llamada al
plugin de Hairball. Volviendo al ejemplo con el plugin Mastery se utiliza la función
tal que: \\
\begingroup
\fontsize{8pt}{9pt}\selectfont
\begin{verbatim}
os.popen(metricMastery).read()
\end{verbatim}
\endgroup