Compare commits

...

13 Commits

Author SHA1 Message Date
Ales (Shagi) Zabala Alava c0d460de1d Añadir asistencia al archetype para nuevo hm
continuous-integration/drone/push Build is passing Details
2021-11-20 10:36:39 +01:00
Ales (Shagi) Zabala Alava 6915f7e0b4 Convertir asistencia a csv, scripts auxiliares para facilitar la web
continuous-integration/drone/push Build is passing Details
2021-11-20 10:33:42 +01:00
Ales (Shagi) Zabala Alava 226021a203 Explicar la idea de la web en el readme
continuous-integration/drone/push Build is passing Details
2021-11-09 13:01:56 +01:00
Ales (Shagi) Zabala Alava aa5a159df1 Proponer un sistema básico de necesidades
continuous-integration/drone/push Build is passing Details
2021-09-19 13:15:38 +02:00
Ales (Shagi) Zabala Alava d8a47abf1d Añadir otro nodo al 2019
continuous-integration/drone/push Build is passing Details
2021-09-19 11:57:38 +02:00
Ales (Shagi) Zabala Alava 54cd73f31d Publicar la web automáticamente al hacer push a master
continuous-integration/drone/push Build is passing Details
2021-09-19 11:53:40 +02:00
Ales (Shagi) Zabala Alava fd958653fe Corregir urls de ficheros estáticos para poder publicar la web en una carpeta en vez de en la raíz 2021-09-17 12:39:22 +02:00
Ales (Shagi) Zabala Alava 406793b613 Algo más de documentación 2021-09-17 12:19:42 +02:00
Ales (Shagi) Zabala Alava 94871720db Proponer un sistema básico de asistencia 2021-09-17 11:53:00 +02:00
Ales (Shagi) Zabala Alava 1591b16245 Mostrar el menú anual en la vista de nodo y el menú de otros años en la home anual 2021-09-17 09:16:31 +02:00
Ales (Shagi) Zabala Alava 9cf888dc38 Convertir todas las parrillas del 2019 a csv 2021-09-17 09:04:55 +02:00
Ales (Shagi) Zabala Alava 67add2e383 Shortcode para renderizar ficheros csv, pensado para la parrilla 2021-09-16 19:41:07 +02:00
Ales (Shagi) Zabala Alava 2bd8c46431 Shortcode para renderizar html a pelo, mientras mejoramos el sistema 2021-09-16 14:10:00 +02:00
36 changed files with 624 additions and 272 deletions

38
.drone.yml Normal file
View File

@ -0,0 +1,38 @@
---
kind: pipeline
name: default
platform:
os: linux
arch: amd64
steps:
- name: build
image: plugins/hugo
settings:
hugo_version: 0.88.1
url: https://negromate.rocks/hmdemo/
validate: true
when:
branch:
- master
- name: deploy
image: drillster/drone-rsync
settings:
hosts:
- 192.168.20.2
key:
from_secret: rsync_ssh_key
source: public/
target: /var/www/html/hmdemo
user: hm
when:
branch:
- master
---
kind: signature
hmac: eedaf25fc6dd13b10beb6533dd58eda860b7b8b6a5af7df2169bcc4e9c711c5e
...

View File

@ -1,14 +1,61 @@
# Página web del hackmeeting
La principal ventaja de esta web con respecto a la que hay actualmente es que
no necesita mantenimiento, mantiene la posibilidad de editar contenido por
varias personas y simplifica el backup.
El flujo de trabajo típico para añadir contenido a la web sería este:
1. Crear o editar un fichero en la carpeta `content`
2. Comprobar en local que la modificación es correcta
3. Hacer un commit con las modificaciones
4. Subir el commit al repositorio de git
5. Compilar la web
6. Enviar los ficheros al servidor web.
Los pasos 5 y 6 se pueden automatizar con alguna herramienta de integración
continua. En este ejemplo se usa drone.io. Para simplificar el resto de los
pasos la idea es preparar scripts u otro tipo de programas, que ayuden a
generar el contenido de manera más interactiva.
Este proceso puede ser demasiado complicado para personas sin experiencia en
git o markdown, sobre todo las integrantes del grupo local, que además no
conocen el funcionamiento de esta herramienta. Propongo instaurar el rol de
"madrina(s) de grupo local", gente que se encargue de asistir al grupo local y
en caso necesario de encargarse de subir los contenidos a la web.
Los datos que son más útiles para el grupo local se guardan en ficheros csv,
que es fácil de modificar en una hoja de cálculo, y permite un postpropceso
sencillo para obtener datos interesantes. Por ejemplo la cantidad de asistentes
que hay apuntados para cenar el sábado.
## Crear contenido
Por ejemplo, para crear un nodo que se llame `nodo1` para el 2019:
Hay una serie de comandos auxiliares para gestionar el contenido de la web de
manera sencilla.
hugo new 2019/nodos/nodo1.md -k nodo
Todos estos comandos aceptan un parámetro opcional: el año en el que estamos
trabajando. Si no se indica año se asume el actual.
Para crear un nodo:
bin/nuevo_nodo
Para gestionar la asistencia:
bin/asistencia
Para gestionar las necesidades:
bin/necesidades
Para crear una página corriente:
bin/nueva_pagina
Para empezar un nuevo hackmeeting:
hugo new 2022 -k hm
bin/nuevo_hackmeeting
## Mini intro a Hugo
@ -33,3 +80,39 @@ Los ficheros estáticos están en la carpeta `static`, se copian tal cual a la
carpeta `public`.
Más información: https://gohugo.io/documentation/
## Estructura básica del contenido
Cada año creamos una carpeta nueva dentro de `content`, usando el archetypes `hm`.
Esta carpeta tiene la página inicial, el manifiesto, el listado de nodos y la
página de asistencia.
## Shortcodes
Estos son los shortcodes definidos para el hackmeeting:
### rawHTML
Renderiza el contenido del shortcode sin procesar, por lo que se puede meter html arbitrario.
Ejemplo:
{{< rawHTML >}}
<table>
<tr><td>Una tabla</td></tr>
</table>
{{< /rawHTML >}}
### csvTable
Renderiza un csv como una tabla HTML. Hay que pasarle dos parámetros, el path
del csv relativo a la raíz del proyecto y la clase css que se le asignará a la
tabla.
Hay que generar un fichero csv separado por comas.
Ejemplo, para un fichero `content/2019/nodos/parrilla_viernes.csv':
{{< csvTable file="/content/2019/nodos/parrilla_viernes.csv" class="parrilla" >}}

View File

@ -1,6 +1,7 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
type: "yearhome"
draft: true
---

View File

@ -0,0 +1 @@
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
1 Nombre Entrada Salida Dieta Camiseta Material Dormir Comer Necesidades

View File

@ -0,0 +1,11 @@
---
title: "Asistencia"
date: {{ .Date }}
draft: true
---
Esta es la plantilla para inscribirse y que sepamos de antemano cuanta gente va
a venir, para poder preparar el espacio y lo que haga falta. Avisa en matrix o
en la lista, o envía un pull request al repositorio de esta web.
{{< csvTable file="/content/2019/asistencia.csv" class="asistencia" >}}

View File

@ -0,0 +1 @@
Necesidad,Cantidad necesaria,Cantidad actual
1 Necesidad Cantidad necesaria Cantidad actual

View File

@ -0,0 +1,7 @@
---
title: "Necesidades"
date: {{ .Date }}
draft: true
---
{{< csvTable file="/content/{{ .Name }}/necesidades.csv" class="necesidades" >}}

View File

@ -1,7 +1,7 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
type: nodo
type: "nodos"
quien: "organizadoras"
madrina: "madrina"
duracion: "1 hora"

5
bin/asistencia Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
YEAR=${1:-$(date "+%Y")}
utils/csveditor.py content/${YEAR}/asistencia.csv

5
bin/necesidades Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
YEAR=${1:-$(date "+%Y")}
utils/csveditor.py content/${YEAR}/necesidades.csv

9
bin/nueva_pagina Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
YEAR=${1:-$(date "+%Y")}
echo -n "Titulo: "
read TITLE
SLUG=$(bin/slugify ${TITLE})
hugo new ${YEAR}/${SLUG}.md

5
bin/nuevo_hackmeeting Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
YEAR=${1:-$(date "+%Y")}
hugo new ${YEAR} -k hm

9
bin/nuevo_nodo Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
YEAR=${1:-$(date "+%Y")}
echo -n "Titulo: "
read TITLE
SLUG=$(bin/slugify ${TITLE})
hugo new ${YEAR}/nodos/${SLUG}.md -k nodo

41
bin/slugify Executable file
View File

@ -0,0 +1,41 @@
#!/bin/bash
# Versión simplificada y adaptada de bash-slugify
# https://github.com/brutus/bash-slugify
slugify () {
local name="$@"
local gluechars='-_. '
local safechars="${gluechars}a-zA-Z0-9"
# convert to lowercase
name=$(echo "${name}" | tr A-ZÄÖÜ a-zäöü)
# remove special chars
name=$(echo "${name//[^${safechars}]/}")
# consolidate spaces
name=$(echo "${name}" | tr -s '[:space:]')
# replace spaces with dashes
name=$(echo "${name}" | tr ' ' '-')
# remove spaces around dashes and underscores
name=$(echo "${name// -/-}")
name=$(echo "${name//- /-}")
name=$(echo "${name// _/_}")
name=$(echo "${name//_ /_}")
# trim spaces
name=$(echo "${name}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
# replace special chars
name=$(echo "${name//[^${safechars}]/$REPLACEMENT_CHAR}")
## REPLACE SPACES
name=$(echo "${name// /$SPACE_CHAR}")
# return slug
echo "${name}"
}
echo $(slugify "$@")

View File

@ -1,6 +1,7 @@
---
title: "2019"
date: 2021-09-14T11:29:27+02:00
type: "yearhome"
draft: false
---

View File

@ -0,0 +1,2 @@
"Nombre","Entrada","Salida","Dieta","Camiseta","Material","Dormir","Comer","Necesidades"
"Shagi","2019-09-19","2010-09-22","omnivora","L","","sí (en furgo)","sí",""
1 Nombre Entrada Salida Dieta Camiseta Material Dormir Comer Necesidades
2 Shagi 2019-09-19 2010-09-22 omnivora L sí (en furgo)

View File

@ -0,0 +1,11 @@
---
title: "Asistencia"
date: 2021-09-14T11:29:27+02:00
draft: false
---
Esta es la plantilla para inscribirse y que sepamos de antemano cuanta gente va
a venir, para poder preparar el espacio y lo que haga falta. Avisa en matrix o
en la lista, o envía un pull request al repositorio de esta web.
{{< csvTable file="/content/2019/asistencia.csv" class="asistencia" >}}

View File

@ -0,0 +1,3 @@
Necesidad,Cantidad necesaria,Cantidad actual
Micros,3,3
Proyectores,3,3
1 Necesidad Cantidad necesaria Cantidad actual
2 Micros 3 3
3 Proyectores 3 3

View File

@ -0,0 +1,25 @@
---
title: "Necesidades"
date: 2021-09-14T10:56:09+02:00
draft: false
---
Entendemos que habría 3 salas de charlas y en cada sala deberíamos tener:
- Un micro
- Un cable de micro
- Un altavoz autoamplificado (o en su caso una etapa de potencia +
altavoz)
- Opcional : Mixer para conectar otras cosas
- Cables minijack-rca o minijack-jacks para conectar el laptop al mixer
- Cable minijack-rca para pasar la señal a la rpi
- Una toma de red
- Una raspberriPi o trasato similar para hacer de cliente de streaming
para grabar las charlas.
## MATERIALES PARA LA REALIZACIÓN DE LOS NODOS
- Proyector
- Equipo de sonido
{{< csvTable file="/content/2019/necesidades.csv" class="necesidades" >}}

View File

@ -2,7 +2,7 @@
title: "Nodos"
date: 2021-09-14T10:56:09+02:00
type: nodos
draft: true
draft: false
---
# Nodos
@ -14,264 +14,14 @@ listas.
[Materiales necesarios](/2019/MaterialesNecesarios)
## Viernes
## Viernes 20
<table class="wikitable">
<tbody>
<tr>
<th scope="row" colspan="4"> VIERNES 20 </th>
</tr>
<tr>
<th scope="col"></th>
<th scope="col"> ____Gizartetxe____ </th>
<th scope="col"> ____Gaztetxe__ </th>
<th scope="col"> ____Cine___________ </th>
</tr>
<tr>
<th scope="row"> 09:00 </th>
<th scope="row" colspan="3" rowspan="2"> DESAYUNO / BREAKFAST </th>
</tr>
<tr>
<th scope="row"> 10:00 </th>
</tr>
<tr>
<th scope="row"> 11:00 </th>
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA PREPARATORIA HACKMEETING </th>
</tr>
<tr>
<th scope="row"> 12:00 </th>
</tr>
<tr>
<th scope="row"> 13:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 14:00 </th>
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
</tr>
<tr>
<th scope="row"> 15:00 </th>
</tr>
<tr>
<th> 16:00 </th>
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA GENERAL HACKMEETING </th>
</tr>
<tr>
<th scope="row"> 17:00 </th>
</tr>
<tr>
<th scope="row"> 18:00 </th>
<th scope="row" rowspan="1"> Audio en el fediverso: Introducción a Funkwhale [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Audio_en_el_fediverso:_Introducci.C3.B3n_a_Funkwhale">[1]</a>] </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 19:00 </th>
<th scope="row" rowspan="1"> Cómo funciona internet [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#C.C3.B3mo_funciona_internet">[2]</a>] </th>
<th scope="row" rowspan="2"> Mesa redonda. Características del software para que empodere nuestras comunidades [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Mesa_redonda._Caracter.C3.ADsticas_del_software_para_que_empodere_nuestras_comunidades">[3]</a>] </th>
<th scope="row" rowspan="2"> Ruidismo DIY | Live Coding: Generación de música a través de algoritmos [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Ruidismo_DIY_.7C_Live_Coding:_Generaci.C3.B3n_de_m.C3.BAsica_a_trav.C3.A9s_de_algoritmos">[4]</a>] </th>
</tr>
<tr>
<th scope="row"> 20:00 </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 21:00 </th>
<th scope="row" colspan="3" rowspan="1"> CENA </th>
</tr>
<tr>
<th scope="row"> 22:30 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> 10 minutes Talks:
<p>Host a radical wordpress MU, tech stuffs of noblogs.org [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Host_a_radical_wordpress_MU.2C_tech_stuffs_of_noblogs.org">[5]</a>]
</p>
</th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 23:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 24:00 </th>
</tr>
</tbody>
</table>
{{< csvTable file="/content/2019/nodos/parrilla_viernes.csv" class="parrilla" >}}
## Sábado 21
## Sábado
{{< csvTable file="/content/2019/nodos/parrilla_sabado.csv" class="parrilla" >}}
<table class="wikitable">
<tbody>
<tr>
<th scope="row" colspan="4"> SABADO 21 </th>
</tr>
<tr>
<th scope="col"> </th>
<th scope="col"> ____Gizartetxe____ </th>
<th scope="col"> ____Gaztetxe__ </th>
<th scope="col"> ____Cine___________ </th>
</tr>
<tr>
<th scope="row"> 09:00 </th>
<th scope="row" colspan="3" rowspan="1"> DESAYUNO / BREAKFAST </th>
</tr>
<tr>
<th scope="row"> 10:00 </th>
<th scope="row" rowspan="1"> FaceHack [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Facehack">[6]</a>] </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 11:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="2"> Burujabetza teknologikoa [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Burujabetza_teknologikoa">[7]</a>] </th>
<th scope="row" rowspan="1"> Taller sobre email sin internet [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Taller_sobre_email_sin_internet_y_propuesta_din.C3.A1mica_de_probarlo_durante_este_hackmeeting">[8]</a>] </th>
</tr>
<tr>
<th scope="row"> 12:00 </th>
<th scope="row" rowspan="2"> Instalacion fotovoltaica Errekaleor [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Instalacion_fotovoltaica_Errekaleor">[9]</a>] </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 13:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 14:00 </th>
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
</tr>
<tr>
<th scope="row"> 15:00 </th>
</tr>
<tr>
<th> 16:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> Taller creativo para Autodefensa Informática [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Taller_creativo_para_Autodefensa_Inform.C3.A1tica">[10]</a>] </th>
<th scope="row" rowspan="1"> Motivades pel Plàstic [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Facehack">[11]</a>] </th>
</tr>
<tr>
<th scope="row"> 17:00 </th>
<th scope="row" rowspan="1"> Subir una web a IPFS [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Subir_una_web_a_IPFS">[12]</a>] </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 18:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> sindominio: tras 20 años de cyberautonomía [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#sindominio:_tras_20_a.C3.B1os_de_cyberautonom.C3.ADa">[13]</a>] </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 19:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> Tractor hacking. Software privativo en coches y tractores [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Tractor_hacking">[14]</a>] </th>
<th scope="row" rowspan="2">
Charla sobre el movimiento AnarcoHacker y Proyeccion del documental "Hack the system" [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Charla_sobre_el_movimiento_AnarcoHacker_y_Proyeccion_del_documental_.22Hack_the_system.22_.28subtitulado.29">[15]</a>]
</th>
</tr>
<tr>
<th scope="row"> 20:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1">Soberania alcoholica y fiestera: desde la resistencia anti-nazi, al movimiento queer[<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Soberania_alcoholica_y_fiestera:_desde_la_resistencia_anti-nazi.2C_al_movimiento_queer">[16]</a>] </th>
</tr>
<tr>
<th scope="row"> 21:00 </th>
<th scope="row" colspan="3" rowspan="1"> CENA </th>
</tr>
<tr>
<th scope="row"> 22:30 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> 10 minutes Talks: </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 23:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="2"> Negro Mate [<a rel="nofollow" class="external autonumber" href="https://es.hackmeeting.org/hm/index.php?title=Nodos2019#Negro_Mate">[17]</a>] </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 24:00 </th>
</tr>
</tbody>
</table>
## Domingo 22
## Domingo
<table class="wikitable">
<tbody>
<tr>
<th scope="row" colspan="4"> DOMINGO 21 </th>
</tr>
<tr>
<th scope="col"> </th>
<th scope="col"> ____Gizartetxe____ </th>
<th scope="col"> ____Gaztetxe__ </th>
<th scope="col"> ____Cine___________ </th>
</tr>
<tr>
<th scope="row"> 09:00 </th>
<th scope="row" colspan="3" rowspan="2"> DESAYUNO / BREAKFAST </th>
</tr>
<tr>
<th scope="row"> 10:00 </th>
</tr>
<tr>
<th scope="row"> 11:00 </th>
<th scope="row" colspan="3" rowspan="2"> ASAMBLEA GENERAL HACKMEETING </th>
</tr>
<tr>
<th scope="row"> 12:00 </th>
</tr>
<tr>
<th scope="row"> 13:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 14:00 </th>
<th scope="row" rowspan="2" colspan="3"> COMIDA </th>
</tr>
<tr>
<th scope="row"> 15:00 </th>
</tr>
<tr>
<th> 16:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 17:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 18:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 19:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
<tr>
<th scope="row"> 20:00 </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
<th scope="row" rowspan="1"> </th>
</tr>
</tbody>
</table>
{{< csvTable file="/content/2019/nodos/parrilla_domingo.csv" class="parrilla" >}}

View File

@ -0,0 +1,20 @@
---
title: "Audio en El Fediverso: Workshop Funkwhale"
date: 2021-09-19T11:55:32+02:00
type: "nodos"
quien: "Siroco"
madrina: ""
duracion: "tarde/noches del preHM"
preferencia: "pre-Hackmeeting"
necesita: ["Espacio común"]
tags: ["radio", "fediverse", "podcasting"]
draft: false
---
La idea es usar los días de preHM para configurar un nodo local de Funkwhale y
hacer pruebas con sus APIs para luego presentar el resultado en un nodo durante
el HM.
## Archivos
http://funkwhale.audio/

View File

@ -1,7 +1,7 @@
---
title: "Audio en El Fediverso: Introducción a Funkwhale"
date: 2021-09-15T11:12:59+02:00
type: nodo
type: "nodos"
quien: "Siroco"
madrina: ""
duracion: "1 hora"
@ -21,6 +21,6 @@ funkwhale y mirar hasta que punto podemos usar su API para desarrollar un
sistema de podcasting. El resultado de la investigación será presentado en este
nodo.
##Archivos
## Archivos
http://funkwhale.audio/

View File

@ -15,4 +15,5 @@ Cantaremos entre todos varias canciones a las que les hemos cambiado la letra
con temas relacionados con el hacktivismo y el software libre.
## Archivos
https://negromate.ddns.net o http://fyqxyftczmxv3nmb.onion/

View File

@ -0,0 +1,13 @@
,Gizartetxe,Gaztetxe,Cine
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
10:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
11:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
12:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
13:00:00,,,
14:00:00,COMIDA,COMIDA,COMIDA
15:00:00,COMIDA,COMIDA,COMIDA
16:00:00,,,
17:00:00,,,
18:00:00,,,
19:00:00,,,
20:00:00,,,
1 Gizartetxe Gaztetxe Cine
2 09:00:00 DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST
3 10:00:00 DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST
4 11:00:00 ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING
5 12:00:00 ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING
6 13:00:00
7 14:00:00 COMIDA COMIDA COMIDA
8 15:00:00 COMIDA COMIDA COMIDA
9 16:00:00
10 17:00:00
11 18:00:00
12 19:00:00
13 20:00:00

View File

@ -0,0 +1,17 @@
,Gizartetxe,Gaztetxe,Cine
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
10:00:00,FaceHack,,
11:00:00,,Burujabetza teknologikoa,Taller sobre email sin internet
12:00:00,Instalacion fotovoltaica Errekaleor,Burujabetza teknologikoa,
13:00:00,Instalacion fotovoltaica Errekaleor,,
14:00:00,COMIDA,COMIDA,COMIDA
15:00:00,COMIDA,COMIDA,COMIDA
16:00:00,,Taller creativo para Autodefensa Informática,Motivades pel Plàstic
17:00:00,Subir una web a IPFS,,
18:00:00,,sindominio: tras 20 años de cyberautonomía,
19:00:00,,Tractor hacking. Software privativo en coches y tractores,"Charla sobre el movimiento AnarcoHacker y Proyeccion del documental ""Hack the system"""
20:00:00,,"Soberania alcoholica y fiestera: desde la resistencia anti-nazi, al movimiento queer","Charla sobre el movimiento AnarcoHacker y Proyeccion del documental ""Hack the system"""
21:00:00,CENA,CENA,CENA
22:30:00,,10 minutes Talks,
23:00:00,,Negro Mate,
24:00:00,,Negro Mate,
1 Gizartetxe Gaztetxe Cine
2 09:00:00 DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST
3 10:00:00 FaceHack
4 11:00:00 Burujabetza teknologikoa Taller sobre email sin internet
5 12:00:00 Instalacion fotovoltaica Errekaleor Burujabetza teknologikoa
6 13:00:00 Instalacion fotovoltaica Errekaleor
7 14:00:00 COMIDA COMIDA COMIDA
8 15:00:00 COMIDA COMIDA COMIDA
9 16:00:00 Taller creativo para Autodefensa Informática Motivades pel Plàstic
10 17:00:00 Subir una web a IPFS
11 18:00:00 sindominio: tras 20 años de cyberautonomía
12 19:00:00 Tractor hacking. Software privativo en coches y tractores Charla sobre el movimiento AnarcoHacker y Proyeccion del documental "Hack the system"
13 20:00:00 Soberania alcoholica y fiestera: desde la resistencia anti-nazi, al movimiento queer Charla sobre el movimiento AnarcoHacker y Proyeccion del documental "Hack the system"
14 21:00:00 CENA CENA CENA
15 22:30:00 10 minutes Talks
16 23:00:00 Negro Mate
17 24:00:00 Negro Mate

View File

@ -0,0 +1,17 @@
,Gizartetxe,Gaztetxe,Cine
09:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
10:00:00,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST,DESAYUNO / BREAKFAST
11:00:00,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING
12:00:00,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING,ASAMBLEA PREPARATORIA HACKMEETING
13:00:00,,,
14:00:00,COMIDA,COMIDA,COMIDA
15:00:00,COMIDA,COMIDA,COMIDA
16:00:00,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING,ASAMBLEA GENERAL HACKMEETING
17:00:00,,,
18:00:00,Audio en el fediverso: Introducción a Funkwhale ,,
19:00:00,Cómo funciona internet ,Mesa redonda. Características del software para que empodere nuestras comunidades ,Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
20:00:00,,Mesa redonda. Características del software para que empodere nuestras comunidades ,Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
21:00:00,CENA,CENA,CENA
22:30:00,,"10 minutes Talks",
23:00:00,,,
24:00:00,,,
1 Gizartetxe Gaztetxe Cine
2 09:00:00 DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST
3 10:00:00 DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST DESAYUNO / BREAKFAST
4 11:00:00 ASAMBLEA PREPARATORIA HACKMEETING ASAMBLEA PREPARATORIA HACKMEETING ASAMBLEA PREPARATORIA HACKMEETING
5 12:00:00 ASAMBLEA PREPARATORIA HACKMEETING ASAMBLEA PREPARATORIA HACKMEETING ASAMBLEA PREPARATORIA HACKMEETING
6 13:00:00
7 14:00:00 COMIDA COMIDA COMIDA
8 15:00:00 COMIDA COMIDA COMIDA
9 16:00:00 ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING ASAMBLEA GENERAL HACKMEETING
10 17:00:00
11 18:00:00 Audio en el fediverso: Introducción a Funkwhale
12 19:00:00 Cómo funciona internet Mesa redonda. Características del software para que empodere nuestras comunidades Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
13 20:00:00 Mesa redonda. Características del software para que empodere nuestras comunidades Ruidismo DIY | Live Coding: Generación de música a través de algoritmos
14 21:00:00 CENA CENA CENA
15 22:30:00 10 minutes Talks
16 23:00:00
17 24:00:00

View File

@ -5,13 +5,13 @@
<title>{{ block "title" . }}
{{ .Site.Title }}
{{ end }}</title>
<link rel="stylesheet" href="/css/base.css">
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
<link rel="stylesheet" href="{{ "css/base.css"|absURL }}">
<link rel="icon" href="{{ "imgs/hm-favicon.png"|absURL }}" type="image/png">
</head>
<body>
<header>
<a href="{{ "/" | absURL }}">
<img id="logo" src="/imgs/logo.png" alt="logo">
<a href="{{ ""|absURL }}">
<img id="logo" src="{{ "imgs/logo.png"|absURL }}" alt="logo">
</a>
{{ .Site.Title }}

View File

@ -3,18 +3,18 @@
<head>
<title>Hackmeeting 2019</title>
<meta charset="UTF-8">
<link rel="stylesheet" href="css/home.css">
<link rel="stylesheet" href="{{ "css/home.css"|absURL }}">
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="http://es.hackmeeting.org/index.html">
<meta name="author" content="Hackmeeting">
<meta name="description" content="Autogestión, Hacktivismo, CryptoAnarquismo, Hackmeeting">
<link rel="icon" href="/imgs/hm-favicon.png" type="image/png">
<link rel="icon" href="{{ "imgs/hm-favicon.png"|absURL }}" type="image/png">
</head>
<body>
<header>
<img class="imgCenter" src="imgs/hm-favicon.png"/>
<img class="imgCenter" src="{{ "imgs/hm-favicon.png"|absURL }}"/>
<h1>{{ .Title }}</h2>
<h2>{{ .Params.when }}</h2>
<h2>{{ .Params.where }}</h2>

View File

@ -2,9 +2,8 @@
{{ .TableOfContents }}
{{ .Content }}
{{ range .Pages }}
{{ range where .Pages "Params.type" "nodos" }}
{{ partial "nodo" . }}
{{ .Render "li" }}
{{ end }}
{{ end }}

View File

@ -35,4 +35,12 @@
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
{{ end }}
</ul>
<hr>
<ul>
{{ range .Parent.Parent.Pages }}
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
{{ end }}
</ul>
{{ end}}

View File

@ -0,0 +1,16 @@
{{ $class := .Get "class" }}
{{ $file := .Get "file" }}
{{ $data := getCSV "," $file }}
<table class="{{ $class }}">
{{ range $row, $columns := $data }}
<tr>
{{ range $columns }}
{{ if eq $row 0 }}
<th> {{ . }}</th>
{{ else }}
<td> {{ . }}</td>
{{ end }}
{{ end }}
</tr>
{{ end }}
</table>

View File

@ -0,0 +1 @@
{{ .Inner }}

View File

@ -0,0 +1,20 @@
{{ define "main" }}
{{ .TableOfContents }}
{{ .Content }}
{{ end }}
{{ define "sidebar_menu" }}
<ul>
{{ range .Pages }}
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
{{ end }}
</ul>
<hr>
<ul>
{{ range .Parent.Pages }}
<li><a href="{{ .Permalink }}">{{.Title}}</a></li>
{{ end }}
</ul>
{{ end}}

View File

@ -3,6 +3,7 @@ body {
gap: 0 1em;
flex-wrap: wrap;
flex-direction: row;
margin: 0;
}
header {
@ -44,6 +45,53 @@ aside a {
color: white;
}
aside ul {
list-style-type: none;
padding: 0.5em;
background-color: #333;
border-radius: 0.5em;
margin: 0.5em;
}
aside li {
padding-bottom: 0.5em;
}
main {
flex: 1;
}
table {
border-collapse: collapse;
border: 1px solid black;
}
table th, table td {
border: 1px solid black;
padding: 0.25em;
}
table.parrilla {
width: 100%
}
table.parrilla td {
width: 29%;
}
table.parrilla td:first-child {
font-weight: bold;
width: 9%;
}
table.parrilla td:nth-child(2) {
background-color: #ddd;
}
table.parrilla td:nth-child(3) {
background-color: #ccc;
}
table.parrilla td:nth-child(4) {
background-color: #eee
}

169
utils/csveditor.py Executable file
View File

@ -0,0 +1,169 @@
#!/usr/bin/env python3
from argparse import ArgumentParser
import atexit
import csv
import os
import readline
import sys
from cmd import Cmd
def init_readline():
histfile = os.path.join(os.path.expanduser("~"), ".hmwebot_history")
try:
readline.read_history_file(histfile)
h_len = readline.get_current_history_length()
except FileNotFoundError:
open(histfile, 'wb').close()
h_len = 0
def save(prev_h_len, histfile):
new_h_len = readline.get_current_history_length()
readline.set_history_length(1000)
readline.append_history_file(new_h_len - prev_h_len, histfile)
atexit.register(save, h_len, histfile)
def rlinput(prompt, prefill=''):
readline.set_startup_hook(lambda: readline.insert_text(prefill))
try:
return input(prompt) # or raw_input in Python 2
finally:
readline.set_startup_hook()
class CSVEditor:
def __init__(self, filename):
self.filename = filename
with open(filename, 'r') as f:
reader = csv.DictReader(f)
self.fieldnames = reader.fieldnames
self.data = [data for data in reader]
def get_list(self, title_field):
return [(idx, data[title_field]) for idx, data in enumerate(self.data)]
def get(self, idx):
try:
return self.data[idx]
except IndexError:
return None
def show(self, idx):
line = self.get(idx)
if line is None:
return "Índice fuera de rango"
output = [
f"{field}: {value}"
for field, value in line.items()
]
return "\n".join(output)
def edit(self, idx, item):
self.data[idx] = item
def delete(self, idx):
if idx in self.data:
del self.data[idx]
def _edit(self, item):
editing = True
while editing:
for fieldname in self.fieldnames:
item[fieldname] = rlinput(f"{fieldname}: ", prefill=item.get(fieldname, ''))
editing = rlinput('Terminado (s/N)?').lower() == 'n'
def edit(self, idx):
item = self.get(idx)
if item is None:
return
self._edit(item)
self.data[idx] = item
def add(self):
item = {}
self._edit(item)
self.data.append(item)
def write(self):
with open(self.filename, 'w') as f:
writer = csv.DictWriter(f, fieldnames=self.fieldnames)
writer.writeheader()
writer.writerows(self.data)
class CSVEditorCmd(Cmd):
"Editor interactivo de ficheros csv"
def __init__(self, filename, title_field=None):
super().__init__()
self.csveditor = CSVEditor(filename)
self.title_field = title_field
if title_field is None:
self.title_field = self.csveditor.fieldnames[0]
self.do_help('')
def do_list(self, arg):
"Listar el contenido del csv"
for idx, item in self.csveditor.get_list(self.title_field):
print(f"{idx}) {item}")
def do_show(self, arg):
"Mostrar la línea con el índice indicado"
try:
idx = int(arg)
except ValueError:
print("Tienes que indicar un número")
return
print(self.csveditor.show(idx))
def do_add(self, arg):
"Añadir una nueva entrada"
self.csveditor.add()
def do_edit(self, arg):
"Editar la entrada con el índice indicado"
try:
idx = int(arg)
except ValueError:
print("Tienes que indicar un número")
return
self.csveditor.edit(idx)
def do_delete(self, arg):
"Quitar la entrada con el índice indicado"
try:
idx = int(arg)
except ValueError:
print("Tienes que indicar un número")
return
self.csveditor.delete(idx)
def do_save(self, arg):
"Guardar la lista actualizada"
self.csveditor.write()
def do_quit(self, arg):
"Terminar"
return True
do_EOF = do_quit
parser = ArgumentParser(
description='Editor sencillo de ficheros CSV')
parser.add_argument('csvfile', help='Fichero que hay que editar.')
parser.add_argument('-t', '--title', help='Columna principal del CSV, por defecto la primera.')
def main():
init_readline()
# bot = Bot()
args = parser.parse_args()
cmd = CSVEditorCmd(args.csvfile, args.title)
cmd.cmdloop()
if __name__ == '__main__':
main()

15
utils/readme.md Normal file
View File

@ -0,0 +1,15 @@
Tareas que hay que facilitar:
- nuevo nodo
- nueva asistencia
igual cambiar el sistema actual para que sea también un csv, así podemos
cambiar las columnas necesarias para cada año
el programa pregunta y añade, o busca en la lista para quitar a alguien
- necesidades
poder pedir proyectores, material de limpieza, gente, etc.
un csv con tres columnas: texto, cantidad necesaria, cantidad actual
el programa pregunta por una de las líneas del csv para borrar, editar, cambiar la cantidad,
también se pueden añadir nuevas líneas