Copyright
This document is licensed with Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International[3]
Dedicación
Le dedico esto a nadie, porque nadie me ayudo. Excepto al profe Camilo y a la Teresita.
Prólogo
En este proyecto se detalla la planificación de un sistema con las siguientes características:
Fundación Clafira
Es una fundación enfocada en rescatar animales y darles un hogar permanente. Para esto tienen una tienda física donde venden alimentos veganos, además de realizar rifas y otras actividades para dar apoyo al santuario de animales. Desean tener una tienda online donde las personas puedan comprar boletos de rifa y ser premiados. La rifa se sortea automáticamente cada viernes a las 18 horas.
Nivel de Presupuesto: Bajo Estimación de transacciones al día: 1000 Estimación de transacciónes al día (máximo): 5000
Prefacio
ODA AL GATO

Los animales fueron imperfectos, largos de cola, tristes de cabeza. Poco a poco se fueron componiendo, haciéndose paisaje, adquiriendo lunares, gracia, vuelo. El gato, sólo el gato apareció completo y orgulloso: nació completamente terminado, camina solo y sabe lo que quiere.
El hombre quiere ser pescado y pájaro, la serpiente quisiera tener alas, el perro es un león desorientado, el ingeniero quiere ser poeta, la mosca estudia para golondrina, el poeta trata de imitar la mosca, pero el gato quiere ser sólo gato y todo gato es gato desde bigote a cola, desde presentimiento a rata viva, desde la noche hasta sus ojos de oro.
No hay unidad como él, no tienen la luna ni la flor tal contextura: es una sola cosa como el sol o el topacio, y la elástica línea en su contorno firme y sutil es como la línea de la proa de una nave. Sus ojos amarillos dejaron una sola ranura para echar las monedas de la noche.
Oh pequeño emperador sin orbe, conquistador sin patria, mínimo tigre de salón, nupcial sultán del cielo de las tejas eróticas, el viento del amor en la intemperie reclamas cuando pasas y posas cuatro pies delicados en el suelo, oliendo, desconfiando de todo lo terrestre, porque todo es inmundo para el inmaculado pie del gato.
Oh fiera independiente de la casa, arrogante vestigio de la noche, perezoso, gimnástico y ajeno, profundísimo gato, policía secreta de las habitaciones, insignia de un desaparecido terciopelo, seguramente no hay enigma en tu manera, tal vez no eres misterio, todo el mundo te sabe y perteneces al habitante menos misterioso, tal vez todos lo creen, todos se creen dueños, propietarios, tíos de gatos, compañeros, colegas, discípulos o amigos de su gato.
Yo no. Yo no suscribo. Yo no conozco al gato. Todo lo sé, la vida y su archipiélago, el mar y la ciudad incalculable, la botánica, el gineceo con sus extravíos, el por y el menos de la matemática, los embudos volcánicos del mundo, la cáscara irreal del cocodrilo, la bondad ignorada del bombero, el atavismo azul del sacerdote, pero no puedo descifrar un gato. Mi razón resbaló en su indiferencia, sus ojos tienen números de oro.
Abstract
An abstract is a crisp, short, powerful, and self-contained summary of a research manuscript used to help the reader swiftly determine the paper’s purpose. Although the abstract is the first paragraph of the manuscript it should be written last when all the other sections have been addressed.
1. Persona
Se distingue a la "Persona" y a la "Persona Negativa"
1.1. Persona Positiva
1.1.1. Role
Usuario de Plataforma de Mascotas
1.1.2. Name
Alex
1.1.3. Image
1.1.4. Quote
"Me encanta pasar tiempo al aire libre con mis mascotas, descubrir nuevos lugares y apoyar causas que importan. Siempre estoy buscando maneras de ayudar a otros, ya sea de forma voluntaria o simplemente compartiendo mi conocimiento y experiencias."
1.1.5. Background
-
Age: 20 - 50
-
Location: Varias ciudades, tanto urbanas como rurales
-
Marital Status: Diversos estados civiles (solteros, casados, en pareja)
-
Kids: Pueden o no tener hijos
-
Occupation: Empleos diversos (oficinistas, trabajadores independientes, profesionales, estudiantes, etc.)
-
Education: Diversos niveles de educación (desde secundaria hasta estudios universitarios)
1.1.6. Characteristics
-
Empático
-
Solidario
-
Amante de los animales
-
Disfruta de la naturaleza
-
Sociable y amigable
-
Curioso y dispuesto a aprender
1.1.7. Goals/Needs
-
Disfrutar de actividades al aire libre junto a sus mascotas. Explorar nuevos parques, senderos y lugares amigables con los animales.
-
Ayudar a otros que compartan la pasión por los animales, ya sea a través de voluntariado en refugios o apoyando causas solidarias.
-
Mantenerse informado y conectado con otras personas a través de redes sociales, buscando comunidades y grupos afines a sus intereses.
-
Simplificar la vida diaria con soluciones tecnológicas que les permitan gestionar fácilmente las necesidades de sus mascotas.
TECH KNOWLEDGE
-
🟦: Normal
KNOWS STAFF SKILLS
-
🟦: Normal
TIME AVAILABILITY
-
🟦: Normal
1.1.8. About
Los usuarios son personas empáticas y solidarias que tienen, han tenido o planean tener mascotas. Se caracterizan por ser amantes de la naturaleza y disfrutar actividades al aire libre, como pasear por el parque, hacer senderismo o explorar nuevos lugares. Su pasión por los animales los motiva a involucrarse en causas solidarias y apoyar iniciativas relacionadas con el bienestar animal, participando como voluntarios o donando a organizaciones.
Tienen conocimientos suficientes para manejar computadoras y dispositivos móviles, lo que les permite conectarse fácilmente con otras personas a través de redes sociales como Instagram y Facebook. A pesar de su afinidad por la tecnología, siguen disfrutando de medios tradicionales como la televisión. Esto les permite estar informados y seguir contenido variado, desde noticias hasta programas de entretenimiento que se alinean con sus intereses.
Además de su amor por los animales, disfrutan conocer nuevas personas y compartir experiencias. Buscan herramientas y plataformas que simplifiquen la vida cotidiana, especialmente aquellas que les ayudan a cuidar mejor de sus mascotas y a conectar con comunidades afines. Ya sea buscando lugares pet-friendly, servicios de cuidado para sus animales o recursos educativos, quieren soluciones prácticas que mejoren tanto su vida como la de sus compañeros de cuatro patas.
1.2. Persona Negativa
1.2.1. Role
Usuario Negativo de Plataforma de Mascotas
1.2.2. Name
Bastián
1.2.3. Image
1.2.4. Quote
"Me encanta pasar tiempo al aire libre cazando, haciendo asados, vendiendo perros. Tengo que ir a apostar en pelea de gallos y en carreras de galgos."
1.2.5. Background
-
Age: 0 - 90
-
Location: Varias ciudades, tanto urbanas como rurales, mas rurales.
-
Marital Status: Diversos estados civiles (solteros, casados, en pareja)
-
Kids: Pueden o no tener hijos
-
Occupation: Empleos diversos (oficinistas, trabajadores independientes, cazadores, profesionales, estudiantes, etc.)
-
Education: Diversos niveles de educación (desde secundaria hasta estudios universitarios)
1.2.6. Characteristics
-
Poco empatico
-
Poco solidario
-
Detractor de los animales
-
Disfruta de la naturaleza cazando
-
Conflictivo
-
Cerrado de mente, enchapado a la antigua
1.2.7. Goals/Needs
-
Disfrutar de actividades al aire libre matando animales.
-
Ayudar a otros que compartan la pasión por los animales muertos, ya sea a través de asados, rodeos, apuestas, etc.
-
Mantenerse informado y conectado con otras personas a través de redes sociales, buscando comunidades y grupos afines a sus intereses.
TECH KNOWLEDGE
-
🟩: Alto
KNOWS STAFF SKILLS
-
🟨: Bajo
TIME AVAILABILITY
-
🟨: Baja
1.2.8. About
Personas que les gusta la caza, el rodeo, que no son vegetarianos/veganos. Pueden consumir tiempo viendo carreras de animales, apuestas con animales de pelea. Entre 0-90 años. Personas con acceso a redes sociales y conocimiento de tecnologías.
|
Estas decisiones tendrán consecuencias! |
2. Storyboard
3. Selección de Servidor
Selección de servidor

3.1. Hostinger
Dado los recursos limitados y el tipo de Persona, no sería tan necesario un servior de baja latencia, el precio varía enttre 8 a 20 euros, para una alternativa de 5000 visitas diarias. Cuenta con almacenamiento NVME, da latencias de 100us.
|
Esta decisión tendrá consecuencias |
3.1.1. Planes
Que cosas ofrece el plan en cuanto a almacenamiento, concurrencia, CDN, etc.
-
✅ 100 sitios web
-
✅~100 000 visitas al mes
-
✅ 200 GB de almacenamiento NVMe
-
✅600 000 archivos y directorios (inodos)
-
✅Plantillas prediseñadas gratis
-
✅Migración de sitios web automática y gratis
-
✅SSL ilimitado gratis
-
✅Email gratis
-
✅Copias de seguridad diarias y bajo demanda
-
✅Escáner de vulnerabilidades de WordPress
-
✅Actualizaciones automáticas inteligentes de WordPress
-
✅Aceleración WordPress avanzada
-
✅Ancho de banda ilimitado
-
✅Dominio gratis (9,99 €)
-
✅CDN Gratis
-
✅Herramientas de WordPress con IA
-
✅WordPress staging
-
✅Dirección IP dedicada
-
✅Asistencia prioritaria
-
✅WordPress administrado
-
✅Instalación de WordPress con 1 clic gratis
-
✅Migración de sitios web automática y gratis
-
✅Plantillas prediseñadas gratis
-
✅Aceleración de WordPress (LiteSpeed)
-
✅Actualizaciones automáticas inteligentes de WordPress
-
✅Escáner de vulnerabilidades de WordPress
-
✅Comprobador de compatibilidad de WordPress
-
✅WooCommerce Basic
-
✅WordPress multisitio
-
✅WP-CLI y SSH
-
✅El plugin de WordPress Amazon Afiliados gratis.
-
✅WordPress staging
-
✅Object Cache para WordPress
-
✅Copia de seguridad bajo demanda
-
✅Creador de sitios web de Hostinger
-
✅Creador de sitios web con IA
-
✅Editor de arrastrar y soltar
-
✅150 plantillas
-
✅Integraciones de marketing
-
✅Generador de imágenes con IA
-
✅Escritor con IA
-
✅Generador de blogs con IA
-
✅Mapas de calor con IA
-
✅Herramientas de SEO con IA
-
✅Funciones de eCommerce
-
✅Comisiones de transacción del 0 %
-
✅+20 métodos de pago
-
✅Seguridad
-
✅Protección DDoS mejorada
-
✅Firewall de aplicaciones web
-
✅Protección de nameservers Cloudflare
-
✅Escáner de malware
-
✅Administrador de acceso seguro
-
✅Protección de privacidad de dominio WHOIS gratis (9,99 €)
-
✅Servicio y soporte
-
✅Garantía de reembolso por 30 días
-
✅Garantía de 99,9% de uptime
-
✅Centros de datos globales
-
✅Soporte siempre disponible
-
✅Asistencia prioritaria
-
✅Detalles técnicos
-
✅600 000 archivos y directorios (inodos)
-
✅60 PHP workers
-
✅~100 000 visitas al mes
-
✅100 subdominios
-
✅75 conexiones de MySQL MAX
-
✅300 bases de datos
-
✅Cuentas FTP ilimitadas
-
✅Cronjobs ilimitados
-
✅Acceso GIT
-
✅Múltiples versiones de PHP
-
✅Gestión de DNS
-
✅Administrador de caché
-
✅Potente panel de control
-
✅Acceso SSH
4. Base de datos
Base de datos
CREATE TABLE cliente (
id_cliente SERIAL PRIMARY KEY,
mail VARCHAR(255) NOT NULL
);
CREATE TABLE sorteo (
id_sorteo SERIAL PRIMARY KEY,
fecha_sorteo DATE NOT NULL
);
CREATE TABLE boletos (
id_boletos SERIAL PRIMARY KEY,
numero VARCHAR(50) NOT NULL,
id_sorteo INT,
FOREIGN KEY (id_sorteo) REFERENCES sorteo(id_sorteo)
);
CREATE TABLE compraBoletos (
id_cliente INT,
id_boleto INT,
monto DECIMAL(10, 2),
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente),
FOREIGN KEY (id_boleto) REFERENCES boletos(id_boletos)
);
4.1. Diagrama ER
|
La base de datos a seleccionar es PostgreSQL |
4.2. PostgreSQL
PostgreSQL, comúnmente pronunciado "Post-GRES", es una base de datos de código abierto que tiene una sólida reputación por su fiabilidad, flexibilidad y soporte de estándares técnicos abiertos. A diferencia de otros RDMBS (sistemas de gestión de bases de datos relacionales), PostgreSQL (enlace externo a ibm.com) soporta tipos de datos relacionales y no relacionales. Esto la convierte en una de las bases de datos relacionales más compatibles, estables y maduras disponibles actualmente.
4.3. Selección de Base de Datos: PostgreSQL vs. NoSQL y MySQL
4.3.1. ADR Selección de PostgreSQL sobre NoSQL y MySQL
-
Status: accepted
-
Date: 2024-10-18
Context and Problem Statement
El proyecto requiere la selección de una base de datos adecuada para manejar información estructurada relacionada con clientes, boletos y sorteos. Las opciones consideradas incluyen bases de datos relacionales como PostgreSQL y MySQL, así como soluciones NoSQL. El objetivo principal es encontrar una tecnología que sea fácil de implementar, eficiente en términos de recursos y que se adapte bien a la naturaleza del proyecto, que tiene tablas sencillas y relaciones claras.
Opciones consideradas
-
PostgreSQL
-
Base de datos relacional avanzada, compatible con SQL.
-
Soporta características avanzadas como transacciones ACID, integridad referencial, y funciones avanzadas que pueden ser útiles para manejo de datos estructurados.
-
Buena capacidad de manejo de datos relacionales complejos sin necesidad de ajustes complicados.
-
-
NoSQL (e.g., MongoDB, Firebase)
-
Escalabilidad horizontal y flexibilidad para datos no estructurados.
-
No requiere esquema fijo, lo que permite cambios rápidos en la estructura de datos.
-
Sin embargo, la estructura de este proyecto se basa en datos bien definidos y relaciones claras entre tablas, lo cual se maneja mejor con bases de datos relacionales.
-
-
MySQL
-
Base de datos relacional similar a PostgreSQL.
-
Más sencilla y ligera, pero con menos características avanzadas en comparación a PostgreSQL.
-
Carece de algunas capacidades avanzadas para manejar consultas complejas y transacciones que PostgreSQL maneja mejor.
-
Resultado de decisiones
Elegí la opción 1: PostgreSQL.
-
PostgreSQL es más robusto y flexible que MySQL, permitiendo manejar mejor las consultas complejas y asegurando integridad en las relaciones entre tablas.
-
Las características avanzadas de PostgreSQL, como soporte para transacciones ACID, funciones de ventana, y mayor capacidad de extensión, proporcionan un manejo más eficiente y seguro de los datos estructurados.
-
En comparación con NoSQL, la estructura relacional de PostgreSQL se adapta mejor a la necesidad de mantener datos bien definidos y con relaciones claras, sin la necesidad de escalar masivamente o almacenar datos no estructurados.
Consecuencias
-
Ventajas:
-
Eficiencia en manejo de datos estructurados: PostgreSQL facilita el manejo de datos relacionales con integridad referencial.
-
Características avanzadas: Ofrece soporte para transacciones ACID, funciones de ventana y consultas complejas.
-
Capacidad de crecimiento: Aunque el proyecto es simple ahora, PostgreSQL permite escalar y agregar características adicionales si es necesario en el futuro.
-
Desventajas:
-
Curva de aprendizaje: Puede ser más complejo de configurar y usar en comparación con bases de datos NoSQL, pero la robustez justifica esta elección.
-
Rendimiento en datos no estructurados: No es la mejor opción si se espera que la base de datos almacene datos no estructurados masivos, aunque esto no es un requisito del proyecto actual.
|
Estas decisiones tendrán consecuencias! |
4.4. Estimación de recursos
Se considera un mínimo de 1000 transacciones diarias y un máximo de 5000 (en promedio 3000), los datos no contienen media y se considera un tiempo de almacenamiento de 5 años.
id_cliente integer -- 4 bytes
mail varchar(255) -- (4 + 255) bytes = 259 bytes
cliente -- 263 bytes
id_boletos integer -- 4 bytes
numero varchar(50) -- (4 + 50) bytes = 54 bytes
id_sorteo integer -- 4 bytes
boletos -- 62 bytes
id_sorteo integer -- 4 bytes
fecha_sorteo date -- 4 bytes
sorteo -- 8 bytes
id_cliente integer -- 4 bytes
id_boleto integer -- 4 bytes
monto decimal(10,2) -- 8 bytes
compraBoletos -- 16 bytes
Total --349 bytes
QPS_MIN = 1000 / (24*60*60)
QPS_MIN = 0,0115740740740741
QPS_MAX = 5000/ (24*60*60)
QPS_MAX = 0,0578703703703704
QPS_AVG = 0,0347222222222222
Total_almacenamiento_5_Y = 349 * 5000 * 365.25 * 5
Total_almacenamiento_5_Y = 3.19 Gb
Escalado
El escalado seleccionado es el vertical, ya que se elegira un servidor con los recursos necesarios para la cantidad de queries.
5. Selección de Backend
Seleccion de Backend
5.1. Selección de CMS WordPress sobre desarrollo manual o con framework
-
Status: accepted
-
Date: 2024-10-18
5.1.1. Context and Problem Statement
La decisión consiste en elegir la tecnología para el backend y frontend del sitio web. La opción es decidir si se debe construir el sitio con un CMS (WordPress) o desarrollarlo manualmente utilizando un framework o tecnologías personalizadas. La necesidad surge porque los recursos disponibles son limitados, tanto en términos de tiempo como de presupuesto, y no se requiere una alta complejidad visual en el sitio. Se necesita una solución que permita gestionar pagos de manera sencilla, facilitando la interacción con los usuarios y permitiendo al administrador del sitio realizar modificaciones simples sin necesidad de conocimientos técnicos avanzados.
5.1.2. Opciones consideradas
-
Desarrollo con CMS WordPress
-
Uso de plugins para gestionar pagos en simples clics
-
Facilidad para realizar cambios y actualizaciones por el administrador del sitio sin necesidad de programar
-
Costos de desarrollo más bajos
-
-
Desarrollo manual con frameworks (React, Laravel, etc.)
-
Posibilidad de crear un diseño completamente personalizado y funcionalidades específicas
-
Requiere más recursos, tanto de tiempo como de presupuesto
-
Mayor control sobre la implementación del backend y frontend
-
-
Desarrollo sin frameworks (manual)
-
Total libertad para personalizar la experiencia visual y funcional del sitio
-
Muy demandante en términos de desarrollo y mantenimiento
-
Costos de desarrollo más elevados y complejidad para el administrador al querer realizar modificaciones
-
5.1.3. Resultado de decisiones
Elegí la opción 1: Desarrollo con CMS WordPress.
-
La opción elegida fue WordPress como la tecnología para el sitio web porque ofrece una solución económica y eficiente para los recursos disponibles. La gestión de pagos puede realizarse mediante plugins, lo que facilita la implementación y reduce el tiempo de desarrollo. Además, WordPress permite que el administrador del sitio pueda realizar cambios básicos de contenido y configuración sin necesidad de conocimientos técnicos avanzados. Esta opción es la más adecuada considerando que no se requiere una alta complejidad visual y que los recursos son limitados.
-
Status: accepted
5.1.4. Consecuencias
-
Ventajas:
-
Reducción de costos de desarrollo al evitar la necesidad de programar funcionalidades básicas desde cero.
-
Implementación rápida y uso de plugins para agregar características clave (por ejemplo, gestión de pagos).
-
Fácil administración del sitio por parte del equipo no técnico, permitiendo ajustes rápidos sin depender de desarrolladores.
-
Desventajas:
-
Menor flexibilidad para crear funcionalidades completamente personalizadas comparado con un desarrollo manual.
-
Posible dependencia de plugins de terceros para funcionalidades específicas, lo que puede implicar problemas de compatibilidad o soporte a futuro.
| 1 | A callout behind a custom line comment prefix. |
|
Estas decisiones tendrán consecuencias! |
6. Desarrollador seleccionado
De acuerdo a la siguiente ADR, se indica como se selecciona al desarrollador para el sistema: # Selección de desarrollador con experiencia básica/moderada sobre desarrollador senior especializado
-
Status: accepted
-
Date: 2024-10-18
6.1. Context and Problem Statement
La decisión implica seleccionar el tipo de desarrollador adecuado para llevar a cabo el proyecto. El proyecto es de bajo presupuesto y requiere implementar una solución relativamente sencilla, tanto en términos de backend como de frontend, utilizando tecnologías estándar (CMS WordPress y PostgreSQL). La consideración principal es encontrar un equilibrio entre el costo y la capacidad técnica, asegurando que el desarrollador pueda entregar el proyecto sin requerir habilidades avanzadas o especializadas que excedan las necesidades del proyecto y el presupuesto disponible.
6.2. Considered Options
-
Desarrollador con experiencia básica/moderada
-
Menor costo de contratación, ajustado a las limitaciones del presupuesto
-
Capaz de manejar el desarrollo requerido sin necesidad de habilidades avanzadas o especializadas
-
Menor experiencia, pero suficiente para desarrollar un sitio con CMS WordPress y configurar bases de datos relacionales sencillas
-
-
Desarrollador senior especializado
-
Mayor costo de contratación
-
Experiencia y habilidades avanzadas que pueden llevar a una solución más robusta, pero innecesaria para los requerimientos actuales del proyecto
-
Alta especialización que excede las necesidades de un proyecto simple basado en tecnologías estándar
-
6.3. Decision Outcome
Elegimos la opción 1: Desarrollador con experiencia básica/moderada.
-
La prioridad del proyecto es minimizar los costos, ya que se trata de un proyecto con recursos limitados y sin grandes requerimientos técnicos. Un desarrollador con experiencia básica/moderada es suficiente para implementar una solución utilizando WordPress y PostgreSQL. Esto asegura que se cumplan los requisitos sin incurrir en gastos excesivos en contratación de talento especializado que no es necesario para la escala y complejidad del proyecto actual.
-
Status: accepted
6.4. Consequences
-
Ventajas:
-
Costo reducido: Contratar un desarrollador con experiencia básica/moderada resulta significativamente más económico que un desarrollador senior, lo que permite ajustar el presupuesto y destinar recursos a otras áreas si es necesario.
-
Eficiencia adecuada: El proyecto no requiere habilidades avanzadas, por lo que un desarrollador con conocimientos básicos en WordPress y PostgreSQL podrá realizar el trabajo de manera efectiva sin necesidad de entrenamiento adicional.
-
Ajuste al alcance del proyecto: La selección de un desarrollador menos especializado se ajusta bien a la simplicidad del proyecto y asegura que los recursos sean utilizados de manera eficiente.
-
Desventajas:
-
Posible limitación en escalabilidad futura: Si el proyecto se expande en el futuro y requiere características más complejas, el desarrollador seleccionado podría no tener las habilidades para cubrir esas necesidades, lo que implicaría contratar soporte adicional.
-
Riesgo de calidad: Aunque suficiente para los requisitos actuales, la falta de experiencia avanzada puede implicar una menor calidad en la implementación o en la resolución de problemas inesperados, aunque esto se considera aceptable dado el costo reducido.
7. Costo total y tiempos
Los tiempos de desarrollo pueden tomar entre 1 a 2 meses. Dado es que es un desarrollo relativamente sencillo. Considerando los sueldos promedios de desarrollador mensual son de $1.200.000 y el costo mensual por planes de 48 meses en Hostinger es de 3.99 Euros, se estima que los costos sean los siguientes:
Desarrollo 2 meses = 2.400.000 clp
Arriendo hosting 60 meses = 240 eur -> 247.000 clp
Total presupuesto = 2.647.000 clp
Appendix A: Example Appendix
This is an Example Appendix
Glosario
Glosario de palabras clave usadas en el proyecto
- CMS
-
Content management system (Sistema de gestión de contenidos). Es un sistema online que nos permite poner en marcha un sitio web de forma práctica y rápida.
- QPS
-
Consultas por segundo
Referencias
-
[[[IMB Topics]]] IBM. '¿Qué es PostgreSQL?' http://code.google.com/edu/languages/google-python-class/
-
[[[C4 model]]] C4. 'The C4 model for visualising software architecture' https://c4model.com/
-
[Nijas] Ninjas. 'ACIIDOC-BOOK-TEMPLATE' https://github.com/NinjasCL/asciidoc-book-template/tree/main