<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://wiki.golem.linux.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Malatext</id>
	<title>GolemWiki - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.golem.linux.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Malatext"/>
	<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/Speciale:Contributi/Malatext"/>
	<updated>2026-07-25T08:13:17Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10024</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10024"/>
		<updated>2026-07-21T20:19:35Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Preprocessori */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come nei comandi della shell. Analogamente ai comandi della shell, se l'argomento è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|-&lt;br /&gt;
| \[lz] || ◊ || rombo&lt;br /&gt;
|-&lt;br /&gt;
| \[sq] || □ || quadrato&lt;br /&gt;
|-&lt;br /&gt;
| \[ps] || ¶ || fine del paragrafo&lt;br /&gt;
|-&lt;br /&gt;
| \[sc] || § || sezione&lt;br /&gt;
|-&lt;br /&gt;
| \[CR] || ↵ || carriage return&lt;br /&gt;
|-&lt;br /&gt;
| \[OK] || ✓ || check mark&lt;br /&gt;
|-&lt;br /&gt;
| \[co] || © || copyright&lt;br /&gt;
|-&lt;br /&gt;
| \[rg] || ® || registrato&lt;br /&gt;
|-&lt;br /&gt;
| \[tm] || ™ || trade mark&lt;br /&gt;
|-&lt;br /&gt;
| \[Do] || $ || dollaro&lt;br /&gt;
|-&lt;br /&gt;
| \[ct] || ¢ || centesimo&lt;br /&gt;
|-&lt;br /&gt;
| \[eu] || € || euro&lt;br /&gt;
|-&lt;br /&gt;
| \[Ye] || ¥ || yen&lt;br /&gt;
|-&lt;br /&gt;
| \[Po] || £ || pound&lt;br /&gt;
|-&lt;br /&gt;
| \[Cs] || ¤ || moneta scandinava&lt;br /&gt;
|-&lt;br /&gt;
| \[Fn] || ƒ || florin&lt;br /&gt;
|-&lt;br /&gt;
| \[de] || ° || grado&lt;br /&gt;
|-&lt;br /&gt;
| \[%0] || ‰ || per mille&lt;br /&gt;
|-&lt;br /&gt;
| \[fm] || ′ || minuti&lt;br /&gt;
|-&lt;br /&gt;
| \[sd] || ″ || secondi&lt;br /&gt;
|-&lt;br /&gt;
| \[mc] || µ || micro&lt;br /&gt;
|-&lt;br /&gt;
| \[AN] || ∧ || congiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[OR] || ∨ || disgiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[no] || ¬ || negazione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[te] || ∃ || quantificatore esistenziale&lt;br /&gt;
|-&lt;br /&gt;
| \[fa] || ∀ || quantificatore universale (per ogni)&lt;br /&gt;
|-&lt;br /&gt;
| \[st] || ∋ || tale che&lt;br /&gt;
|-&lt;br /&gt;
| \[-+] || ∓ || meno più&lt;br /&gt;
|-&lt;br /&gt;
| \[+-] || ± || più meno&lt;br /&gt;
|-&lt;br /&gt;
| \[pc] || · || punto centrato&lt;br /&gt;
|-&lt;br /&gt;
| \[md] || ⋅ || moltiplicazione (punto)&lt;br /&gt;
|-&lt;br /&gt;
| \[mu] || × || moltiplicazione (croce)&lt;br /&gt;
|-&lt;br /&gt;
| \[c*] || ⊗ || moltiplicazione con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[c+] || ⊕ || somma con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[di] || ÷ || divisione&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;=] || ≤ || minore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;=] || ≥ || maggiore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;lt;] || ≪ || molto minore di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;&amp;gt;] || ≫ || molto maggiore di&lt;br /&gt;
|-&lt;br /&gt;
| \[!=] || ≠ || diverso da&lt;br /&gt;
|-&lt;br /&gt;
| \[==] || ≡ || equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[ne] || ≢ || non equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[=~] || ≅ || congruente&lt;br /&gt;
|-&lt;br /&gt;
| \[|=] || ≃ || asintoticamente uguale&lt;br /&gt;
|-&lt;br /&gt;
| \[ap] || ∼ || simile a&lt;br /&gt;
|-&lt;br /&gt;
| \[~=] || ≈ || quasi uguale a&lt;br /&gt;
|-&lt;br /&gt;
| \[pt] || ∝ || proporzionale a&lt;br /&gt;
|-&lt;br /&gt;
| \[es] || ∅ || insieme vuoto&lt;br /&gt;
|-&lt;br /&gt;
| \[mo] || ∈ || appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[nm] || ∉ || non appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[sb] || ⊂ || sottoinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nb] || ⊄ || non sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[sp] || ⊃ || superinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nc] || ⊅ || non superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ib] || ⊆ || sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ip] || ⊇ || superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ca] || ∩ || intersezione&lt;br /&gt;
|-&lt;br /&gt;
| \[cu] || ∪ || unione&lt;br /&gt;
|-&lt;br /&gt;
| \[pp] || ⊥ || perpendicolare&lt;br /&gt;
|-&lt;br /&gt;
| \[gr] || ∇ || gradiente&lt;br /&gt;
|-&lt;br /&gt;
| \[lc] || ⌈ || ceil sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rc] || ⌉ || ceil destro&lt;br /&gt;
|-&lt;br /&gt;
| \[lf] || ⌊ || floor sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rf] || ⌋ || floor destro&lt;br /&gt;
|-&lt;br /&gt;
| \[if] || ∞ || infinito&lt;br /&gt;
|-&lt;br /&gt;
| \[+p] || π || pi&lt;br /&gt;
|-&lt;br /&gt;
| \[CL] || ♣ || fiori&lt;br /&gt;
|-&lt;br /&gt;
| \[SP] || ♠ || picche&lt;br /&gt;
|-&lt;br /&gt;
| \[HE] || ♥ || quori&lt;br /&gt;
|-&lt;br /&gt;
| \[DI] || ♦ || mattoni&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
Le illustrazioni nel documento devono essere racchiuse tra i comandi .PS e .PE, ma hanno una sintassi completamente diversa da groff, poiché si tratta di un linguaggio diverso.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.PS&lt;br /&gt;
ellipse width 1.2 &amp;quot;documento.ms&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
box &amp;quot;gpic&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
box &amp;quot;groff&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
ellipse width 1.2 &amp;quot;documento.pdf&amp;quot;&lt;br /&gt;
.PE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
Le formule devono essere racchiuse tra i comandi .EQ e .EN, il linguaggio è ancora diverso&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.EQ&lt;br /&gt;
2 sup 2 = 4&lt;br /&gt;
.EN&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10023</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10023"/>
		<updated>2026-07-21T20:10:57Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come nei comandi della shell. Analogamente ai comandi della shell, se l'argomento è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|-&lt;br /&gt;
| \[lz] || ◊ || rombo&lt;br /&gt;
|-&lt;br /&gt;
| \[sq] || □ || quadrato&lt;br /&gt;
|-&lt;br /&gt;
| \[ps] || ¶ || fine del paragrafo&lt;br /&gt;
|-&lt;br /&gt;
| \[sc] || § || sezione&lt;br /&gt;
|-&lt;br /&gt;
| \[CR] || ↵ || carriage return&lt;br /&gt;
|-&lt;br /&gt;
| \[OK] || ✓ || check mark&lt;br /&gt;
|-&lt;br /&gt;
| \[co] || © || copyright&lt;br /&gt;
|-&lt;br /&gt;
| \[rg] || ® || registrato&lt;br /&gt;
|-&lt;br /&gt;
| \[tm] || ™ || trade mark&lt;br /&gt;
|-&lt;br /&gt;
| \[Do] || $ || dollaro&lt;br /&gt;
|-&lt;br /&gt;
| \[ct] || ¢ || centesimo&lt;br /&gt;
|-&lt;br /&gt;
| \[eu] || € || euro&lt;br /&gt;
|-&lt;br /&gt;
| \[Ye] || ¥ || yen&lt;br /&gt;
|-&lt;br /&gt;
| \[Po] || £ || pound&lt;br /&gt;
|-&lt;br /&gt;
| \[Cs] || ¤ || moneta scandinava&lt;br /&gt;
|-&lt;br /&gt;
| \[Fn] || ƒ || florin&lt;br /&gt;
|-&lt;br /&gt;
| \[de] || ° || grado&lt;br /&gt;
|-&lt;br /&gt;
| \[%0] || ‰ || per mille&lt;br /&gt;
|-&lt;br /&gt;
| \[fm] || ′ || minuti&lt;br /&gt;
|-&lt;br /&gt;
| \[sd] || ″ || secondi&lt;br /&gt;
|-&lt;br /&gt;
| \[mc] || µ || micro&lt;br /&gt;
|-&lt;br /&gt;
| \[AN] || ∧ || congiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[OR] || ∨ || disgiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[no] || ¬ || negazione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[te] || ∃ || quantificatore esistenziale&lt;br /&gt;
|-&lt;br /&gt;
| \[fa] || ∀ || quantificatore universale (per ogni)&lt;br /&gt;
|-&lt;br /&gt;
| \[st] || ∋ || tale che&lt;br /&gt;
|-&lt;br /&gt;
| \[-+] || ∓ || meno più&lt;br /&gt;
|-&lt;br /&gt;
| \[+-] || ± || più meno&lt;br /&gt;
|-&lt;br /&gt;
| \[pc] || · || punto centrato&lt;br /&gt;
|-&lt;br /&gt;
| \[md] || ⋅ || moltiplicazione (punto)&lt;br /&gt;
|-&lt;br /&gt;
| \[mu] || × || moltiplicazione (croce)&lt;br /&gt;
|-&lt;br /&gt;
| \[c*] || ⊗ || moltiplicazione con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[c+] || ⊕ || somma con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[di] || ÷ || divisione&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;=] || ≤ || minore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;=] || ≥ || maggiore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;lt;] || ≪ || molto minore di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;&amp;gt;] || ≫ || molto maggiore di&lt;br /&gt;
|-&lt;br /&gt;
| \[!=] || ≠ || diverso da&lt;br /&gt;
|-&lt;br /&gt;
| \[==] || ≡ || equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[ne] || ≢ || non equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[=~] || ≅ || congruente&lt;br /&gt;
|-&lt;br /&gt;
| \[|=] || ≃ || asintoticamente uguale&lt;br /&gt;
|-&lt;br /&gt;
| \[ap] || ∼ || simile a&lt;br /&gt;
|-&lt;br /&gt;
| \[~=] || ≈ || quasi uguale a&lt;br /&gt;
|-&lt;br /&gt;
| \[pt] || ∝ || proporzionale a&lt;br /&gt;
|-&lt;br /&gt;
| \[es] || ∅ || insieme vuoto&lt;br /&gt;
|-&lt;br /&gt;
| \[mo] || ∈ || appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[nm] || ∉ || non appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[sb] || ⊂ || sottoinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nb] || ⊄ || non sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[sp] || ⊃ || superinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nc] || ⊅ || non superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ib] || ⊆ || sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ip] || ⊇ || superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ca] || ∩ || intersezione&lt;br /&gt;
|-&lt;br /&gt;
| \[cu] || ∪ || unione&lt;br /&gt;
|-&lt;br /&gt;
| \[pp] || ⊥ || perpendicolare&lt;br /&gt;
|-&lt;br /&gt;
| \[gr] || ∇ || gradiente&lt;br /&gt;
|-&lt;br /&gt;
| \[lc] || ⌈ || ceil sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rc] || ⌉ || ceil destro&lt;br /&gt;
|-&lt;br /&gt;
| \[lf] || ⌊ || floor sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rf] || ⌋ || floor destro&lt;br /&gt;
|-&lt;br /&gt;
| \[if] || ∞ || infinito&lt;br /&gt;
|-&lt;br /&gt;
| \[+p] || π || pi&lt;br /&gt;
|-&lt;br /&gt;
| \[CL] || ♣ || fiori&lt;br /&gt;
|-&lt;br /&gt;
| \[SP] || ♠ || picche&lt;br /&gt;
|-&lt;br /&gt;
| \[HE] || ♥ || quori&lt;br /&gt;
|-&lt;br /&gt;
| \[DI] || ♦ || mattoni&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
Le illustrazioni nel documento devono essere racchiuse tra i comandi .PS e .PE, ma hanno una sintassi completamente diversa da groff, poiché si tratta di un linguaggio diverso.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.PS&lt;br /&gt;
ellipse width 1.2 &amp;quot;documento.ms&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
box &amp;quot;gpic&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
box &amp;quot;groff&amp;quot;&lt;br /&gt;
arrow&lt;br /&gt;
ellipse width 1.2 &amp;quot;documento.pdf&amp;quot;&lt;br /&gt;
.PE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10019</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10019"/>
		<updated>2026-06-20T21:51:41Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf ([https://hacktivis.me/projects/badwolf]) è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a sinistra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;br /&gt;
&lt;br /&gt;
=Installazione da sorgente=&lt;br /&gt;
Il sorgente (è un tar.gz) è disponibile nella homepage.&lt;br /&gt;
Il build system utilizzato è ninja (non make). Prima di compilare, oltre a ninja (su Debian: ''sudo apt install ninja-build''), installare il pacchetto di sviluppo di WebKitGTK+ (su Debian: ''sudo apt install libwebkit2gtk-4.1-dev'').&lt;br /&gt;
&lt;br /&gt;
Successivamente, fare ''./configure &amp;amp;&amp;amp; ninja''. Se vi dice che un altra dipendenza manca, allora installatela e riprovate.&lt;br /&gt;
&lt;br /&gt;
Se il sorgente è stato compilato, fare ''sudo ninja install''&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10017</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10017"/>
		<updated>2026-06-10T06:34:09Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come nei comandi della shell. Analogamente ai comandi della shell, se l'argomento è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|-&lt;br /&gt;
| \[lz] || ◊ || rombo&lt;br /&gt;
|-&lt;br /&gt;
| \[sq] || □ || quadrato&lt;br /&gt;
|-&lt;br /&gt;
| \[ps] || ¶ || fine del paragrafo&lt;br /&gt;
|-&lt;br /&gt;
| \[sc] || § || sezione&lt;br /&gt;
|-&lt;br /&gt;
| \[CR] || ↵ || carriage return&lt;br /&gt;
|-&lt;br /&gt;
| \[OK] || ✓ || check mark&lt;br /&gt;
|-&lt;br /&gt;
| \[co] || © || copyright&lt;br /&gt;
|-&lt;br /&gt;
| \[rg] || ® || registrato&lt;br /&gt;
|-&lt;br /&gt;
| \[tm] || ™ || trade mark&lt;br /&gt;
|-&lt;br /&gt;
| \[Do] || $ || dollaro&lt;br /&gt;
|-&lt;br /&gt;
| \[ct] || ¢ || centesimo&lt;br /&gt;
|-&lt;br /&gt;
| \[eu] || € || euro&lt;br /&gt;
|-&lt;br /&gt;
| \[Ye] || ¥ || yen&lt;br /&gt;
|-&lt;br /&gt;
| \[Po] || £ || pound&lt;br /&gt;
|-&lt;br /&gt;
| \[Cs] || ¤ || moneta scandinava&lt;br /&gt;
|-&lt;br /&gt;
| \[Fn] || ƒ || florin&lt;br /&gt;
|-&lt;br /&gt;
| \[de] || ° || grado&lt;br /&gt;
|-&lt;br /&gt;
| \[%0] || ‰ || per mille&lt;br /&gt;
|-&lt;br /&gt;
| \[fm] || ′ || minuti&lt;br /&gt;
|-&lt;br /&gt;
| \[sd] || ″ || secondi&lt;br /&gt;
|-&lt;br /&gt;
| \[mc] || µ || micro&lt;br /&gt;
|-&lt;br /&gt;
| \[AN] || ∧ || congiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[OR] || ∨ || disgiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[no] || ¬ || negazione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[te] || ∃ || quantificatore esistenziale&lt;br /&gt;
|-&lt;br /&gt;
| \[fa] || ∀ || quantificatore universale (per ogni)&lt;br /&gt;
|-&lt;br /&gt;
| \[st] || ∋ || tale che&lt;br /&gt;
|-&lt;br /&gt;
| \[-+] || ∓ || meno più&lt;br /&gt;
|-&lt;br /&gt;
| \[+-] || ± || più meno&lt;br /&gt;
|-&lt;br /&gt;
| \[pc] || · || punto centrato&lt;br /&gt;
|-&lt;br /&gt;
| \[md] || ⋅ || moltiplicazione (punto)&lt;br /&gt;
|-&lt;br /&gt;
| \[mu] || × || moltiplicazione (croce)&lt;br /&gt;
|-&lt;br /&gt;
| \[c*] || ⊗ || moltiplicazione con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[c+] || ⊕ || somma con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[di] || ÷ || divisione&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;=] || ≤ || minore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;=] || ≥ || maggiore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;lt;] || ≪ || molto minore di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;&amp;gt;] || ≫ || molto maggiore di&lt;br /&gt;
|-&lt;br /&gt;
| \[!=] || ≠ || diverso da&lt;br /&gt;
|-&lt;br /&gt;
| \[==] || ≡ || equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[ne] || ≢ || non equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[=~] || ≅ || congruente&lt;br /&gt;
|-&lt;br /&gt;
| \[|=] || ≃ || asintoticamente uguale&lt;br /&gt;
|-&lt;br /&gt;
| \[ap] || ∼ || simile a&lt;br /&gt;
|-&lt;br /&gt;
| \[~=] || ≈ || quasi uguale a&lt;br /&gt;
|-&lt;br /&gt;
| \[pt] || ∝ || proporzionale a&lt;br /&gt;
|-&lt;br /&gt;
| \[es] || ∅ || insieme vuoto&lt;br /&gt;
|-&lt;br /&gt;
| \[mo] || ∈ || appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[nm] || ∉ || non appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[sb] || ⊂ || sottoinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nb] || ⊄ || non sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[sp] || ⊃ || superinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nc] || ⊅ || non superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ib] || ⊆ || sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ip] || ⊇ || superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ca] || ∩ || intersezione&lt;br /&gt;
|-&lt;br /&gt;
| \[cu] || ∪ || unione&lt;br /&gt;
|-&lt;br /&gt;
| \[pp] || ⊥ || perpendicolare&lt;br /&gt;
|-&lt;br /&gt;
| \[gr] || ∇ || gradiente&lt;br /&gt;
|-&lt;br /&gt;
| \[lc] || ⌈ || ceil sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rc] || ⌉ || ceil destro&lt;br /&gt;
|-&lt;br /&gt;
| \[lf] || ⌊ || floor sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rf] || ⌋ || floor destro&lt;br /&gt;
|-&lt;br /&gt;
| \[if] || ∞ || infinito&lt;br /&gt;
|-&lt;br /&gt;
| \[+p] || π || pi&lt;br /&gt;
|-&lt;br /&gt;
| \[CL] || ♣ || fiori&lt;br /&gt;
|-&lt;br /&gt;
| \[SP] || ♠ || picche&lt;br /&gt;
|-&lt;br /&gt;
| \[HE] || ♥ || quori&lt;br /&gt;
|-&lt;br /&gt;
| \[DI] || ♦ || mattoni&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10016</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10016"/>
		<updated>2026-06-09T23:24:39Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* cheatsheet di alcuni caratteri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|-&lt;br /&gt;
| \[lz] || ◊ || rombo&lt;br /&gt;
|-&lt;br /&gt;
| \[sq] || □ || quadrato&lt;br /&gt;
|-&lt;br /&gt;
| \[ps] || ¶ || fine del paragrafo&lt;br /&gt;
|-&lt;br /&gt;
| \[sc] || § || sezione&lt;br /&gt;
|-&lt;br /&gt;
| \[CR] || ↵ || carriage return&lt;br /&gt;
|-&lt;br /&gt;
| \[OK] || ✓ || check mark&lt;br /&gt;
|-&lt;br /&gt;
| \[co] || © || copyright&lt;br /&gt;
|-&lt;br /&gt;
| \[rg] || ® || registrato&lt;br /&gt;
|-&lt;br /&gt;
| \[tm] || ™ || trade mark&lt;br /&gt;
|-&lt;br /&gt;
| \[Do] || $ || dollaro&lt;br /&gt;
|-&lt;br /&gt;
| \[ct] || ¢ || centesimo&lt;br /&gt;
|-&lt;br /&gt;
| \[eu] || € || euro&lt;br /&gt;
|-&lt;br /&gt;
| \[Ye] || ¥ || yen&lt;br /&gt;
|-&lt;br /&gt;
| \[Po] || £ || pound&lt;br /&gt;
|-&lt;br /&gt;
| \[Cs] || ¤ || moneta scandinava&lt;br /&gt;
|-&lt;br /&gt;
| \[Fn] || ƒ || florin&lt;br /&gt;
|-&lt;br /&gt;
| \[de] || ° || grado&lt;br /&gt;
|-&lt;br /&gt;
| \[%0] || ‰ || per mille&lt;br /&gt;
|-&lt;br /&gt;
| \[fm] || ′ || minuti&lt;br /&gt;
|-&lt;br /&gt;
| \[sd] || ″ || secondi&lt;br /&gt;
|-&lt;br /&gt;
| \[mc] || µ || micro&lt;br /&gt;
|-&lt;br /&gt;
| \[AN] || ∧ || congiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[OR] || ∨ || disgiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[no] || ¬ || negazione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[te] || ∃ || quantificatore esistenziale&lt;br /&gt;
|-&lt;br /&gt;
| \[fa] || ∀ || quantificatore universale (per ogni)&lt;br /&gt;
|-&lt;br /&gt;
| \[st] || ∋ || tale che&lt;br /&gt;
|-&lt;br /&gt;
| \[-+] || ∓ || meno più&lt;br /&gt;
|-&lt;br /&gt;
| \[+-] || ± || più meno&lt;br /&gt;
|-&lt;br /&gt;
| \[pc] || · || punto centrato&lt;br /&gt;
|-&lt;br /&gt;
| \[md] || ⋅ || moltiplicazione (punto)&lt;br /&gt;
|-&lt;br /&gt;
| \[mu] || × || moltiplicazione (croce)&lt;br /&gt;
|-&lt;br /&gt;
| \[c*] || ⊗ || moltiplicazione con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[c+] || ⊕ || somma con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[di] || ÷ || divisione&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;=] || ≤ || minore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;=] || ≥ || maggiore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;lt;] || ≪ || molto minore di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;&amp;gt;] || ≫ || molto maggiore di&lt;br /&gt;
|-&lt;br /&gt;
| \[!=] || ≠ || diverso da&lt;br /&gt;
|-&lt;br /&gt;
| \[==] || ≡ || equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[ne] || ≢ || non equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[=~] || ≅ || congruente&lt;br /&gt;
|-&lt;br /&gt;
| \[|=] || ≃ || asintoticamente uguale&lt;br /&gt;
|-&lt;br /&gt;
| \[ap] || ∼ || simile a&lt;br /&gt;
|-&lt;br /&gt;
| \[~=] || ≈ || quasi uguale a&lt;br /&gt;
|-&lt;br /&gt;
| \[pt] || ∝ || proporzionale a&lt;br /&gt;
|-&lt;br /&gt;
| \[es] || ∅ || insieme vuoto&lt;br /&gt;
|-&lt;br /&gt;
| \[mo] || ∈ || appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[nm] || ∉ || non appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[sb] || ⊂ || sottoinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nb] || ⊄ || non sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[sp] || ⊃ || superinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nc] || ⊅ || non superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ib] || ⊆ || sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ip] || ⊇ || superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ca] || ∩ || intersezione&lt;br /&gt;
|-&lt;br /&gt;
| \[cu] || ∪ || unione&lt;br /&gt;
|-&lt;br /&gt;
| \[pp] || ⊥ || perpendicolare&lt;br /&gt;
|-&lt;br /&gt;
| \[gr] || ∇ || gradiente&lt;br /&gt;
|-&lt;br /&gt;
| \[lc] || ⌈ || ceil sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rc] || ⌉ || ceil destro&lt;br /&gt;
|-&lt;br /&gt;
| \[lf] || ⌊ || floor sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rf] || ⌋ || floor destro&lt;br /&gt;
|-&lt;br /&gt;
| \[if] || ∞ || infinito&lt;br /&gt;
|-&lt;br /&gt;
| \[+p] || π || pi&lt;br /&gt;
|-&lt;br /&gt;
| \[CL] || ♣ || fiori&lt;br /&gt;
|-&lt;br /&gt;
| \[SP] || ♠ || picche&lt;br /&gt;
|-&lt;br /&gt;
| \[HE] || ♥ || quori&lt;br /&gt;
|-&lt;br /&gt;
| \[DI] || ♦ || mattoni&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10015</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10015"/>
		<updated>2026-06-09T23:23:00Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* cheatsheet di alcuni caratteri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|-&lt;br /&gt;
| \[lz] || ◊ || rombo&lt;br /&gt;
|-&lt;br /&gt;
| \[sq] || □ || quadrato&lt;br /&gt;
|-&lt;br /&gt;
| \[ps] || ¶ || fine del paragrafo&lt;br /&gt;
|-&lt;br /&gt;
| \[sc] || § || sezione&lt;br /&gt;
|-&lt;br /&gt;
| \[CR] || ↵ || carriage return&lt;br /&gt;
|-&lt;br /&gt;
| \[OK] || ✓ || check mark&lt;br /&gt;
|-&lt;br /&gt;
| \[co] || © || copyright&lt;br /&gt;
|-&lt;br /&gt;
| \[rg] || ® || registrato&lt;br /&gt;
|-&lt;br /&gt;
| \[tm] || ™ || trade mark&lt;br /&gt;
|-&lt;br /&gt;
| \[Do] || $ || dollaro&lt;br /&gt;
|-&lt;br /&gt;
| \[ct] || ¢ || centesimo&lt;br /&gt;
|-&lt;br /&gt;
| \[eu] || € || euro&lt;br /&gt;
|-&lt;br /&gt;
| \[Ye] || ¥ || yen&lt;br /&gt;
|-&lt;br /&gt;
| \[Po] || £ || pound&lt;br /&gt;
|-&lt;br /&gt;
| \[Cs] || ¤ || moneta scandinava&lt;br /&gt;
|-&lt;br /&gt;
| \[Fn] || ƒ || florin&lt;br /&gt;
|-&lt;br /&gt;
| \[de] || ° || grado&lt;br /&gt;
|-&lt;br /&gt;
| \[%0] || ‰ || per mille&lt;br /&gt;
|-&lt;br /&gt;
| \[fm] || ′ || minuti&lt;br /&gt;
|-&lt;br /&gt;
| \[sd] || ″ || secondi&lt;br /&gt;
|-&lt;br /&gt;
| \[mc] || µ || micro&lt;br /&gt;
|-&lt;br /&gt;
| \[AN] || ∧ || congiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[OR] || ∨ || disgiunzione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[no] || ¬ || negazione logica&lt;br /&gt;
|-&lt;br /&gt;
| \[te] || ∃ || quantificatore esistenziale&lt;br /&gt;
|-&lt;br /&gt;
| \[fa] || ∀ || quantificatore universale (per ogni)&lt;br /&gt;
|-&lt;br /&gt;
| \[st] || ∋ || tale che&lt;br /&gt;
|-&lt;br /&gt;
| \[-+] || ∓ || meno più&lt;br /&gt;
|-&lt;br /&gt;
| \[+-] || ± || più meno&lt;br /&gt;
|-&lt;br /&gt;
| \[pc] || · || punto centrato&lt;br /&gt;
|-&lt;br /&gt;
| \[md] || ⋅ || moltiplicazione (punto)&lt;br /&gt;
|-&lt;br /&gt;
| \[mu] || × || moltiplicazione (croce)&lt;br /&gt;
|-&lt;br /&gt;
| \[c*] || ⊗ || moltiplicazione con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[c+] || ⊕ || somma con cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[di] || ÷ || divisione&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;=] || ≤ || minore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;=] || ≥ || maggiore o uguale di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;lt;] || ≪ || molto minore di&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;gt;&amp;gt;] || ≫ || molto maggiore di&lt;br /&gt;
|-&lt;br /&gt;
| \[!=] || ≠ || diverso da&lt;br /&gt;
|-&lt;br /&gt;
| \[==] || ≡ || equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[ne] || ≢ || non equivalente a&lt;br /&gt;
|-&lt;br /&gt;
| \[=~] || ≅ || congruente&lt;br /&gt;
|-&lt;br /&gt;
| \[|=] || ≃ || asintoticamente uguale&lt;br /&gt;
|-&lt;br /&gt;
| \[ap] || ∼ || simile a&lt;br /&gt;
|-&lt;br /&gt;
| \[~=] || ≈ || quasi uguale a&lt;br /&gt;
|-&lt;br /&gt;
| \[pt] || ∝ || proporzionale a&lt;br /&gt;
|-&lt;br /&gt;
| \[es] || ∅ || insieme vuoto&lt;br /&gt;
|-&lt;br /&gt;
| \[mo] || ∈ || appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[nm] || ∉ || non appartiene a&lt;br /&gt;
|-&lt;br /&gt;
| \[sb] || ⊂ || sottoinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nb] || ⊄ || non sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[sp] || ⊃ || superinsieme proprio&lt;br /&gt;
|-&lt;br /&gt;
| \[nc] || ⊅ || non superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ib] || ⊆ || sottoinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ip] || ⊇ || superinsieme&lt;br /&gt;
|-&lt;br /&gt;
| \[ca] || ∩ || intersezione&lt;br /&gt;
|-&lt;br /&gt;
| \[cu] || ∪ || unione&lt;br /&gt;
|-&lt;br /&gt;
| \[pp] || ⊥ || perpendicolare&lt;br /&gt;
|-&lt;br /&gt;
| \[gr] || ∇ || gradiente&lt;br /&gt;
|-&lt;br /&gt;
| \[lc] || ⌈ || ceil sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rc] || ⌉ || ceil destro&lt;br /&gt;
|-&lt;br /&gt;
| \[lf] || ⌊ || floor sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[rf] || ⌋ || floor destro&lt;br /&gt;
|-&lt;br /&gt;
| \[if] || ∞ || infinito&lt;br /&gt;
|-&lt;br /&gt;
| \[+p] || π || pi&lt;br /&gt;
|-&lt;br /&gt;
| \[CL] || ♣ || fiori&lt;br /&gt;
|-&lt;br /&gt;
| \[SP] || ♠ || picche&lt;br /&gt;
|-&lt;br /&gt;
| \[HE] || ♥ || quori&lt;br /&gt;
|-&lt;br /&gt;
| \[DI] || ♦ || diamanti&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10014</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10014"/>
		<updated>2026-06-09T22:42:14Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* cheatsheet di alcuni caratteri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || doppie virgolette a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || doppie virgolette a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || grande angolo sinistro&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || grande angolo destro&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || angolo alto a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || angolo basso a sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || angolo alto a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || angolo basso a destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10012</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10012"/>
		<updated>2026-06-09T22:28:16Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* cheatsheet di alcuni caratteri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10011</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10011"/>
		<updated>2026-06-09T22:27:50Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* cheatsheet di alcuni caratteri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Caratteri speciali&lt;br /&gt;
|-&lt;br /&gt;
! Input !! Output !! nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fo] || « || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[Fc] || » || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[fo] || ‹ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[fc] || › || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[la] || ⟨ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[ra] || ⟩ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketlefttp] || ⎡ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketleftbt] || ⎣ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrighttp] || ⎤ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[bracketrightbt] || ⎦ || nome&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;-] || ← || freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[-&amp;gt;] || → || freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[&amp;lt;&amp;gt;] || ↔ || freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[da] || ↓ || freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[ua] || ↑ || freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[va] || ↕ || freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[lA] || ⇐ || doppia freccia sinistra&lt;br /&gt;
|-&lt;br /&gt;
| \[rA] || ⇒ || doppia freccia destra&lt;br /&gt;
|-&lt;br /&gt;
| \[hA] || ⇔ || doppia freccia sx-dx&lt;br /&gt;
|-&lt;br /&gt;
| \[dA] || ⇓ || doppia freccia giù&lt;br /&gt;
|-&lt;br /&gt;
| \[uA] || ⇑ || doppia freccia sù&lt;br /&gt;
|-&lt;br /&gt;
| \[vA] || ⇕ || doppia freccia giù-sù&lt;br /&gt;
|-&lt;br /&gt;
| \[ci] || ○ || cerchio&lt;br /&gt;
|-&lt;br /&gt;
| \[bu] || • || pallino&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10010</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10010"/>
		<updated>2026-06-09T22:16:50Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino • (scritto \[bu], vedere i caratteri speciali nella sezione dedicata), oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
* « \[Fo]&lt;br /&gt;
* » \[Fc]&lt;br /&gt;
* ‹ \[fo]&lt;br /&gt;
* › \[fc]&lt;br /&gt;
* ⟨ \[la]&lt;br /&gt;
* ⟩ \[ra]&lt;br /&gt;
* ⎡ \[bracketlefttp]&lt;br /&gt;
* ⎣ \[bracketleftbt]&lt;br /&gt;
* ⎤ \[bracketrighttp]&lt;br /&gt;
* ⎦ \[bracketrightbt]&lt;br /&gt;
* ← \[&amp;lt;-]&lt;br /&gt;
* → \[-&amp;gt;]&lt;br /&gt;
* ↔ \[&amp;lt;&amp;gt;]&lt;br /&gt;
* ↓ \[da]&lt;br /&gt;
* ↑ \[ua]&lt;br /&gt;
* ↕ \[va]&lt;br /&gt;
* ⇐ \[lA]&lt;br /&gt;
* ⇒ \[rA]&lt;br /&gt;
* ⇔ \[hA]&lt;br /&gt;
* ⇓ \[dA]&lt;br /&gt;
* ⇑ \[uA]&lt;br /&gt;
* ⇕ \[vA]&lt;br /&gt;
* ○ \[ci]&lt;br /&gt;
* • \[bu]&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10009</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10009"/>
		<updated>2026-06-09T22:14:58Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino •, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
* « \[Fo]&lt;br /&gt;
* » \[Fc]&lt;br /&gt;
* ‹ \[fo]&lt;br /&gt;
* › \[fc]&lt;br /&gt;
* ⟨ \[la]&lt;br /&gt;
* ⟩ \[ra]&lt;br /&gt;
* ⎡ \[bracketlefttp]&lt;br /&gt;
* ⎣ \[bracketleftbt]&lt;br /&gt;
* ⎤ \[bracketrighttp]&lt;br /&gt;
* ⎦ \[bracketrightbt]&lt;br /&gt;
* ← \[&amp;lt;-]&lt;br /&gt;
* → \[-&amp;gt;]&lt;br /&gt;
* ↔ \[&amp;lt;&amp;gt;]&lt;br /&gt;
* ↓ \[da]&lt;br /&gt;
* ↑ \[ua]&lt;br /&gt;
* ↕ \[va]&lt;br /&gt;
* ⇐ \[lA]&lt;br /&gt;
* ⇒ \[rA]&lt;br /&gt;
* ⇔ \[hA]&lt;br /&gt;
* ⇓ \[dA]&lt;br /&gt;
* ⇑ \[uA]&lt;br /&gt;
* ⇕ \[vA]&lt;br /&gt;
* ○ \[ci]&lt;br /&gt;
* • \[bu]&lt;br /&gt;
&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10008</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10008"/>
		<updated>2026-06-09T22:02:06Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
COMANDO può essere&lt;br /&gt;
&lt;br /&gt;
*'''B''': grassetto&lt;br /&gt;
*'''I''': corsivo&lt;br /&gt;
*'''BI''': grassetto e corsivo&lt;br /&gt;
*'''R''': roman&lt;br /&gt;
*'''CW''': monospace&lt;br /&gt;
*'''BX''': racchiudi ''testo'' in un rettangolo&lt;br /&gt;
*'''UL''': sottolineatura&lt;br /&gt;
*'''LG''': testo ingrandito&lt;br /&gt;
*'''SM''': testo rimpicciolito&lt;br /&gt;
*'''NL''': testo di dimensione normale&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10007</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10007"/>
		<updated>2026-06-09T21:56:14Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo di base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Formattazione del testo==&lt;br /&gt;
&lt;br /&gt;
I comandi che formattano il testo in groff sono molto simili:&lt;br /&gt;
&lt;br /&gt;
''.COMANDO testo [dopo] [prima]''&lt;br /&gt;
&lt;br /&gt;
Il comando mostrerà il ''testo'' con la formattazione scelta da ''COMANDO''. ''dopo'' e ''prima'' sono argomenti opzionali e, se presenti, vengono mostrati con la formattazione che c'era prima di ''COMANDO'', posizionati rispettivamente dopo e prima il ''testo''. Ad esempio, il comando&lt;br /&gt;
&lt;br /&gt;
.B ciao ) (&lt;br /&gt;
&lt;br /&gt;
verrà compilato in ('''ciao''')&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10006</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10006"/>
		<updated>2026-06-09T21:44:39Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto, immediatamente seguito dal nome del comando.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un primo esempio di un comando che prende un argomento opzionale: il livello della sezione. Gli argomenti vengono dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
&lt;br /&gt;
Per compilare un documento ''doc.ms'' e generare ''doc.pdf'', il comando da utilizzare è&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -Tpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
Questo comando funziona solo se non si usa nessun preprocessore. Per far compilare anche i documenti che usano i preprocessori, usare&lt;br /&gt;
&lt;br /&gt;
''groff -ms doc.ms -petTpdf &amp;gt; doc.pdf''&lt;br /&gt;
&lt;br /&gt;
* '''-p''': è stato aggiunto per il preprocessore '''pic'''&lt;br /&gt;
* '''-e''': è stato aggiunto per il preprocessore '''eqn'''&lt;br /&gt;
* '''-t''': è stato aggiunto per il preprocessore '''tbl'''&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
=Preprocessori=&lt;br /&gt;
==Illustrazioni con pic==&lt;br /&gt;
==Formule matematiche con eqn==&lt;br /&gt;
==Tabelle con tbl==&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10005</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10005"/>
		<updated>2026-06-09T21:35:12Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto.&lt;br /&gt;
&lt;br /&gt;
=Utilizzo base=&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un esempio di un comando che prende un argomento opzionale: il livello dell'heading. Gli argomenti vengon dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
=GNU pic=&lt;br /&gt;
=GNU eqn=&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10004</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=10004"/>
		<updated>2026-06-09T21:24:29Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto.&lt;br /&gt;
&lt;br /&gt;
==Sezioni, sottosezioni e paragrafi==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un esempio di un comando che prende un argomento opzionale: il livello dell'heading. Gli argomenti vengon dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==Liste==&lt;br /&gt;
&lt;br /&gt;
Per fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compilare un file con estensione .ms==&lt;br /&gt;
==cheatsheet di alcuni caratteri==&lt;br /&gt;
=GNU pic=&lt;br /&gt;
=GNU eqn=&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10003</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10003"/>
		<updated>2026-06-09T21:17:31Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf ([https://hacktivis.me/projects/badwolf]) è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;br /&gt;
&lt;br /&gt;
=Installazione da sorgente=&lt;br /&gt;
Il sorgente (è un tar.gz) è disponibile nella homepage.&lt;br /&gt;
Il build system utilizzato è ninja (non make). Prima di compilare, oltre a ninja (su Debian: ''sudo apt install ninja-build''), installare il pacchetto di sviluppo di WebKitGTK+ (su Debian: ''sudo apt install libwebkit2gtk-4.1-dev''). Il file README.md contiene le restanti istruzioni (dovete fare ''./configure &amp;amp;&amp;amp; ninja'', poi ''sudo ninja install'')&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10002</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10002"/>
		<updated>2026-06-09T21:11:48Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf ([https://hacktivis.me/projects/badwolf]) è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;br /&gt;
&lt;br /&gt;
=Installazione da sorgente=&lt;br /&gt;
Il sorgente (è un tar.gz) è disponibile nella homepage.&lt;br /&gt;
Il build system utilizzato è ninja (non make). Prima di compilare, oltre a ninja (su Debian: ''sudo apt install ninja-build''), installare il pacchetto di sviluppo di WebKitGTK+ (su Debian: ''sudo apt install libwebkit2gtk-4.1-dev''). Il file README.md contiene le restanti istruzioni (dovete fare ''./configure &amp;amp;&amp;amp; ninja'', poi ''sudo ninja install'')&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10001</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10001"/>
		<updated>2026-06-09T21:10:20Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf ([https://hacktivis.me/projects/badwolf]) è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;br /&gt;
&lt;br /&gt;
=Installazione da sorgente=&lt;br /&gt;
Il sorgente (è un tar.gz) è disponibile nella homepage.&lt;br /&gt;
Il build system utilizzato è ninja (non make). Prima di compilare, oltre a ninja (su Debian: ''sudo apt install ninja-build''), installare il pacchetto di sviluppo di WebKitGTK+ (su Debian: ''sudo apt install libwebkit2gtk-4.1-dev''). Il file README.md contiene le restanti istruzioni (dovete fare ./configure &amp;amp;&amp;amp; ninja, poi ''sudo ninja install'')&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10000</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=10000"/>
		<updated>2026-06-09T21:05:08Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf ([https://hacktivis.me/projects/badwolf]) è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;br /&gt;
&lt;br /&gt;
=Installazione da sorgente=&lt;br /&gt;
Il sorgente (è un tar.gz) è disponibile nella homepage.&lt;br /&gt;
Il build system utilizzato è ninja (non make). Prima di compilare, oltre a ninja (su Debian: ''apt install ninja-build''), installare il pacchetto di sviluppo di WebKitGTK+ (su Debian: ''apt install libwebkit2gtk-4.1-dev''). Il file README.md contiene le restanti istruzioni (dovete fare ./configure &amp;amp;&amp;amp; ninja, poi sudo ninja install)&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9999</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9999"/>
		<updated>2026-06-09T20:36:54Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 6 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [[File:Intro.pdf]] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [[File:Python_lez1.pdf]] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [[File:Python_lez2.pdf]] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [[File:Python_lez3.pdf]] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [[File:Python_lez4.pdf]] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [[File:Python_lez5.pdf]] (dataset usato: [[File:Pacif.txt]]) - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' [[File:Python_lez6.pdf]] - ''Lunedì 30 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return np.arange(m)[A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib &amp;quot;migliorata&amp;quot; con Pandas =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return pd.read_csv('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                       names=['score', 'race', 'back'])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(len(im.index))&lt;br /&gt;
    im = im.T.reset_index(drop=True)&lt;br /&gt;
    x = im.idxmin()&lt;br /&gt;
    c = im.min()&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    return data.pivot_table(columns='race', index='back', values='score', aggfunc='min')&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    return data[['race', 'back']].pivot_table(columns='race', index='back', aggfunc=len, fill_value=0)&lt;br /&gt;
&lt;br /&gt;
def plotusage(table):&lt;br /&gt;
    plt.xticks(np.arange(len(table.columns)), table.columns, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(table.index)), table.index)&lt;br /&gt;
    plt.imshow(table)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=backgrounds.where(race &amp;gt; 0, ''))&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[~cond]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(table, ax):&lt;br /&gt;
    races = ['Minotaur', 'Spriggan', 'Mountain Dwarf']&lt;br /&gt;
    backgrounds = ['Berserker', 'Fighter', 'Enchanter', 'Hexslinger']&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(races)), np.arange(len(backgrounds)))&lt;br /&gt;
    xyh = pd.DataFrame({'pos_x':xpos.ravel(), 'pos_y':ypos.ravel(),&lt;br /&gt;
                        'best_score':table.loc[backgrounds, races].to_numpy().ravel()})&lt;br /&gt;
    xyh = xyh[xyh['best_score'].notna()]&lt;br /&gt;
    plt.yticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.xticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh['pos_x']-0.25, xyh['pos_y']-0.25, 0, 0.5, 0.5, xyh['best_score'])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    im1, im2 = tocount(data), tobest(data)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1['Minotaur'], im1.index, 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9998</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9998"/>
		<updated>2026-06-09T20:22:44Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti '''JS''' e '''IMG''':&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9997</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9997"/>
		<updated>2026-06-09T20:17:17Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS). Il CSS è supportato, inoltre ci sono due pulsanti interessanti, mostrati nella seguente immagine&lt;br /&gt;
&lt;br /&gt;
[[File:Badwolf1.png]]&lt;br /&gt;
&lt;br /&gt;
Tra i pulsanti in alto a destra, oltre quelli per andare avanti e indietro, ci sono i pulsanti JS e IMG:&lt;br /&gt;
* '''JS''': abilita / disabilita javascript&lt;br /&gt;
* '''IMG''': abilita / disabilita il caricamento automatico delle immagini&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=GolemWiki:Informazioni&amp;diff=9996</id>
		<title>GolemWiki:Informazioni</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=GolemWiki:Informazioni&amp;diff=9996"/>
		<updated>2026-06-09T20:12:51Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Linee guida */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Gran parte del nostro sito web è un '''wiki''', realizzato usando il software [http://www.mediawiki.org/wiki/MediaWiki MediaWiKi], che permette la modifica del sito da parte di tutti gli utenti registrati.&lt;br /&gt;
&lt;br /&gt;
La registrazione è stata libera e non condizionata a nessuna verifica di accettazione fino ad agosto 2009. '''Purtroppo''', con l'iscrizione non controllata, il sito si stava riempiendo di collegamenti indesiderati, così abbiamo deciso di bloccare le iscrizioni automatiche.&lt;br /&gt;
&lt;br /&gt;
Se vuoi aiutarci devi '''contattare''' gli Amministratori in [http://golem.linux.it/wp/contatti/ lista], che provvederanno a creare il tuo utente. Dopo che il tuo utente è stato creato e che la tua password ti è stata comunicata, '''CAMBIALA SUBITO!'''&lt;br /&gt;
&lt;br /&gt;
Prima di procedere alle modifiche delle pagine, ti consigliamo di '''consultare''' il [http://meta.wikimedia.org/wiki/Aiuto:Sommario manuale di MediaWiki].&lt;br /&gt;
&lt;br /&gt;
== Linee guida ==&lt;br /&gt;
Sono qui raccolte alcune linee guida informali che sarebbe bene rispettare per permettere al Wiki di mantenere una struttura quanto più possibile uniforme. Gli amministratori del Wiki e gli utenti del sito ve ne saranno immensamente grati:&lt;br /&gt;
* non utilizzare il maiuscolo nel nome delle pagine,&lt;br /&gt;
** ad eccezione delle parole che lo prevedano esplicitamente, come gli acronimi. Ad esempio, ''GOLEM'' va scritto tutto maiuscolo&lt;br /&gt;
* se la pagina si riferisce ad un evento che è ricorrente (o che lo potrebbe diventare) è bene '''specificare la data nel nome''' (spesso l'anno è più che sufficiente). Ad esempio ''Linux Day'' non va bene, mentre ''Linux Day 2015'' sì.&lt;br /&gt;
* anche se facciamo di tutto per mantenere la retrocompatibilità con gli URL, quando si inseriscono link a risorse interne (per esempio foto o documenti caricati sul wiki), utilizzare sempre il '''markup per i link interni''' (cioè &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[File:Risorsa.jpeg]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;) e non l'URL completo (cioè &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[https://wiki.golem.linux.it/img/Risorsa.jpeg]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;), per questioni di portabilità e compatibilità futura.&lt;br /&gt;
* prima di salvare, visitare l'elenco delle categorie e '''categorizzare opportunamente''' la pagina, così sarà più facile ritrovarla&lt;br /&gt;
* tutto quello che c'è si riusa e '''non si butta via niente'''; ciò aiuta a mantenere la memoria e a rispettare il lavoro altrui. Il materiale vecchio e obsoleto deve essere aggiornato, oppure messo da parte contrassegnato chiaramente come tale.&lt;br /&gt;
&lt;br /&gt;
== Template e formattatori utili ==&lt;br /&gt;
&lt;br /&gt;
* [[Template:Note]]: specchietti con note informative, avvertimenti, suggerimenti;&lt;br /&gt;
* [[Template:Sviluppo]]: template informativo per descrivere lo sviluppo di un progetto;&lt;br /&gt;
* [[Template:OraDelGolem]]: template per le Ore del GOLEM.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;&amp;lt;math&amp;gt;\frac{\sin (\pi x)}{x}&amp;lt;/math&amp;gt;&amp;lt;/nowiki&amp;gt;: tag per inserire formule matematiche con sintassi LaTeX, come &amp;lt;math&amp;gt;\frac{\sin (\pi x)}{x}&amp;lt;/math&amp;gt;;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;&amp;lt;ref&amp;gt;Nota ...&amp;lt;/ref&amp;gt;&amp;lt;/nowiki&amp;gt;: note a fondo pagina incrementali&amp;lt;ref&amp;gt;Questo è un esempio di nota&amp;lt;/ref&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Skin ==&lt;br /&gt;
Il tema o stile del sito (o skin, nel gergo di MediaWiki) è basato su [https://www.mediawiki.org/wiki/Skin:Vector Vector], e include la bellissima barra di navigazione, in alto. Lo sviluppo del fork si trova sul nostro [https://git.golem.linux.it/golem/VectorGOLEM server git].&lt;br /&gt;
&lt;br /&gt;
== Note ==&lt;br /&gt;
Attenzione! Se si inseriscono note a pié di pagina è necessario inserire manualmente il titolo &amp;quot;Note&amp;quot; come ultima riga (prima della categoria).&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=File:Badwolf1.png&amp;diff=9995</id>
		<title>File:Badwolf1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=File:Badwolf1.png&amp;diff=9995"/>
		<updated>2026-06-09T20:07:10Z</updated>

		<summary type="html">&lt;p&gt;Malatext: Mostra alcuni pulsanti di Badwolf, come quelli per andare avanti e indietro nella storia delle pagine visitate, o quelli per abilitare/disabilitare javascript o il caricamento automatico delle immagini&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dettagli ==&lt;br /&gt;
Mostra alcuni pulsanti di Badwolf, come quelli per andare avanti e indietro nella storia delle pagine visitate, o quelli per abilitare/disabilitare javascript o il caricamento automatico delle immagini&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9994</id>
		<title>Badwolf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Badwolf&amp;diff=9994"/>
		<updated>2026-06-09T20:03:10Z</updated>

		<summary type="html">&lt;p&gt;Malatext: Creata pagina con &amp;quot;Badwolf è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, nien...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Badwolf è un browser minimalista basato su WebKitGTK+. Offre un buon compromesso tra un browser pesante come Firefox e un browser troppo minimalista come lynx (testuale, niente javascript e ovviamente niente CSS)&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9993</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9993"/>
		<updated>2026-06-09T19:59:33Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore.&lt;br /&gt;
Come potete notare i comandi di groff occupano una riga intera che inizia con il punto.&lt;br /&gt;
Il documento continua con sezioni, sottosezioni e paragrafi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il comando .NH (numbered heading) è un esempio di un comando che prende un argomento opzionale: gli argomenti vengon dopo il comando separati da spazio, come un comando nella shell. Analogamente ai comandi della shell, se il comando è una stringa con spazi, è opportuno racchiuderlo tra le virgolette (&amp;quot;).&lt;br /&gt;
Pef fare le liste si usa il comando .IP, tipicamente con un solo argomento: il marker. Per le liste non ordinate, il marker è il pallino, scritto \[bu], oppure può essere qualsiasi stringa (&amp;quot;a)&amp;quot;, &amp;quot;b)&amp;quot;, &amp;quot;c)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Liste&lt;br /&gt;
.PP&lt;br /&gt;
Lista di frutti:&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
mela&lt;br /&gt;
.IP \[bu]&lt;br /&gt;
pera&lt;br /&gt;
.LP&lt;br /&gt;
Lista di opzioni&lt;br /&gt;
.IP a)&lt;br /&gt;
opzione 1&lt;br /&gt;
.IP b)&lt;br /&gt;
opzione 2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9947</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9947"/>
		<updated>2026-04-14T23:06:05Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore. Il documento continua con sezioni, sottosezioni e paragrafi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:Howto]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9946</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9946"/>
		<updated>2026-04-14T22:28:09Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore. Il documento continua con sezioni, sottosezioni e paragrafi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Groff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9945</id>
		<title>Groff</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Groff&amp;diff=9945"/>
		<updated>2026-04-14T22:16:46Z</updated>

		<summary type="html">&lt;p&gt;Malatext: Creata pagina con &amp;quot;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli alt...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Groff o GNU troff è un sistema per creare documenti partendo da file di testo molto più leggero di LaTeX. Su questa pagina verrà usato il pacchetto di macro ''ms'', gli altri pacchetti sono ''man'', ''mdoc'', ''me'', ''mm'' e ''mom''. Le macro ''ms'' sono buone per scrivere reports, lettere, libri, ma anche papers. Il file su cui il documento verrà scritto ha tipicamente l'estensione ''.ms'' e inizia con la copertina:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Troff&amp;quot;&amp;gt;&lt;br /&gt;
.TL&lt;br /&gt;
Titolo&lt;br /&gt;
.AU&lt;br /&gt;
Autore&lt;br /&gt;
.AB&lt;br /&gt;
Abstract&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ci sono altre cose che possono essere messe nella copertina, ma potete limitarvi a titolo e autore. Il documento continua con sezioni, sottosezioni e paragrafi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Troff&amp;quot;&amp;gt;&lt;br /&gt;
.NH&lt;br /&gt;
Sezione&lt;br /&gt;
.NH 2&lt;br /&gt;
Sottosezione&lt;br /&gt;
.PP&lt;br /&gt;
paragrafo con prima riga indentata&lt;br /&gt;
.NH 2&lt;br /&gt;
Altra sottosezione&lt;br /&gt;
.LP&lt;br /&gt;
paragrafo senza indentazione&lt;br /&gt;
.NH&lt;br /&gt;
Sezione 2&lt;br /&gt;
.PP&lt;br /&gt;
fine&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9795</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9795"/>
		<updated>2026-03-14T16:09:10Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Note per l'amministratore */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Matrix in due parole ==&lt;br /&gt;
[[Image:Federazione.png|right|200px]]&lt;br /&gt;
&lt;br /&gt;
[https://matrix.org/ Matrix] è un sistema di messaggistica federato e decentralizzato.&lt;br /&gt;
&lt;br /&gt;
{{Note&lt;br /&gt;
|type=attention&lt;br /&gt;
|text=Matrix è in fase di sperimentazione al GOLEM: le informazioni che seguono, relative al nostro servizio, sono soggette a cambiamenti senza preavviso, e l'homeserver potrebbe divenire irraggiungibile in qualsiasi momento. Non si fornisce alcuna garanzia.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Per accedere alle stanze del GOLEM:&lt;br /&gt;
&lt;br /&gt;
# unirsi alla stanza pubblica &amp;lt;code&amp;gt;#presentazione:golem.linux.it&amp;lt;/code&amp;gt; e presentarsi&lt;br /&gt;
# una volta presentati, un amministratore vi inviterà nello spazio privato&lt;br /&gt;
&lt;br /&gt;
Se non si ha già Matrix:&lt;br /&gt;
# registrare un account su un server (su [https://matrix.org/try-matrix/ matrix.org] è gratuito)&lt;br /&gt;
# installare un client, per esempio [https://matrix.org/ecosystem/clients/element-x/ Element] o [https://matrix.org/ecosystem/clients/fluffychat/ FluffyChat]&lt;br /&gt;
# entrare nella stanza pubblica e presentarsi, come indicato sopra&lt;br /&gt;
&lt;br /&gt;
Nota: le stanze private del GOLEM non sono crittografate.&lt;br /&gt;
&lt;br /&gt;
== Maggiori informazioni ==&lt;br /&gt;
&lt;br /&gt;
* '''Federazione''': ogni utente può scegliere un ''homeserver'' su cui registrare il proprio account, allo stesso modo in cui può scegliere il provider per la propria posta elettronica. Da ogni homeserver è possibile raggiungere qualunque altro utente della rete Matrix, anche se si trova su un altro homeserver, allo stesso modo in cui funziona la posta elettronica.&lt;br /&gt;
** Se un homeserver diventa non raggiungibile (per questioni tecniche, legali o di censura), la rete continua a funzionare in modo indipendente.&lt;br /&gt;
** Gli utenti sono identificati col formato &amp;lt;code&amp;gt;@utente:homeserver.tld&amp;lt;/code&amp;gt;, in modo simile alle email.&lt;br /&gt;
** Il più grande homeserver è &amp;lt;code&amp;gt;matrix.org&amp;lt;/code&amp;gt;, fornito direttamente dalla Element Foundation. Al fine di favorire la decentralizzazione, è consigliabile scegliere un provider/una comunità affine, e registrare il proprio utente presso un altro homeserver.&lt;br /&gt;
&lt;br /&gt;
* '''Riservatezza''': Matrix include un sistema di crittografia a chiave pubblica end-to-end: le conversazioni possono essere lette solo tramite i dispositivi degli interlocutori. L'autenticità dell'interlocutore può essere verificata avviando una procedura da eseguirsi di persona col proprio interlocutore. I server e qualunque altra terza parte non può accedere ai messaggi. I metadati, tuttavia, sono in chiaro (i server possono sapere tra quali persone avvengono le conversazioni)&lt;br /&gt;
&lt;br /&gt;
== Note per l'amministratore ==&lt;br /&gt;
'''Creare nuovo utente'''&lt;br /&gt;
 docker exec -it chat-synapse-1 register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u &amp;lt;username&amp;gt; -p &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Configurare il bridge gruppo Telegram &amp;lt;-&amp;gt; stanza Matrix'''&lt;br /&gt;
&lt;br /&gt;
Il docker-compose.yaml attuale è un adattamento di https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram#docker-compose&lt;br /&gt;
&lt;br /&gt;
Una volta cambiata la configurazione del bridge in /var/chat/bridge/config.yml, è necessario fare&lt;br /&gt;
 docker compose restart mautrixbridge&lt;br /&gt;
non c'è bisogno di riavviare gli altri container.&lt;br /&gt;
[[Categoria:Sysop]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9794</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9794"/>
		<updated>2026-03-14T15:48:16Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Note per l'amministratore */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Matrix in due parole ==&lt;br /&gt;
[[Image:Federazione.png|right|200px]]&lt;br /&gt;
&lt;br /&gt;
[https://matrix.org/ Matrix] è un sistema di messaggistica federato e decentralizzato.&lt;br /&gt;
&lt;br /&gt;
{{Note&lt;br /&gt;
|type=attention&lt;br /&gt;
|text=Matrix è in fase di sperimentazione al GOLEM: le informazioni che seguono, relative al nostro servizio, sono soggette a cambiamenti senza preavviso, e l'homeserver potrebbe divenire irraggiungibile in qualsiasi momento. Non si fornisce alcuna garanzia.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Per accedere alle stanze del GOLEM:&lt;br /&gt;
&lt;br /&gt;
# unirsi alla stanza pubblica &amp;lt;code&amp;gt;#presentazione:golem.linux.it&amp;lt;/code&amp;gt; e presentarsi&lt;br /&gt;
# una volta presentati, un amministratore vi inviterà nello spazio privato&lt;br /&gt;
&lt;br /&gt;
Se non si ha già Matrix:&lt;br /&gt;
# registrare un account su un server (su [https://matrix.org/try-matrix/ matrix.org] è gratuito)&lt;br /&gt;
# installare un client, per esempio [https://matrix.org/ecosystem/clients/element-x/ Element] o [https://matrix.org/ecosystem/clients/fluffychat/ FluffyChat]&lt;br /&gt;
# entrare nella stanza pubblica e presentarsi, come indicato sopra&lt;br /&gt;
&lt;br /&gt;
Nota: le stanze private del GOLEM non sono crittografate.&lt;br /&gt;
&lt;br /&gt;
== Maggiori informazioni ==&lt;br /&gt;
&lt;br /&gt;
* '''Federazione''': ogni utente può scegliere un ''homeserver'' su cui registrare il proprio account, allo stesso modo in cui può scegliere il provider per la propria posta elettronica. Da ogni homeserver è possibile raggiungere qualunque altro utente della rete Matrix, anche se si trova su un altro homeserver, allo stesso modo in cui funziona la posta elettronica.&lt;br /&gt;
** Se un homeserver diventa non raggiungibile (per questioni tecniche, legali o di censura), la rete continua a funzionare in modo indipendente.&lt;br /&gt;
** Gli utenti sono identificati col formato &amp;lt;code&amp;gt;@utente:homeserver.tld&amp;lt;/code&amp;gt;, in modo simile alle email.&lt;br /&gt;
** Il più grande homeserver è &amp;lt;code&amp;gt;matrix.org&amp;lt;/code&amp;gt;, fornito direttamente dalla Element Foundation. Al fine di favorire la decentralizzazione, è consigliabile scegliere un provider/una comunità affine, e registrare il proprio utente presso un altro homeserver.&lt;br /&gt;
&lt;br /&gt;
* '''Riservatezza''': Matrix include un sistema di crittografia a chiave pubblica end-to-end: le conversazioni possono essere lette solo tramite i dispositivi degli interlocutori. L'autenticità dell'interlocutore può essere verificata avviando una procedura da eseguirsi di persona col proprio interlocutore. I server e qualunque altra terza parte non può accedere ai messaggi. I metadati, tuttavia, sono in chiaro (i server possono sapere tra quali persone avvengono le conversazioni)&lt;br /&gt;
&lt;br /&gt;
== Note per l'amministratore ==&lt;br /&gt;
'''Creare nuovo utente'''&lt;br /&gt;
 docker exec -it chat-synapse-1 register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u &amp;lt;username&amp;gt; -p &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Configurare il bridge gruppo Telegram &amp;lt;-&amp;gt; stanza Matrix'''&lt;br /&gt;
&lt;br /&gt;
La configurazione attuale è stata adattata a partire da https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram#docker-compose&lt;br /&gt;
&lt;br /&gt;
Una volta cambiata la configurazione del bridge in /var/chat/bridge/config.yml, è necessario fare&lt;br /&gt;
 docker compose restart mautrixbridge&lt;br /&gt;
non c'è bisogno di riavviare gli altri container.&lt;br /&gt;
[[Categoria:Sysop]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9793</id>
		<title>Matrix</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Matrix&amp;diff=9793"/>
		<updated>2026-03-14T15:46:35Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Note per l'amministratore */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Matrix in due parole ==&lt;br /&gt;
[[Image:Federazione.png|right|200px]]&lt;br /&gt;
&lt;br /&gt;
[https://matrix.org/ Matrix] è un sistema di messaggistica federato e decentralizzato.&lt;br /&gt;
&lt;br /&gt;
{{Note&lt;br /&gt;
|type=attention&lt;br /&gt;
|text=Matrix è in fase di sperimentazione al GOLEM: le informazioni che seguono, relative al nostro servizio, sono soggette a cambiamenti senza preavviso, e l'homeserver potrebbe divenire irraggiungibile in qualsiasi momento. Non si fornisce alcuna garanzia.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Per accedere alle stanze del GOLEM:&lt;br /&gt;
&lt;br /&gt;
# unirsi alla stanza pubblica &amp;lt;code&amp;gt;#presentazione:golem.linux.it&amp;lt;/code&amp;gt; e presentarsi&lt;br /&gt;
# una volta presentati, un amministratore vi inviterà nello spazio privato&lt;br /&gt;
&lt;br /&gt;
Se non si ha già Matrix:&lt;br /&gt;
# registrare un account su un server (su [https://matrix.org/try-matrix/ matrix.org] è gratuito)&lt;br /&gt;
# installare un client, per esempio [https://matrix.org/ecosystem/clients/element-x/ Element] o [https://matrix.org/ecosystem/clients/fluffychat/ FluffyChat]&lt;br /&gt;
# entrare nella stanza pubblica e presentarsi, come indicato sopra&lt;br /&gt;
&lt;br /&gt;
Nota: le stanze private del GOLEM non sono crittografate.&lt;br /&gt;
&lt;br /&gt;
== Maggiori informazioni ==&lt;br /&gt;
&lt;br /&gt;
* '''Federazione''': ogni utente può scegliere un ''homeserver'' su cui registrare il proprio account, allo stesso modo in cui può scegliere il provider per la propria posta elettronica. Da ogni homeserver è possibile raggiungere qualunque altro utente della rete Matrix, anche se si trova su un altro homeserver, allo stesso modo in cui funziona la posta elettronica.&lt;br /&gt;
** Se un homeserver diventa non raggiungibile (per questioni tecniche, legali o di censura), la rete continua a funzionare in modo indipendente.&lt;br /&gt;
** Gli utenti sono identificati col formato &amp;lt;code&amp;gt;@utente:homeserver.tld&amp;lt;/code&amp;gt;, in modo simile alle email.&lt;br /&gt;
** Il più grande homeserver è &amp;lt;code&amp;gt;matrix.org&amp;lt;/code&amp;gt;, fornito direttamente dalla Element Foundation. Al fine di favorire la decentralizzazione, è consigliabile scegliere un provider/una comunità affine, e registrare il proprio utente presso un altro homeserver.&lt;br /&gt;
&lt;br /&gt;
* '''Riservatezza''': Matrix include un sistema di crittografia a chiave pubblica end-to-end: le conversazioni possono essere lette solo tramite i dispositivi degli interlocutori. L'autenticità dell'interlocutore può essere verificata avviando una procedura da eseguirsi di persona col proprio interlocutore. I server e qualunque altra terza parte non può accedere ai messaggi. I metadati, tuttavia, sono in chiaro (i server possono sapere tra quali persone avvengono le conversazioni)&lt;br /&gt;
&lt;br /&gt;
== Note per l'amministratore ==&lt;br /&gt;
'''Creare nuovo utente'''&lt;br /&gt;
 docker exec -it chat-synapse-1 register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u &amp;lt;username&amp;gt; -p &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Configurare il bridge gruppo Telegram &amp;lt;-&amp;gt; stanza Matrix'''&lt;br /&gt;
La configurazione attuale è stata adattata a partire da `https://docs.mau.fi/bridges/general/docker-setup.html?bridge=telegram#docker-compose`.&lt;br /&gt;
Una volta cambiata la configurazione del bridge in /var/chat/bridge/config.yml, è necessario fare docker compose restart mautrixbridge, non c'è bisogno di riavviare gli altri container.&lt;br /&gt;
[[Categoria:Sysop]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=File:Python_lez6.pdf&amp;diff=9730</id>
		<title>File:Python lez6.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=File:Python_lez6.pdf&amp;diff=9730"/>
		<updated>2025-07-01T04:50:39Z</updated>

		<summary type="html">&lt;p&gt;Malatext: Malatext ha caricato una nuova versione di File:Python lez6.pdf.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9729</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9729"/>
		<updated>2025-06-30T21:32:37Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Demo Matplotlib &amp;quot;migliorata&amp;quot; con Pandas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 6 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' [https://wiki.golem.linux.it/images/0/06/Python_lez6.pdf slides] - ''Lunedì 30 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return np.arange(m)[A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib &amp;quot;migliorata&amp;quot; con Pandas =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return pd.read_csv('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                       names=['score', 'race', 'back'])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(len(im.index))&lt;br /&gt;
    im = im.T.reset_index(drop=True)&lt;br /&gt;
    x = im.idxmin()&lt;br /&gt;
    c = im.min()&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    return data.pivot_table(columns='race', index='back', values='score', aggfunc='min')&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    return data[['race', 'back']].pivot_table(columns='race', index='back', aggfunc=len, fill_value=0)&lt;br /&gt;
&lt;br /&gt;
def plotusage(table):&lt;br /&gt;
    plt.xticks(np.arange(len(table.columns)), table.columns, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(table.index)), table.index)&lt;br /&gt;
    plt.imshow(table)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=backgrounds.where(race &amp;gt; 0, ''))&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[~cond]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(table, ax):&lt;br /&gt;
    races = ['Minotaur', 'Spriggan', 'Mountain Dwarf']&lt;br /&gt;
    backgrounds = ['Berserker', 'Fighter', 'Enchanter', 'Hexslinger']&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(races)), np.arange(len(backgrounds)))&lt;br /&gt;
    xyh = pd.DataFrame({'pos_x':xpos.ravel(), 'pos_y':ypos.ravel(),&lt;br /&gt;
                        'best_score':table.loc[backgrounds, races].to_numpy().ravel()})&lt;br /&gt;
    xyh = xyh[xyh['best_score'].notna()]&lt;br /&gt;
    plt.yticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.xticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh['pos_x']-0.25, xyh['pos_y']-0.25, 0, 0.5, 0.5, xyh['best_score'])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    im1, im2 = tocount(data), tobest(data)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1['Minotaur'], im1.index, 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9728</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9728"/>
		<updated>2025-06-30T18:36:01Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 6 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' [https://wiki.golem.linux.it/images/0/06/Python_lez6.pdf slides] - ''Lunedì 30 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return np.arange(m)[A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib &amp;quot;migliorata&amp;quot; con Pandas =&lt;br /&gt;
import pandas as pd&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
import numpy as np&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return pd.read_csv('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                       names=['score', 'race', 'back'])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(len(im.index))&lt;br /&gt;
    im = im.T.reset_index(drop=True)&lt;br /&gt;
    x = im.idxmin()&lt;br /&gt;
    c = im.min()&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    return data.pivot_table(columns='race', index='back', values='score', aggfunc='min')&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    return data[['race', 'back']].pivot_table(columns='race', index='back', aggfunc=len, fill_value=0)&lt;br /&gt;
&lt;br /&gt;
def plotusage(table):&lt;br /&gt;
    plt.xticks(np.arange(len(table.columns)), table.columns, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(table.index)), table.index)&lt;br /&gt;
    plt.imshow(table)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=backgrounds.where(race &amp;gt; 0, ''))&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[~cond]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(table, ax):&lt;br /&gt;
    races = ['Minotaur', 'Spriggan', 'Mountain Dwarf']&lt;br /&gt;
    backgrounds = ['Berserker', 'Fighter', 'Enchanter', 'Hexslinger']&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(races)), np.arange(len(backgrounds)))&lt;br /&gt;
    xyh = pd.DataFrame({'pos_x':xpos.ravel(), 'pos_y':ypos.ravel(),&lt;br /&gt;
                        'best_score':table.loc[backgrounds, races].to_numpy().ravel()})&lt;br /&gt;
    xyh = xyh[xyh['best_score'].notna()]&lt;br /&gt;
    plt.yticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.xticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh['pos_x']-0.25, xyh['pos_y']-0.25, 0, 0.5, 0.5, xyh['best_score'])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    im1, im2 = tocount(data), tobest(data)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1['Minotaur'], im1.index, 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=File:Python_lez6.pdf&amp;diff=9727</id>
		<title>File:Python lez6.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=File:Python_lez6.pdf&amp;diff=9727"/>
		<updated>2025-06-30T18:34:19Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9726</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9726"/>
		<updated>2025-06-26T10:23:55Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* same_pv */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 30 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return np.arange(m)[A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9723</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9723"/>
		<updated>2025-06-17T22:43:24Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 30 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return A[:m][A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9722</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9722"/>
		<updated>2025-06-17T13:29:13Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 23 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5, facendo scalare la libreria Pandas alla lezione 6&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return A[:m][A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9721</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9721"/>
		<updated>2025-06-17T13:21:25Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* raggruppa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 23 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==same_pv==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return A[:m][A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9720</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9720"/>
		<updated>2025-06-17T13:21:08Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Esercizi Corretti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 23 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
def same_pv(A, B):&lt;br /&gt;
    m = min(len(A), len(B))&lt;br /&gt;
    return A[:m][A[:m] == B[:m]]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9719</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9719"/>
		<updated>2025-06-17T13:12:57Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides] - ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
*'''Lezione 6''' - ''Lunedì 23 Giugno'': utilizzo della libreria Pandas (https://pandas.pydata.org/)&lt;br /&gt;
&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9718</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9718"/>
		<updated>2025-06-16T18:51:31Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides]- ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Demo Matplotlib =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import matplotlib.pyplot as plt&lt;br /&gt;
&lt;br /&gt;
def loadpacif():&lt;br /&gt;
    return np.loadtxt('https://wiki.golem.linux.it/images/a/af/Pacif.txt',&lt;br /&gt;
                      delimiter=',',&lt;br /&gt;
                      dtype=[('score', 'i4'),&lt;br /&gt;
                             ('race','U20'),&lt;br /&gt;
                             ('back', 'U20')])&lt;br /&gt;
&lt;br /&gt;
def plotstars(im):&lt;br /&gt;
    y = np.arange(im.shape[0])&lt;br /&gt;
    x = im.argmin(axis = 1)&lt;br /&gt;
    c = im.min(axis = 1)&lt;br /&gt;
    c = c.max() - c&lt;br /&gt;
    plt.scatter(x, y, c=c, cmap='inferno', marker = '*', label = 'punteggi migliori')&lt;br /&gt;
    plt.legend(loc = 'upper left')&lt;br /&gt;
&lt;br /&gt;
def loadattrs():&lt;br /&gt;
    # gli attributi devono essere in ordine!&lt;br /&gt;
    attributes = ('xl', 'str', 'int', 'dex', 'ac', 'ev', 'sh')&lt;br /&gt;
    anything = '.*'&lt;br /&gt;
    return np.fromregex('https://crawl.xtahua.com/crawl/meta/0.33/logfile',&lt;br /&gt;
                        anything + anything.join(':' + s + '=([0-9]+)' for s in attributes) + anything,&lt;br /&gt;
                        dtype=[(s,'i4') for s in attributes])&lt;br /&gt;
&lt;br /&gt;
def plotscatter(d, x, y, minxl = None):&lt;br /&gt;
    if minxl is not None:&lt;br /&gt;
        d = d[d['xl'] &amp;gt;= minxl]&lt;br /&gt;
    plt.scatter(d[x], d[y], c = d['xl'], alpha=0.1)&lt;br /&gt;
&lt;br /&gt;
def strtoidx(strings):&lt;br /&gt;
    d = {n:i for i,n in enumerate(set(strings))}&lt;br /&gt;
    return d, np.array([d[s] for s in strings])&lt;br /&gt;
&lt;br /&gt;
def tobest(data):&lt;br /&gt;
    img = np.full((data['race'].max()+1, data['back'].max()+1), -1).astype('u4')&lt;br /&gt;
    for score, race, back in data:&lt;br /&gt;
        img[race,back] = min(img[race, back], score)&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def tocount(data):&lt;br /&gt;
    img = np.zeros((data['race'].max()+1, data['back'].max()+1),dtype = 'u4')&lt;br /&gt;
    for _, race, back in data:&lt;br /&gt;
        img[race,back] += 1&lt;br /&gt;
    return img&lt;br /&gt;
&lt;br /&gt;
def translate(data):&lt;br /&gt;
    rd, r = strtoidx(data['race'])&lt;br /&gt;
    bd, b = strtoidx(data['back'])&lt;br /&gt;
    arr = np.array(list(zip(data['score'], r, b)),&lt;br /&gt;
                   dtype=[('score','u4'),('race','u4'),('back','u4')])&lt;br /&gt;
    return rd,bd,arr&lt;br /&gt;
&lt;br /&gt;
def plotusage(backgrounds, races, matrix):&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds, rotation=45, ha='right')&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    plt.imshow(matrix)&lt;br /&gt;
    plt.colorbar()&lt;br /&gt;
    plt.title('utilizzi per (razza,background)')&lt;br /&gt;
&lt;br /&gt;
def plotbackgrounds(race, backgrounds, razza):&lt;br /&gt;
    plt.pie(race, labels=[(b if r &amp;gt; 0 else '') for r,b in zip(race, backgrounds)])&lt;br /&gt;
    plt.title(&amp;quot;background usati per &amp;quot; + razza)&lt;br /&gt;
&lt;br /&gt;
def plothist(score, cond, labels):&lt;br /&gt;
    plt.hist([score[cond], score[np.logical_not(cond)]], 30, histtype = 'barstacked', label=labels)&lt;br /&gt;
    plt.xlabel('punti (meno sono meglio è)')&lt;br /&gt;
    plt.legend()&lt;br /&gt;
&lt;br /&gt;
def plth3d(rd, bd, matrix, ax):&lt;br /&gt;
    races = ('Minotaur', 'Spriggan', 'Mountain Dwarf')&lt;br /&gt;
    backgrounds = ('Berserker', 'Fighter', 'Enchanter', 'Hexslinger')&lt;br /&gt;
    xpos, ypos = np.meshgrid(np.arange(len(backgrounds)), np.arange(len(races)))&lt;br /&gt;
    xyh = np.stack((xpos.ravel(), ypos.ravel(),&lt;br /&gt;
                    matrix[np.ix_([rd[r] for r in races],&lt;br /&gt;
                               [bd[b] for b in backgrounds])].ravel()))&lt;br /&gt;
    xyh = xyh[:, xyh[2]&amp;lt;np.array(-1).astype(matrix.dtype)]&lt;br /&gt;
    plt.xticks(np.arange(len(backgrounds)), backgrounds)&lt;br /&gt;
    plt.yticks(np.arange(len(races)), races)&lt;br /&gt;
    ax.bar3d(xyh[0]-0.25, xyh[1]-0.25, 0, 0.5, 0.5, xyh[2])&lt;br /&gt;
    &lt;br /&gt;
def showall(data):&lt;br /&gt;
    rd,bd,arr = translate(data)&lt;br /&gt;
    im1, im2 = tocount(arr), tobest(arr)&lt;br /&gt;
    plt.style.use('dark_background')&lt;br /&gt;
    plt.subplot(1,2,1)&lt;br /&gt;
    plotusage(bd.keys(), rd.keys(), im1)&lt;br /&gt;
    plotstars(im2)&lt;br /&gt;
    plt.subplot(222)&lt;br /&gt;
    plotbackgrounds(im1[rd['Minotaur']], bd.keys(), 'minotauro')&lt;br /&gt;
    plt.subplot(224)&lt;br /&gt;
    plothist(data['score'], data['race'] == 'Minotaur', ('minotauro','altre razze'))&lt;br /&gt;
    plt.legend()&lt;br /&gt;
    plt.show()&lt;br /&gt;
    plth3d(rd, bd, im2, plt.subplot(projection = '3d'))&lt;br /&gt;
    plt.show()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9717</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9717"/>
		<updated>2025-06-16T18:50:16Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides]- ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/5/57/Python_lez5.pdf slides] [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria matplotlib (https://matplotlib.org/)&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=File:Python_lez5.pdf&amp;diff=9716</id>
		<title>File:Python lez5.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=File:Python_lez5.pdf&amp;diff=9716"/>
		<updated>2025-06-16T18:49:28Z</updated>

		<summary type="html">&lt;p&gt;Malatext: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=File:Python_lez4.pdf&amp;diff=9710</id>
		<title>File:Python lez4.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=File:Python_lez4.pdf&amp;diff=9710"/>
		<updated>2025-06-09T22:22:25Z</updated>

		<summary type="html">&lt;p&gt;Malatext: Malatext ha caricato una nuova versione di File:Python lez4.pdf.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9709</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9709"/>
		<updated>2025-06-09T18:14:51Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Esercizi Corretti */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides]- ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria pandas (https://pandas.pydata.org) e matplotlib (https://matplotlib.org/)&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==raggruppa==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
''' 2 liste:&lt;br /&gt;
lista di espressioni regolari regs&lt;br /&gt;
lista di directory dirs&lt;br /&gt;
per ogni i, i file con un nome che fa match con regs[i] devono essere spostati in dirs[i], &lt;br /&gt;
'''&lt;br /&gt;
def raggruppa(regs, dirs):&lt;br /&gt;
    from os import listdir, renames&lt;br /&gt;
    from re import match&lt;br /&gt;
    for r,d in zip(regs, dirs):&lt;br /&gt;
            matches = [match(r,f) for f in listdir()]&lt;br /&gt;
            matches = [m for m in matches if m is not None]&lt;br /&gt;
            for m in matches:&lt;br /&gt;
                    renames(m.string,&lt;br /&gt;
                            d + &amp;quot;/&amp;quot; + &amp;quot;/&amp;quot;.join(m.groups()) + &amp;quot;/&amp;quot; + m.string)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9708</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9708"/>
		<updated>2025-06-09T18:11:17Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides]- ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Lunedì 16 Giugno'': utilizzo della libreria pandas (https://pandas.pydata.org) e matplotlib (https://matplotlib.org/)&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
	<entry>
		<id>https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9707</id>
		<title>Corso Python 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.golem.linux.it/index.php?title=Corso_Python_2025&amp;diff=9707"/>
		<updated>2025-06-09T18:10:19Z</updated>

		<summary type="html">&lt;p&gt;Malatext: /* Programma */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Python-logo.png|right|80px]]&lt;br /&gt;
Corso di programmazione in Python3 di 5 lezioni: dai concetti introduttivi del linguaggio fino ad applicazioni di utilizzo pratico.&lt;br /&gt;
&lt;br /&gt;
=Programma=&lt;br /&gt;
&lt;br /&gt;
Il corso si terrà il Lunedì, dalle 21 alle 23:30.&lt;br /&gt;
*'''Introduzione''' [https://wiki.golem.linux.it/images/4/4b/Intro.pdf slides] - ''Martedì 6 Maggio'': Serata di preparazione per presentare il corso&lt;br /&gt;
*'''Lezione 1''' [https://wiki.golem.linux.it/images/2/27/Python_lez1.pdf slides] - ''Lunedì 12 Maggio'': introduzione alla sintassi del linguaggio, variabili, operatori sui tipi primitivi, costrutto &amp;lt;code&amp;gt;if..else&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;, funzioni&lt;br /&gt;
*'''Lezione 2''' [https://wiki.golem.linux.it/images/5/5a/Python_lez2.pdf slides] - ''Lunedì 19 Maggio'': liste, dizionari, iteratori e insiemi&lt;br /&gt;
*'''Lezione 3''' [https://wiki.golem.linux.it/images/4/42/Python_lez3.pdf slides]- ''Lunedì 26 Maggio'': tuple, stringhe, files, modulo os&lt;br /&gt;
*'''Lezione 4''' [https://wiki.golem.linux.it/images/d/de/Python_lez4.pdf slides] - ''Lunedì 9 Giugno'': funzionamento e utilizzo della libreria numpy (https://numpy.org/)&lt;br /&gt;
*'''Lezione 5''' [https://wiki.golem.linux.it/images/a/af/Pacif.txt dataset da utilizzare] - ''Luendì 16 Giugno'': utilizzo della libreria pandas (https://pandas.pydata.org) e matplotlib (https://matplotlib.org/)&lt;br /&gt;
Nota: la libreria Matplotlib è stata spostata alla lezione 5&lt;br /&gt;
&lt;br /&gt;
= Esercizi Corretti =&lt;br /&gt;
==fattorizza==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def fattorizza(N):&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    if N &amp;lt;= 1:&lt;br /&gt;
        s = str(N)&lt;br /&gt;
    for i in range(2, N+1):&lt;br /&gt;
        while N % i == 0:&lt;br /&gt;
            s += str(i) + (&amp;quot; * &amp;quot; if N &amp;gt; i else &amp;quot;&amp;quot;)&lt;br /&gt;
            N //= i&lt;br /&gt;
    return s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==distributore==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
def distributore(rifornimento):&lt;br /&gt;
    cents = yield rifornimento.keys()&lt;br /&gt;
    while True:&lt;br /&gt;
        while cents &amp;lt; 50:&lt;br /&gt;
            cents = cents + (yield)&lt;br /&gt;
        selezionato = yield &amp;quot;seleziona bibita&amp;quot;&lt;br /&gt;
        rifornimento[selezionato] -= 1&lt;br /&gt;
        if rifornimento[selezionato] == 0:&lt;br /&gt;
            del rifornimento[selezionato]&lt;br /&gt;
        cents = yield [selezionato, cents - 50]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Materiale didattico =&lt;br /&gt;
''Materiale su Python''&lt;br /&gt;
&lt;br /&gt;
* [[Pillole_Python | Python3 in pillole]]&lt;br /&gt;
&lt;br /&gt;
=Iscrizione=&lt;br /&gt;
*È '''necessario''' pre-iscriversi compilando questo form: https://servizi.linux.it/shared/a2lStMGtu24qv5Z2DbwR57odp3rwA1hLBI7owZo236U. Il corso sarà attivato con un minimo di 5 partecipanti fino ad esaurimento della capienza dell'Officina. In caso di sovrannumero farà fede la data d'iscrizione tramite il modulo. Sarà inviata una comunicazione tramite email entro Martedì 6 maggio per la conferma definitiva.&lt;br /&gt;
&lt;br /&gt;
*È necessario un '''proprio PC'''. In caso di mancanza è possibile richiedere una postazione in fase di registrazione.&lt;br /&gt;
&lt;br /&gt;
*Il corso si terrà presso l'[[Officina Informatica | Officina Informatica]]. &lt;br /&gt;
&lt;br /&gt;
*Il '''costo di iscrizione''' è di €35, comprensivo della tessera associativa (€20). Per gli studenti (Under19) il costo è di €20, comprensivo di tessera associativa junior (€10).&lt;br /&gt;
&lt;br /&gt;
Per qualsiasi domanda è possibile scrivere una mail alla [mailto:golem@lists.linux.it lista], inserendo come Oggetto &amp;quot;Corso Python 2025&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Corsi]]&lt;/div&gt;</summary>
		<author><name>Malatext</name></author>
	</entry>
</feed>