Penaz's Areahttps://penazarea.altervista.org/2023-04-09T00:00:00+02:00cat /dev/random > penazPipewire, scricchiolii, e le conseguenze impreviste di decisioni frettolose2023-04-09T00:00:00+02:002023-04-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2023-04-09:/misc/Pipewire_crackling.html<p>Vediamo come qualcosa di apparentemente completamente separato dall'audio può influenzare la nostra esperienza d'ascolto.</p><h2>Vediamo come qualcosa di apparentemente completamente separato dall'audio può influenzare la nostra esperienza d'ascolto.</h2>
<p>Salve a tutti. È passato un po' di tempo, eh?</p>
<p>Volevo scrivere questo post un paio di settimane fa, ma non ho mai trovato l'energia per farlo (viva il lavorare fino allo sfinimento!).</p>
<p>Oggi daremo un'occhiata a come sono riuscito a trovare la fonte di un problema estremamente annoso con l'audio del mio portatile, il processo di ricerca e debug e la mia estrema sorpresa nel vedere il risultato.</p>
<h3>Il problema</h3>
<p>Da quando sono passato a Pipewire 0.3.x sono stato vittima di un problema estremamente fastidioso: ogni volta che usavo qualsiasi cosa basata sulla tecnologia WebRTC (quindi Jitsi, Google Meet, Discord, Telegram...) il mio audio iniziava a dar problemi. Finivo per avere l'ultima lettera di una frase precedente che veniva ripetuta, scricchiolii, pop, salti: l'intero pacchetto.</p>
<p>Mi faceva <strong>infuriare</strong>:</p>
<h3>La non-soluzione</h3>
<p>Ho contattato la gente di Freedesktop tramite il logo GitLab per vedere cosa si potesse fare, perchè non avevo notato alcun problema del genere nel ramo 0.2.x di Pipewire e nemmeno in Pulseaudio.</p>
<p>Ho provato a seguire tutte le soluzioni standard: cancellare qualunque configurazione non predefinita, installare rtkit ed attivare i privilegi realtime, nulla.</p>
<p>Il team di Pipewire mi ha suggerito di aumentare il quantum minimo consentito, il che ha fortemente migliorato la situazione a prima vista, ma in realtà ha portato ad un sacco di altri problemi.</p>
<p>Aumentare il quantum minimo vuol dire che i programmi avevano più latenza, portando i programmi WebRTC a rompersi completamente dopo una decina di minuti di chiamata: dopo un po' non sentivo più nessuno parlare.</p>
<h3>Il debug</h3>
<p>Ho litigato con questo problema per quasi un anno, a salti, con un periodo nel mezzo (di circa 4 mesi) dove mi sono arreso al mio futuro scricchioloso.</p>
<p>Questo fino a circa 3 settimane fa, quando sono diventato "estremamente sovra-infastidito" dal problema ed ho deciso di ricontattare il team di Pipewire: mi è stato suggerito di provare dell'hardware diverso e/o una distro differente. C'erano solo due possibilità: il mio portatile o il mio sistema operativo.</p>
<p>Ho tentato di creare un caso di test quanto più facilmente riproducibile possibile, che è risultato essenzialmente nel riprodurre una certa canzone tramite MPV mentre <code>pavucontrol</code> era aperto. Questo veniva mostrato dal numero nella colonna "ERR" in <code>pw-top</code> che aumentava spesso, così come dagli scricchiolii.</p>
<p>Ho provato ad usare hardware differente (con un piccolo mixer usato come scheda audio esterna) senza risultato, poi ho provato ad usare una Live di Ubuntu da chiavetta USB e mi sono reso conto che in questo caso non c'erano scricchiolii.</p>
<p>Il mio portatile era a posto, il che vuol dire che il problema è la mia distro a la mia configurazione.</p>
<p>A quel punto il mio collega di lavoro lancia un'idea: chiudi tutto quello che non è utile per l'audio e per la "sopravvivenza" del sistema, e vedi cosa accade.</p>
<p>Ho chiuso <strong>tutto</strong>: servizi, demoni, la barra degli strumenti... Eravamo rimasti solo io, Pipewire ed il mio manager di finestre (openbox). Nessun scricchiolio.</p>
<p>Ecco la mia pista.</p>
<h3>La causa</h3>
<p>Mentre ero in chiamata col mio collega (tramite cellulare), lui si è lamentato che il suo Conky stava avendo dei problemi. Questo mi ha ricordato che fra le tante cose da riaprire (per i miei test) c'era Conky ed all'improvviso... gli scricchiolii sono tornati.</p>
<p>Chiudo Conky, gli scricchiolii spariscono, lo riavvio e ritornano.</p>
<p>Abbiamo trovato la causa degli scricchiolii, ma perchè? Perchè un monitor di sistema dovrebbe influenzare così tanto l'audio?</p>
<h3>Andando più a fondo</h3>
<p>Ho deciso di riavviare il mio portatile per avere una situazione più usabile, chiudendo Conky ed assicurandomi che l'audio stesse funzionando come dovuto.</p>
<p>Era ora di capire cosa stava succedendo.</p>
<p>Ho provato a cambiare alcune impostazioni base che potrebbero aver messo in difficoltà il mio laptop, come trasparenza e double-buffering, senza alcun risultato. Ho cambiato l'intervallo usato da Conky per aggiornarsi, da 2 secondi ad 1 secondo. Gli scricchiolii sono <strong>peggiorati un sacco</strong>.</p>
<p>Conky stava eseguendo un comando che causava il problema audio. Era ora di una buona "ricerca binaria": ho commentato metà della mia configurazione Conky e riprovato.</p>
<p>Purtroppo commentare la prima metà della configurazione non è bastato per far sparire il problema, quindi l'ho ripristinata ed ho commentato la seconda metà. Gli scricchiolii sono spariti.</p>
<p>La mia configurazione di Conky è abbastanza corta che da lì in poi ho semplicemente potuto commentare i comandi uno ad uno. Fino a quando non sono arrivato a <code>${i8k_cpu_temp}</code>. Il fatto che Conky stesse rilevando la temperatura del mio processore stava causando problemi all'audio.</p>
<p>Per esserne sicuro, ho chiuso Conky e verificato il manuale, dove dice che il comando <code>${i8k_cpu_temp}</code> legge la temperatura da <code>/proc/i8k</code>. Ho deciso di provare ad usare <code>cat /proc/i8k</code> mentre ascoltavo musica: l'audio distorceva ogni volta che eseguivo quel comando.</p>
<p>Ho trovato il colpevole.</p>
<h3>La motivazione</h3>
<p>Perchè verificare la temperatura del processore dovrebbe distorcere l'audio? La risposta è stata ipotizzata dal team di Pipewire quando ho riportato i risultati delle mie analisi, e poi confermato da me dopo aver letto cos'è i8k (descrizione dalla pagina <a href="https://github.com/lochotzke/i8k">https://github.com/lochotzke/i8k</a>):</p>
<blockquote>
<p>Linux driver for accessing the SMM BIOS on Dell Laptops</p>
</blockquote>
<p>SMM significa "System Management Mode" (A volte conosciuto come "Ring -2"), una modalità dove la normale esecuzione dei programmi <strong>incluso il sistema operativo</strong> è sospesa mentre un programma nel firmware del computer viene eseguito.</p>
<p>Questo vuol dire che ogni volta che il mio Conky controllava la temperatura del processore (ogni due secondi), stavo in realtà <strong>bloccando l'intero sistema operativo</strong> per quel (poco) tempo necessario per acquisire la temperatura.</p>
<p>Sono rimasto allibito.</p>
<p>Ecco cosa succede quando vado ad usare un comando per controllare la temperatura del processore senza verificarne gli effetti collaterali.</p>
<p>E dopo tutto questo casino mi rendo pure conto che <strong>la temperatura era pure sbagliata!</strong></p>
<h3>Il "dopo"</h3>
<p>Ho inviato la mia soluzione al GitLab di Pipewire, oltre che nel forum della mia distro Linux (dove sembra che abbia risolto i problemi audio di un'altra persona!), ringraziando tutti per la loro pazienza ed aiuto.</p>
<p>Ora il mio audio funziona alla grande e posso godermi la musica senza problemi, anche con una chiamata WebRTC aperta, mentre aspetto che altre persone si uniscano.</p>
<p>Spero questo possa aiutare altra gente nel caso si ritrovino in una situazione simile.</p>
<p>Grazie a tutti per aver letto questo post.</p>
<p>Penaz.</p>Pipewire, Crackling, and the unforeseen consequences of rushed decisions2023-04-09T00:00:00+02:002023-04-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2023-04-09:/en/misc/Pipewire_crackling.html<p>Let's see how something seemingly completely unrelated to audio can affect someone's listening experience.</p><h2>Let's see how something seemingly completely unrelated to audio can affect someone's listening experience.</h2>
<p>Greetings, everyone. It has been a while, huh?</p>
<p>I have been meaning to write this post a couple weeks ago, but I never found the energy to do so (yay for working myself to the bone!).</p>
<p>Today we'll see how I managed to find the source of a very annoying issue with my laptop's audio, the debug process and my extreme surprise at the result.</p>
<h3>The problem</h3>
<p>Since switching to Pipewire 0.3.x I have been having an extremely annoying issue: every time I was using anything that was based on the WebRTC technology (that includes Jitsi, Google Meet, Discord, Telegram...) my audio would start breaking. That means that I would end up with the last letter of an earlier phrase being repeated, popping, crackling, skipping: the whole circus.</p>
<p>It. was. <strong>vexing</strong>.</p>
<h3>The non-solution</h3>
<p>I contacted the people at Freedesktop via their GitLab to see what could be done, because I didn't notice anything like this on the 0.2.x branch of Pipewire, nor on Pulseaudio.</p>
<p>I tried following all the standard troubleshooting steps: deleting any custom configuration, installing rtkit and enabling realtime privileges, nothing worked.</p>
<p>The Pipewire team suggested I increase the minimum allowed quantum, which improved the situation a lot at first, but ended up being host of a whole other set of issues.</p>
<p>Increasing the minimum quantum meant that the programs had more latency, which brought WebRTC programs to break down after 10 or so minutes of call: I couldn't hear anyone after a while.</p>
<h3>The debugging</h3>
<p>I have been fighting with this issue for almost a year, on and off, with a period in between (lasting about 4 months) where I just gave up and surrender to my crackly future.</p>
<p>Until about 3 weeks ago, when I became "maximum over-annoyed" at this issue and decided to contact the Pipewire team again: I got suggested to try different hardware and/or a different distro. It was going to be either my system, or my laptop's hardware.</p>
<p>I tried to come up with the most easily reproducible test I could, which was essentially playing a song via MPV while keeping <code>pavucontrol</code> opened. That showed the "ERR" column in <code>pw-top</code> rising quite often along with the crackling.</p>
<p>I tried using different hardware (with a small mixer used as external soundcard) to no avail, then I tried using Ubuntu Live from a USB stick and realized there was no crackling.</p>
<p>My hardware was ok, that left my distro, or my configuration.</p>
<p>At that point my work colleague throws an idea on the field: close everything that is not useful for audio and the system to "survive" and see what happens.</p>
<p>I turned off <strong>everything</strong>: services, daemons, panels... I was left with only me, Pipewire and my window manager (openbox). No crackling.</p>
<p>That was my lead.</p>
<h3>The cause</h3>
<p>While still in a call with my colleague (using my mobile phone), he complained about his Conky misbehaving. That reminded me to turn Conky back on (among other things, for testing) and suddenly... the crackling is back.</p>
<p>I kill Conky, the crackling goes away, I restart it and the crackling comes back.</p>
<p>We have found the cause of the crackling, but why though? Why would a system monitor affect the audio so much?</p>
<h3>Diving deeper</h3>
<p>I decided to restart my laptop to go back to a more usable machine, killed Conky and made sure that the audio was indeed working as it should.</p>
<p>It was time to understand what was going on.</p>
<p>I tried changing some basic settings that could have put my laptop in a bit of a bind, like transparency or double-buffering, without result. I changed the interval used by Conky to update itself from every 2 seconds to every second. The crackling got <strong>a lot worse</strong>.</p>
<p>Conky was executing a command that was causing the audio issue. It was time for a good old "binary search": I commented half of my Conky configuration and checked.</p>
<p>Commenting the first half was not enough for the problem to disappear, so I restored it and commented the second half. The crackling problem went away.</p>
<p>My Conky config was small enough that from there on, I could just comment each command separately. Until I got to <code>${i8k_cpu_temp}</code>. My Conky configuration checking the CPU temperature was causing the audio to break.</p>
<p>To make sure of it, I closed Conky and checked its manual, where it says that the <code>${i8k_cpu_temp}</code> command reads the temperature from <code>/proc/i8k</code>. I decided to try it myself using <code>cat /proc/i8k</code> while playing music: the audio was breaking every time I triggered that command.</p>
<p>I found the culprit.</p>
<h3>The reason</h3>
<p>But why checking the CPU temperature would break my audio? The answer was hypothesized by the Pipewire team when I brought them my findings and subsequently confirmed by myself when I read what i8k is (from <a href="https://github.com/lochotzke/i8k">https://github.com/lochotzke/i8k</a>):</p>
<blockquote>
<p>Linux driver for accessing the SMM BIOS on Dell Laptops</p>
</blockquote>
<p>SMM stands for "System Management Mode" (sometimes known as "Ring -2"), which is a mode where all normal execution <strong>including the OS</strong> is suspended while a software in the computer's firmware is executed.</p>
<p>That means that every time my Conky checked for the CPU temperature (every 2 seconds), I was <strong>freezing my entire OS</strong> for just the time needed to get the temperature.</p>
<p>I was floored.</p>
<p>That is what I get for using a command that was supposed to get my CPU temperature without checking for any side effects, back when I changed my laptop.</p>
<p>After all of this kerfuffle I even realized <strong>the temperature reported was wrong anyway!</strong></p>
<h3>The aftermath</h3>
<p>I posted my solution on the Pipewire GitLab, as well as my Linux distro's forums (where it seems to have solved someone else's audio issues too!), thanking everyone for their patience and helpful input.</p>
<p>Now my audio is working great and I can enjoy music without issues, even when I have a WebRTC call open waiting for people to join.</p>
<p>Hopefully this can be helpful to some other people who ran into a similar issue.</p>
<p>Thank you everyone for reading.</p>
<p>Penaz.</p>È il 3o compleanno di "2D Game Development: From Zero to Hero"!2022-05-20T00:00:00+02:002022-05-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2022-05-20:/misc/2DGD_F0TH_6.html<p>È passato un altro anno, facciamo un paio di conti e parliamo un attimo di questo progetto.</p><h2>È passato un altro anno, facciamo un paio di conti e parliamo un attimo di questo progetto.</h2>
<p>Salve a tutti.</p>
<p>Ieri (19 Maggio 2022) è stato il terzo compleanno di "2D Game Development: From Zero To Hero", eppure non ho scritto nulla! Nè qui, nè su itch o twitter.</p>
<h2>Cos'è successo</h2>
<p>Facciamola breve: riconosco il fatto di aver lavorato <strong>un sacco</strong> su questo progetto. Sono finito in "burnout" più di qualche volta, nel tentativo di infilare quanto più contenuto possibile, in modo da poter dare la possibilità a tutti di interessarsi al mondo dello sviluppo di videogiochi senza dover spendere soldi su corsi o libri "a scatola chiusa".</p>
<p>Ora immaginate il prodotto di tutto questo lavoro preso da qualcuno, senza permesso, e venduto in una grande piattaforma per ricavarne denaro. Come vi sentireste?</p>
<p>Vedere il mio lavoro (considerando che al momento sono di gran lunga il maggior contributore), le mie ore, il mio "burnout" preso pari pari e rivenduto è inaccettabile. Tutto perchè ho voluto creare qualcosa di gratuito.</p>
<p>E prima che il pensiero "è un mondo in cui comandano i soldi, prima o poi doveva accadere" attraversi la mente di qualcuno: farò tutto il possibile per non consentire che questo comportamento venga normalizzato. Il responsabile è stato colpito con un Copyright Strike Intergalattico, <strong>non ci sono scusanti</strong> per prendere qualcosa che è disponibile gratuitamente, e riversarla per far soldi in fretta.</p>
<p>Ne ho abbastanza.</p>
<h2>È l'ora dei conti!</h2>
<p>Lasciamo da parte la rabbia e parliamo di numeri. I numeri del progetto sono onestamente abbastanza buoni, anche se come al solito mi chiedo "perchè non sono migliori?", ma questo è un mio problema.</p>
<p>Numeri in arrivo! (Arrotondati per chiarezza)</p>
<table>
<thead>
<tr>
<th align="left">Statistica</th>
<th align="left">Numero</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Visualizzazioni su Itch</td>
<td align="left">5300+</td>
</tr>
<tr>
<td align="left">Download su Itch</td>
<td align="left">4300+</td>
</tr>
<tr>
<td align="left">Collezioni su Itch</td>
<td align="left">100+</td>
</tr>
<tr>
<td align="left">Stars su GitHub</td>
<td align="left">70+</td>
</tr>
</tbody>
</table>
<p>Considerando come pensavo che le cose dovessero andare quando ho iniziato questo progetto, posso dichiararmi alquanto soddisfatto.</p>
<h2>Cosa succede ora</h2>
<p>Stanno succedendo un sacco di cose.</p>
<p>Ho creato una organizzazione per poter gestire il futuro del progetto in maniera più semplice, in caso questo crescesse più. Considerando l'idea di contributi multi-lingua, questo potrebbe aiutare a gestire le cose.</p>
<p>Inoltre sto lavorando sull'"abbassare la barriera d'entrata" per il libro, facendo meno assunzioni, aggiungendo più basi e rendendo il linguaggio più preciso e semplice da capire, sperabilmente anche estendere il glossario dovrebbe aiutare.</p>
<p>Un sacco di nuovi diagrammi, immagini e aiuti visuali verranno aggiunti, e mi sto sforzando con il controllo qualità. La prossima versione del libro uscirà probabilmente quando il file PDF raggiungerà circa 500 pagine ed altre cose saranno messe a posto, ma questo non accadrà per un po'.</p>
<h2>Conclusioni</h2>
<p>Non c'è molto da dire, avrei voluto festeggiare con un evento più in grande, ma ciò che è successo ieri mi ha messo di cattivo umore, e "fare una festa" il giorno dopo non ha lo stesso sapore.</p>
<p>Stiamo sul semplice ed essenziale. Ancora una volta grazie a tutti per aver dato un' occhiata a progetto e per averlo scaricato, mi aiuta veramente a continuare quest'attività, anche dopo questi incidenti che mi fanno perdere fiducia nell'umanità.</p>
<p>Saluti a tutti e statemi bene.</p>
<p>Penaz.</p>It's "2D Game Development: From Zero to Hero"'s 3rd Birthday!2022-05-20T00:00:00+02:002022-05-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2022-05-20:/en/misc/2DGD_F0TH_6.html<p>Another year has passed, let's crunch some numbers about this project and ramble about.</p><h2>Another year has passed, let's crunch some numbers about this project and ramble about.</h2>
<p>Hello everyone.</p>
<p>Yesterday (May 19th, 2022) was the third birthday of "2D Game Development: From Zero To Hero", yet I didn't make any post! Neither on here, Itch or Twitter.</p>
<h2>What happened</h2>
<p>Let's be brief: I recognize the fact that I've worked <strong>a lot</strong> on this project. I've been burned out more than once trying to cram as much content into it as I could, so I could give everyone a chance to dip their toes into game development without having to spend money "sight unseen" on courses and books.</p>
<p>Now imagine that product of all that work taken by someone, without permission and sell it on a major platform for money. How would you feel?</p>
<p>Seeing your work (considering I'm currently the biggest contributor by far), your hours, your burnout taken advantage of, just because you want to give something for free.</p>
<p>And before the thought of "it's a money driven world, someone was bound to do it sooner or later" crosses through anyone's head. I'm not going to allow normalizing this kind of behaviour. The perpetrator has been hit with an Intergalactic Ballistic Copyright Strike, <strong>there is no excuse</strong> for taking something that is available for free and flip it for a quick buck.</p>
<p>Enough of this.</p>
<h2>Time to crunch numbers!</h2>
<p>Let's leave the dark angry part in the past and let's talk numbers. The project's numbers are in all honesty quite good, even though my usual self asks the usual question of "why are they not higher?", but that's just a me thing.</p>
<p>Here we go with the numbers (rounded down for sake of clarity)!</p>
<table>
<thead>
<tr>
<th align="left">Statistic</th>
<th align="left">Number</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Views on Itch</td>
<td align="left">5300+</td>
</tr>
<tr>
<td align="left">Downloads on Itch</td>
<td align="left">4300+</td>
</tr>
<tr>
<td align="left">Collections on Itch</td>
<td align="left">100+</td>
</tr>
<tr>
<td align="left">Stars on GitHub</td>
<td align="left">70+</td>
</tr>
</tbody>
</table>
<p>Considering how I thought things were going to be when I started this project, I can say I'm quite satisfied.</p>
<h2>What's happening now</h2>
<p>Lots of things are going on.</p>
<p>I created an organization to manage the future of the project more easily, in case it happens to grow bigger than it is now. Considering the idea of multilingual contributions, this may help managing things.</p>
<p>Also I'm working hard on "lowering the entry bar" for the book, by making less assumptions, adding more basics and just making the language more precise and easier to understand, hopefully extending the glossary will help a lot too.</p>
<p>Many more diagrams, pictures and visual aids are being added, and I'm making an effort to get some serious Quality Assurance done. The next version of the book will probably come out when the PDF reaches about 500 pages and some more things are fixed, but that won't happen for a while.</p>
<h2>Conclusions</h2>
<p>Not much to say, I would have liked to make it a bigger event but what happened yesterday kinda ruined the mood, and "having a party" a day later doesn't feel the same either.</p>
<p>Let's just keep it simple and tiny. Again thank you everyone for taking a look at the project and downloading it, it really keeps me going, even after those accidents that make me lose faith in people.</p>
<p>Take care everyone and stay safe.</p>
<p>Penaz.</p>Il 2021 a posteriori2021-12-31T00:00:00+01:002021-12-31T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-12-31:/misc/2021-retrospec.html<p>Un po' di pensieri casuali sull'anno passato e possibili piani per l'anno avvenire.</p><h2>Un po' di pensieri casuali sull'anno passato e possibili piani per l'anno avvenire.</h2>
<p>Salve a tutti,</p>
<p>La fine dell'anno è arrivata, come tutti gli anni, ed è arrivata l'ora di tirare le somme sull'anno appena passato e buttar giù i propositi per l'anno nuovo. Perchè no?</p>
<h3>Il meno bello</h3>
<p>Iniziamo con la parte fastidiosa: ciò che è stato insoddisfacente o semplicemente brutto riguardo all'anno passato.</p>
<p>In breve: mi sembra di aver saltato un anno della mia vita.</p>
<p>Far sempre le stesse cose, vedere sempre le stesse cose, sentire le stesse notizie tutto il tempo: essere bloccati in una qualche sorta di "loop temporale" è una sensazione surreale e profondamente frustrante.</p>
<p>Salute: non è il massimo. Ho avuto alcuni problemi che pensavo fossero risolti, solo per vederli ritornare e rimettere in discussione tutto ciò che ho fatto finora per sentirmi meglio. Considerando lo stato di pandemia in cui ci ritrovaimo, avere problemi di salute manda l'ansia a livelli stratosferici.</p>
<p>Lavoro: non importa quanto abbia provato a fare il giocoliere, farmi pubblicità ed in generale "tenermi a galla", il lavoro è stato un disastro. La pandemia ed i problemi logistici sono risultati in un calo straordinario dei ricavi, che ha portato un bel po' di ansia nella vita di tutti i giorni.</p>
<p>Ho provato a mantenere l'abitudine di studiare tutti i Martedì, ma questo buon proposito è stato sovrastato nel giro di un paio di mesi dal casino lavorativo dell'anno. Il mio obiettivo era migliorare nel mio lavoro, così da poter fare cose migliori più in fretta: non sono soddisfatto dei risultati, ma in tutta onestà non posso pretendere miracoli da 8 giorni di studio.</p>
<p>Ho tentato di migliorare la mia esposizione lavorativa, con risultati mediocri, il che non mi regala molte speranze.</p>
<h3>Il bello</h3>
<p>Ho avuto risultati sorprendentemente buoni dal progetto "2D Game Delopment: From Zero to Hero": mi aspettavo al massimo 500 download per la fine dell'anno. Sono sorpreso nel vedere il contatore dei download superare i 2600.</p>
<p>Ho ricevuto alcuni bei commenti e recensioni, oltre che un paio di suggerimenti, che sono sempre ben accetti.</p>
<p>Il libro ora ha 4 edizioni: Pseudocodice, Python, C++ e JavaScript. Sia in PDF che EPub (anche se vi sono alcuni problemi con la versione EPub). Tutte le edizioni sono attivamente mantenute, anche se (causa stanchezza) il progetto è in pausa, con qualche ritocco qui e li dietro le quinte.</p>
<h3>Il Futuro</h3>
<p>Nel 2022 questo contenitore di pensieri puramente casuali compirà 10 anni: durante tale periodo, il blog ha attraversato diverse iterazioni, da Wordpress a Pelican, iniziando con temi predefiniti ed ora usando un tema personalizzato. È stato divertente lavorarci sopra, e nel mentre ho fatto casino.</p>
<p>Nel tentativo di rendere il tema più universale, così da poterlo usare sia per il mio sito aziendale che il mio blog, ho cambiato la struttura degli URL di questo blog (uno dei peccati peggiori della SEO). Uno dei miei obiettivi nel 2022 sarà inserire delle redirect e tentare di salvare questa povera vittima della mia incuria.</p>
<p>Un altro buon proposito per l'anno nuovo è "riportare in vita il Martedì culturale": voglio prendermi un giorno dedicato a studiare, e sperabilmente vedere dei veri miglioramenti. Voglio migliorare nel mio lavoro, fare meno errori e semplicemente fare di più, più in fretta.</p>
<p>Un altro: voglio investire nel mio lavoro. Espandere la mia rete di conoscenze ed eventualmente farmi un paio di certificazioni serie o una campagna pubblicitaria. Devo pianificare il tutto attentamente se voglio uscire da questo pantano.</p>
<p>Come bonus, eccone un altro: voglio investire più tempo per "riparare" e rendere "2D Game Development: From Zero To Hero" più accessibile ai neofiti, sia dal lato lettori e collaboratori. Voglio inoltre convertire altre bitmap in SVG, per avere quella fantastica alta risoluzione che solo le immagini vettoriali possono dare.</p>
<p>Ancora! (abbiamo gli sconti sui "buoni propositi per l'anno nuovo" oggi, eh?) Sto pensando di creare una organizzazione di GitHub per la gestione di eventuali future traduzioni di "2D Game Development: From Zero to Hero": dato che l'idea è stata lanciata nel forum di Itch.</p>
<p>Ultima, ma non per importanza: smetterla di rimetterci la mia salute per il bene del mio lavoro. Ho notato che nel 2021 le mie ore lavorative sono state sparse oveunque, tanto che mi sono ritrovato più di qualche volta ad essere in ansia per il lavoro di notte o nei fine settimana. Voglio pianificare meglio le mie ore lavorativi e finire il lavoro quando decido che ho finito di lavorare.</p>
<p>Basta "lavorare nel retro della mia mente", basta "sbattere la testa addosso ad un problema finchè non è riparato", ed in generale cercare di prendere le cose come vengono. Questo probabilmente è il proposito più difficile da onorare. Se riuscissi a "buttar giù un po' di peso" nel minestrone, sarebbe fantastico.</p>
<h3>Conclusioni</h3>
<p>Molto male, ma anche del bene. Il 2021 è decisamente stato un anno "misto", sperabilmente quest'anno è stato quello della "semina", e spero che qualche piccola piantina inizi a germinare nel 2022.</p>
<p>Di solito sono quel tipo di persona che vuole tagliare tutti i ponti con l'anno passato, o semplicemente si mette a piangere sopraffatto dall'insoddisfazione in quello che ho fatto (non mi vergogno ad ammetterlo). Quest'anno non mi ha lasciato nulla, nessun "gusto in bocca", quasi come se l'avessi saltato.</p>
<p>Immagino sia ora di dire addio al 2021: l'anno che mai fu (almeno per me).</p>
<p>Spero abbiate tutti quanti un produttivo, felice e fantastico 2022.</p>
<p>State al sicuro, rimanete forti come sempre.</p>
<p>Penaz.</p>2021 in retrospective2021-12-31T00:00:00+01:002021-12-31T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-12-31:/en/misc/2021-retrospec.html<p>Some rambly bits about how 2021 has been and possible plans for the year to come.</p><h2>Some rambly bits about how 2021 has been and possible plans for the year to come.</h2>
<p>Hello everyone,</p>
<p>The end of the year has come again, and it's time to draw conclusions on the year that is about to end and put up some new year's resolutions, because why not.</p>
<h3>The bad</h3>
<p>Let's start with the most annoying bit: what has been unsatisfactory or just outright bad about my experience with this year.</p>
<p>To sum it up: I feel like I've skipped an entire year.</p>
<p>Doing the same things, seeing the same things, hearing the same news all the time: being stuck in some kind of loop feels surreal, and it's thoroughly annoying.</p>
<p>Health: I haven't been feeling the best. I've had some health worries that I thought I fixed just to see them return and put everything I've done to get better in discussion. Considering the world pandemic that we are going through, having health issues shoots the anxiety up into the stratosphere.</p>
<p>Work: no matter how much I tried to juggle things, put myself out there and in general keep myself afloat, work has been a total train wreck. The pandemic and logistical problems have resulted in an extraordinary cut to the earnings, which has brought a good deal of anxiety to my everyday life.</p>
<p>I've tried to keep up with studying on Tuesdays but that has been taken over by the general mess that this work year has been in just a couple of months. My objective was to get better at my job, so I could make better things faster: I'm not satisfied with the results, but to be fair I can't demand miracles from what is effectively 8 days of studying.</p>
<p>I've tried to improve my exposure, with mediocre results at best, which doesn't give me much hope for the future.</p>
<h3>The good</h3>
<p>I've had a surprisingly good response to the "2D Game Development: From Zero To Hero" project: I was expecting at most 500 downloads by the end of this year. I'm surprised to see the download counter surpassing 2600.</p>
<p>I received some nice comments and reviews, along with a couple suggestions too, which are always welcome.</p>
<p>The book now features 4 editions: Pseudocode, Python, C++ and JavaScript. Both in PDF and EPub (although the EPub version has some issues). All of them are actively maintained, even though (due to burnout) the project is on hold, with some minor tweaks here and there going on behind the scenes.</p>
<h3>The future</h3>
<p>In 2022 this container of pure, unadulterated randomness will be 10 years old: in this time this blog went through many iterations, from Wordpress to Pelican, starting with default themes and now using a custom one. It has been fun tinkering with it, and in doing so I've made a mess.</p>
<p>While trying to streamline the theme so I could use it for both my blog and business website, I changed the URL structure of this blog (one of the cardinal sins of SEO). One of my objectives in 2022 will be putting up redirects and try to salvage this poor victim of my carelessness.</p>
<p>Another new year's resolution is "bring back cultural Tuesdays": I want to take a day dedicated to studying again, and hopefully see an improvement for real. I want to get better at my job, make less mistakes and just be able to do more, faster.</p>
<p>Another one: I want to invest in my own job. Expanding my network and eventually thinking about either a couple serious certifications or an advertisement campaign. I need to plan it carefully if I want to get out of this bog.</p>
<p>As a bonus, here's one more: I want to invest some more time in just "fixing" and make "2D Game Development: From Zero to Hero" more beginner-friendly, both on the reader's and contributor's side. I also want to convert more bitmaps into SVG images, for that crisp crisp vector graphics goodness.</p>
<p>Even more! (is there a discount on "New year's resolutions" today?) I'm thinking of creating a GitHub organization to manage possible translations of "2D Game Development: From Zero to Hero" in other languages: since the thought was thrown around in the discussion board on Itch.</p>
<p>Last one, but not least: stop trading my health for my job. I noticed that in 2021 my work hours have been all over the place, and I often found myself getting anxious about work either in the middle of the night or in weekends. I want to plan my work hours better and finish working when I decide that work has finished.</p>
<p>No more "working in the back of my mind", no more "bashing my head on a problem until I fix it", and just in general trying to take care of things as they come to me. This will probably be the hardest resolution yet. If I can add some "shed a few pounds" into the mix, that would be awesome.</p>
<h3>Conclusions</h3>
<p>Lots of bad, but also some good. 2021 was definitely a mixed bag of an year, hopefully this year has been "the year of seeding", and hopefully little sprouts of good will come out in 2022.</p>
<p>Usually I'm one that either wants to cut ties with the old year, or just end up crying due to lack of satisfaction in what I've done (I'm not ashamed to admit it). This year felt like nothing, as in an year that was skipped.</p>
<p>So I guess it's time to say goodbye to 2021: the year that never was (at least in my book).</p>
<p>I really hope you all have a productive, happy and all around amazing 2022.</p>
<p>Stay safe, stay awesome.</p>
<p>Penaz.</p>"2DGD_F0TH": 2000 download dopo2021-11-17T00:00:00+01:002021-11-17T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-11-17:/misc/2DGD_F0TH_5.html<p>Pensieri altamente casuali riguardo al passato, presente e futuro di questo progetto. Un po' come un post-mortem, senza il "mortem".</p><h2>Pensieri altamente casuali riguardo al passato, presente e futuro di questo progetto. Un po' come un post-mortem, senza il "mortem".</h2>
<p>Salve a tutti!</p>
<p>Ho pensato per un bel po' di scrivere questo post, da quando "2D Game Development: From Zero to Hero" raggiunse un totale di 2000 download nella propria <a href="https://therealpenaz91.itch.io/2dgd-f0th">pagina di itch.io</a>.</p>
<p>Ora ho deciso di prendermi del tempo e ripensare a come questo progetto è iniziato, com'è evoluto nel tempo, com'è adesso e cosa potrebbe diventare nel futuro.</p>
<h3>L'inizio</h3>
<p>Ho passato un sacco di tempo a pensare di provare a sviluppare videogiochi, iniziando col libro "<a href="http://inventwithpython.com/">Making games with python and pygame</a>" di Al Sweigart, che ho trovato estremamente interessante, ma con un approccio che non funzionava bene con me.</p>
<p>Il libro mi ha insegnato come creare giochi basilari, ma non riuscivo a comprendere i concetti base dietro ad essi, soprattutto dal lato del "game design" e della gestione di progetto: era puramente un "libro di programmazione", mi insegnava "come" fare.</p>
<p>Il mio approccio è capire ed assimilare i concetti base dietro alle cose, ed i "perchè" che stanno dietro a certe decisioni. Questo è quello che volevo scrivere in questo libro.</p>
<p>Dopo la mia laurea in Informatica, volevo creare quel libro che avrei voluto avere nella mia biblioteca: qualcosa che spiegasse i "perchè" insieme ai "come" dello sviluppo dei videogiochi, con un altro po' di cose connesse.</p>
<p>L'idea di base era quella di usare "pseudocodice" come modo di mostrare concetti in maniera strutturata, tenendomi però lontano da linguaggi di programmazione veri ed evitare di rimanere intrappolato in un framework.</p>
<h3>Feature creep, sei tu?</h3>
<p>Tutte le buone intenzioni del mondo non possono aiutare contro il feature creep, quindi mi chiesi</p>
<blockquote>
<p>perchè limitarsi allo pseudocodice, sicuramente posso giocare coi comandi LaTeX e rimpiazzare i listati di codice in maniera dinamica</p>
</blockquote>
<p>E così vennero a crearsi le "edizioni": prima Python, seguito da C++ (che è stato appena rinfrescato) ed infine il nuovo arrivato: JavaScript.</p>
<p>E poi, dopo 2000 downloads mi posi un'altra domanda:</p>
<blockquote>
<p>a questo punto, è semplice cambiare il codice per aggiungere supporto alle librerie, no?</p>
</blockquote>
<p>e così nacquero le "estensioni di linguaggio", quindi se adesso qualcuno volesse una edizione "Python + Pygame", potrebbero crearla (anche se questa caratteristica è estremamente sotto-documentata).</p>
<h3>Dove siamo adesso</h3>
<p>Questo progetto ha ora 4 edizioni principali: Pseudocodice, Python, C++ e JavaScript. È stato aggiunto in un discreto numero di collezioni ed ha anche ricevuto alcune recensioni su itch.io ed la repository è ferma a 61 "stars" su GitHub, più 9 su GitLab.</p>
<p>Volevo dare una ripulita al libro per renderlo più comprensibile, ma un paio di cose si sono messe di mezzo: la prima è la vita, la seconda è quella che penso sia una crisi d'identità.</p>
<p>Ho inteso questo progetto come un modo per consentire alla gente di "iniziare", oltre ad essere un "agglomerato di conoscenza" che li aiutasse a comprendere i concetti dello sviluppo di videogiochi, e qui è dove mi sono bloccato: potrei aver creato qualcosa di "troppo tecnico".</p>
<p>Voglio bilanciare semplificazione e "correttezza formale", ma temo che mi stia spostando sempre più verso la seconda, ignorando la prima. Questo libro potrebbe non essere più una "introduzione", tradendo il proprio nome: "From Zero to Hero".</p>
<p>C'è un sacco in questo libro: gestione dei progetti, scienze informatiche, matematica, rilevamento delle collisioni, marketing, ... eppure è distante dal "MegaLibro sullo sviluppo di videogiochi" che sogno. E forse, tentando di essere così tante cose insieme, come:</p>
<ul>
<li>Un libro sul design di videogiochi</li>
<li>Un libro Python</li>
<li>Un libro C++</li>
<li>Un libro JavaScript</li>
<li>Un libro sul marketing di videogiochi</li>
<li>...</li>
</ul>
<p>potrebbe arrivare a fallire nel diventare almeno una di queste cose in modo soddisfacente.</p>
<h3>Il futuro di questo progetto</h3>
<p>Il futuro del progetto è ignoto: non so proprio dove virare questa nave, quindi penso che per ora aspetterò per vedere dove ci porta la corrente.</p>
<p>Terrò d'occhio il numero di download, così come commenti e suggerimenti, ma dubito che supporterò altri linguaggi da solo: tentare di scrivere in 3 linguaggi di programmazione assieme mi ha portato a pubblicare una edizione in C++ <em>orribile</em> che ho dovuto mettere a posto, 4 sarebbe un lavoro ancor più massiccio.</p>
<p>Quando la volontà di scrivere tornerà, sicuramente aggiungerò ulteriore contenuto, ma non sarà un aggiornamento massiccio. La versione 0.7.2 del libro sarà la versione principale per un bel po' di tempo, temo.</p>
<p>Forse tenterò di migliorare un po' il marketing su internet?</p>
<h3>Il monologo emotivo</h3>
<p>Personalmente, sono strattonato tra "questo è molto buono, non avrei mai pensato di arrivare a 500 download per la fine del 2021" e "vorrei che questo progetto avesse più trazione", ed entrambe queste emozioni sono equamente vere e non si cancellano a vicenda.</p>
<p>Sono infinitamente grato alle persone che hanno dato una possibilità a questo libro (e per proprietà transitiva, a me): rimango senza parole quando vedo il numero di download del progetto ed il fatto che è quasi sempre tra i 60 libri più popolari su itch.</p>
<p>Semplicemente mi piacerebbe avere una mano (lo so, mi sto ripetendo). Non mi dispiacerebbe avere delle "pull request" da revisionare un giorno, anche solo per conoscere la sensazione.</p>
<h3>"Fonti Alternative"</h3>
<p>Ho notato che alcune "fonti alternative" per questo libro sono spuntate in giro per internet, solitamente consentendo alle persone di scaricare una versione più vecchia del libro dai loro archivi.</p>
<p>Fintantochè tale distribuzione è gratuita, non mi faccio problemi, non conosco l'impatto sul numero di download di tali siti, ed alcune fonti le sottoscriverei volentieri: per esempio <a href="https://unglue.it/work/441810/">unglue.it</a> e <a href="https://openlibrary.org/works/OL24281423W/2D_Game_Development?edition=2dgd_f0th_pe">openlibrary</a> sono fantastiche fonti alternative, anche se potrebbero avere edizioni più vecchie. Ma in ogni caso, sono fonti che distrubuiscono il libro gratuitamente e contengono un sacco di ottimi libri.</p>
<p>Per ogni tipo di uso commerciale, per favore, chiedete il permesso: incluso l'uso di questo libro come "libro di consultazione", in quanto non ho gran fiducia nella sua accuratezza.</p>
<h3>Conclusione</h3>
<p>È stato un viaggio lungo, e considerando le basse aspettative che avevo (iniziando da risposte "miste" su reddit e sondaggi con bassa partecipazione), sono comunque sorpreso che sono qui a parlare di 2000 download. Si parla di 4 volte quanto mi aspettavo inizialmente!</p>
<p>L'unica cosa che posso dire è che la mia testa è tanto incasinata quanto questo post. Se non peggio.</p>
<p>Grazie per tutto, state al sicuro.</p>
<p>Penaz.</p>"2DGD_F0TH": 2000 downloads later2021-11-17T00:00:00+01:002021-11-17T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-11-17:/en/misc/2DGD_F0TH_5.html<p>Highly randomized thoughts about what this project was, is and probably will be. Like a post-mortem, minus the "mortem" part.</p><h2>Highly randomized thoughts about what this project was, is and probably will be. Like a post-mortem, minus the "mortem" part.</h2>
<p>Greetings everyone!</p>
<p>I have been thinking of making this post for a while now, since "2D Game Development: From Zero to Hero" has reached a total of 2000 downloads on its <a href="https://therealpenaz91.itch.io/2dgd-f0th">itch.io page</a>.</p>
<p>And now I decided to take some time and just think about what this project began as, how it evolved over time, how it is now, and what it may become in the future.</p>
<h3>How it started</h3>
<p>I have been thinking of tinkering with game development for a very long time, starting with the ebook "<a href="http://inventwithpython.com/">Making games with python and pygame</a>" by Al Sweigart, which I found to be extremely interesting but using an approach that really didn't work for me.</p>
<p>The book told me how to make some basic games, but I couldn't grasp the basic concepts around it, mostly when it came to game design and project management: it was purely a "coding book", it told me "how".</p>
<p>My approach is to understand and assimilate the basic concepts behind things, and the "why"s behind certain decisions. This is what I wanted to write into this book.</p>
<p>After I got my BSc in Computer Science, I wanted to make that book that I wanted to have in my library: something that would explain the "why"s along with the "how"s of game development, with some more things attached to it.</p>
<p>The basic idea would be using "pseudocode" as a mean to show concepts in a structured way, while keeping myself far from real-life languages and avoid being trapped to a framework.</p>
<h3>Feature creep, is that you?</h3>
<p>All the good intentions in the world can't help against feature creep, so I asked myself</p>
<blockquote>
<p>why limiting it to pseudocode, I can surely play around with LaTeX commands and replace code listings dynamically</p>
</blockquote>
<p>And that's how "editions" came to be: Python first, followed by C++ (which has been freshly fixed up) and finally the new kid in town: JavaScript.</p>
<p>Then after 2000 downloads I asked myself another question:</p>
<blockquote>
<p>at this point, it's easy to change the code to add support for libraries, right?</p>
</blockquote>
<p>and that's how "language addons" came to be, now if someone wants a "Python + PyGame" edition, they can do it (although the feature is terribly under-documented).</p>
<h3>How it is now</h3>
<p>This project now has 4 main editions: Pseudocode, Python, C++ and JavaScript. It has been added in a fair number of collections and has received some reviews on itch.io too and the repository is currently sitting at 61 stars on GitHub plus 9 on GitLab.</p>
<p>I've been meaning to give the book a cleanup and make it easier to understand and a couple things came up: first is real life, second is what I think is an identity crisis.</p>
<p>I've meant this project as a way for people to "get started", and a "body of knowledge" that would help them understand the concepts behind game development, and this is where I've hit a snag: I may have made something that is "too technical".</p>
<p>I want to try and balance simplification and "formal correctness", but I fear that I'm moving towards the latter while neglecting the first. This book may not be a "getting started" anymore, betraying its own name: "From Zero to Hero".</p>
<p>There is a lot in this book: project management, computer science, maths, collision detection, marketing, ... and yet it's still far from the "Game Development MegaBook" that I am dreaming about. And maybe, by trying to be many things at once such as:</p>
<ul>
<li>A game design ebook</li>
<li>A python ebook</li>
<li>A C++ ebook</li>
<li>A JavaScript ebook</li>
<li>A game marketing ebook</li>
<li>...</li>
</ul>
<p>it may be failing to be either of those things in a somewhat satisfactory way.</p>
<h3>The future of this project</h3>
<p>The future of this project is unknown: I don't really know where to steer this ship, so I think that for the time being I'll just see where the currents bring it.</p>
<p>I'll keep a watch on the download number, as well as eventual comments and suggestions, but I doubt I'll add support for more languages by myself: trying to write 3 languages at once already had me publish an <em>awful</em> C++ edition that I had to fix, 4 will be an even bigger undertaking.</p>
<p>When the will to write will come back, I'll surely add some more content, but it won't be anything major. Version 0.7.2 of this book will be the main version for a long time, I feel.</p>
<p>Maybe I'll try doing some better internet marketing for it?</p>
<h3>The emotional talk</h3>
<p>Personally, I am torn between "this is great, I would have never thought I'd even get 500 downloads by the end of 2021" and "I wish the project had more traction", and both feelings are equally true and don't cancel each other out.</p>
<p>I am infinitely grateful to the people who gave this book (and by proxy, me) a chance: I'm speechless by the amount of downloads this project has so far and the fact that it's almost consistently in the top 60 "popular ebooks" on itch.</p>
<p>I just wish I had more help (and I know, I've been repeating myself for ages now) with it. I wouldn't mind having some pull requests to review someday, even just to know how it feels.</p>
<h3>"Alternative Sources"</h3>
<p>I noticed that some "alternative sources" for this book have popped up all over the internet, usually allowing people to download an older version of the ebook from their own archives.</p>
<p>As long as such distribution is free of charge, I don't really mind, I don't know the impact of such sites on the download rate, and some I'm absolutely okay with: for instance <a href="https://unglue.it/work/441810/">unglue.it</a> and <a href="https://openlibrary.org/works/OL24281423W/2D_Game_Development?edition=2dgd_f0th_pe">openlibrary</a> are amazing alternative resources, but they may have older versions. But still, free of charge and contain lots of other great reads.</p>
<p>For any kind of commercial use, ask first, please: including using this as a reference book, cause I really don't have much faith in its accuracy.</p>
<h3>Conclusion</h3>
<p>It has been a long journey, and considering the low expectations I had (starting from some mixed responses on reddit and low-participation polls), I'm still surprised I'm here talking about 2000 downloads. That's 4 times what I was expecting initially!</p>
<p>The only thing I can say is that my head is as much of a mess as this post is. At the very least.</p>
<p>Thanks for everything, stay safe.</p>
<p>Penaz.</p>Analizziamo la mia configurazione di NeoVim2021-08-15T00:00:00+02:002021-08-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-08-15:/coding/MyNvimConfig.html<p>Diamo un'occhiata veloce a cosa sta sotto il cofano del software che produco (ed anche questo blog): la mia configurazione di NeoVim</p><h2>Diamo un'occhiata veloce a cosa sta sotto il cofano del software che produco (ed anche questo blog): la mia configurazione di NeoVim</h2>
<p>Salve a tutti!</p>
<p>A differenza di alcuni sviluppatori nel mondo, ho deciso di evitare di fare uso di un IDE per il mio lavoro. Il mio flusso di lavoro richiede di saltare tra varie cartelle, aprire e chiudere file rapidamente, quindi le tab potrebbero diventare una distrazione e cambiare "workspace" può diventare lento e fastidioso.</p>
<p>Per questo ho deciso di usare NeoVim: ho usato Vim per un sacco di tempo, perchè inizialmente ero curioso, poi ho scoperto quant'è personalizzabile ed ho deciso di continuare: mi ha fatto compagnia per tutto il mio percorso universitario e mi sta facendo ancora compagnia nel mio lavoro.</p>
<p>Ecco come si presenta (in uno screenshot quasi-decente):</p>
<p><img alt="Una schermata del mio NeoVim, con un po' di roba dentro" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_general.png" /></p>
<p>Diamo un'occhiata (non tanto) veloce a cosa fa funzionare il mio editor. Ci saranno <strong>un sacco</strong> di plugin, così come alcune personalizzazioni. Diamoci dentro!</p>
<h3>I plugin</h3>
<p>Questa è una enorme parte del mio editor: faccio uso di un sacco di plugin, ma questo è ciò che accade quanto tenti di far fare tutto ad un singolo editor. I puristi si arrabbieranno con me, e possono pure restare arrabbiati se vogliono. Questo va bene per il <strong>mio</strong> flusso di lavoro, non ti piace? Non usarlo.</p>
<p>I plugin non pesano troppo sul tempo di avvio, a meno che non sia il primo avvio del giorno: quello richiede dai 4 agli 8 secondi su HDD (sempre meglio di alcuni IDE). Dopo il primo avvio, gli altri sono quasi istantanei.</p>
<div class="codehilite"><pre><span></span><code><span class="c">"==================================================</span>
<span class="c">" Plugins</span>
<span class="c">"==================================================</span>
<span class="k">call</span> plug#begin<span class="p">(</span><span class="s1">'~/.config/nvim/plugged'</span><span class="p">)</span>
Plug <span class="s1">'nvim-treesitter/nvim-treesitter'</span><span class="p">,</span> {<span class="s1">'do'</span>: <span class="s1">':TSUpdate'</span>} <span class="c">" New syntax highlight parser</span>
Plug <span class="s1">'raimon49/requirements.txt.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'requirements'</span>} <span class="c">" Syntax Highlight for Python Requirements</span>
Plug <span class="s1">'Lenovsky/nuake'</span> <span class="c">" Quake-Style terminal</span>
Plug <span class="s1">'vim-pandoc/vim-pandoc-syntax'</span><span class="p">,</span> {<span class="s1">'for'</span>: [<span class="s1">'pandoc'</span><span class="p">,</span> <span class="s1">'markdown'</span>]} <span class="c">"Pandoc Syntax HL</span>
Plug <span class="s1">'iamcco/markdown-preview.nvim'</span><span class="p">,</span> {<span class="s1">'do'</span>: { <span class="p">-></span> mkdp#util#install<span class="p">()</span> }<span class="p">,</span> <span class="s1">'for'</span>: <span class="s1">'markdown'</span>}
Plug <span class="s1">'neovim/nvim-lspconfig'</span> <span class="c">" Language Protocol Client</span>
Plug <span class="s1">'ararslan/license-to-vim'</span> <span class="c">"License insertion command</span>
Plug <span class="s1">'norcalli/nvim-colorizer.lua'</span> <span class="c">" Highlight Color names/hex</span>
Plug <span class="s1">'windwp/nvim-ts-autotag'</span> <span class="c">" Automatic Tag Closing via TreeSitter</span>
Plug <span class="s1">'rhysd/committia.vim'</span> <span class="c">" Better Git Commits</span>
Plug <span class="s1">'tversteeg/registers.nvim'</span> <span class="c">" Registers Popup</span>
Plug <span class="s1">'RRethy/vim-illuminate'</span> <span class="c">" Highlight word under cursor</span>
Plug <span class="s1">'tpope/vim-repeat'</span> <span class="c">" Repeat Plugin commands via '.'</span>
Plug <span class="s1">'svermeulen/vim-cutlass'</span> <span class="c">" Makes delete operations actually delete</span>
Plug <span class="s1">'svermeulen/vim-yoink'</span> <span class="c">" YankRing</span>
Plug <span class="s1">'svermeulen/vim-subversive'</span> <span class="c">" Substitution commands and visual paste+replace fixes</span>
Plug <span class="s1">'tpope/vim-fugitive'</span> <span class="c">" Git Support</span>
Plug <span class="s1">'mhinz/vim-startify'</span> <span class="c">"Start screen</span>
Plug <span class="s1">'preservim/nerdcommenter'</span> <span class="c">"Quick comments</span>
Plug <span class="s1">'lukas-reineke/indent-blankline.nvim'</span> <span class="c">" Visual Indent Guides</span>
Plug <span class="s1">'liuchengxu/vista.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: [<span class="s1">'Vista!!'</span><span class="p">,</span> <span class="s1">'Vista'</span>]} <span class="c">" New tagbar plugin with LSP Support</span>
Plug <span class="s1">'mbbill/undotree'</span> <span class="c">" Undo tree</span>
Plug <span class="s1">'tpope/vim-surround'</span> <span class="c">" Surround with quotes, parenthesis etc...</span>
Plug <span class="s1">'junegunn/fzf'</span><span class="p">,</span> {<span class="s1">'do'</span>: {<span class="p">-></span> fzf#install<span class="p">()</span>}} <span class="c">" Fuzzy search of files</span>
Plug <span class="s1">'junegunn/fzf.vim'</span> <span class="c">"FZF Integration for VIM</span>
Plug <span class="s1">'Famiu/feline.nvim'</span> <span class="c">" Nice Status Bar</span>
Plug <span class="s1">'romgrk/barbar.nvim'</span> <span class="c">" Nice Tabline</span>
Plug <span class="s1">'rktjmp/lush.nvim'</span> <span class="c">" Color Scheme Assistant</span>
Plug <span class="s1">'npxbr/gruvbox.nvim'</span> <span class="c">" Color Scheme</span>
Plug <span class="s1">'junegunn/goyo.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Goyo'</span>} <span class="c">" Zen-Style Writing</span>
Plug <span class="s1">'godlygeek/tabular'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Tabularize'</span>} <span class="c">"Text Align</span>
Plug <span class="s1">'lewis6991/gitsigns.nvim'</span> <span class="c">" Version Control Symbols on Rows</span>
Plug <span class="s1">'matze/vim-move'</span> <span class="c">"Moving rows with ALT+j and ALT+k</span>
Plug <span class="s1">'wesQ3/vim-windowswap'</span> <span class="c">"Swap Windows with <leader>ww</span>
Plug <span class="s1">'mg979/vim-visual-multi'</span> <span class="c">" Multiple Cursors (Ctrl+n)</span>
Plug <span class="s1">'windwp/nvim-autopairs'</span> <span class="c">"Parentheses completion</span>
Plug <span class="s1">'ntpeters/vim-better-whitespace'</span> <span class="c">"Highlight and whitespace stripping</span>
Plug <span class="s1">'vimlab/split-term.vim'</span> <span class="c">"Split H/V Terminals</span>
Plug <span class="s1">'terryma/vim-expand-region'</span> <span class="c">" Expand region support</span>
Plug <span class="s1">'vim-scripts/Toggle'</span> <span class="c">"Toggle True/False >/<, etc...</span>
Plug <span class="s1">'SirVer/ultisnips'</span> <span class="p">|</span> Plug <span class="s1">'honza/vim-snippets'</span> <span class="c">" Snippets + Snippet collection</span>
Plug <span class="s1">'junegunn/limelight.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Goyo'</span>} <span class="c">" GoYo Zen Writing extension</span>
Plug <span class="s1">'tyru/open-browser.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Browser preview (used for plantuml)</span>
Plug <span class="s1">'weirongxu/plantuml-previewer.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Plantuml browser preview</span>
Plug <span class="s1">'aklt/plantuml-syntax'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Plantuml syntax HL</span>
Plug <span class="s1">'kyazdani42/nvim-web-devicons'</span> <span class="c">" Icons for plugins</span>
Plug <span class="s1">'roxma/nvim-yarp'</span> <span class="c">" Dependency</span>
Plug <span class="s1">'ncm2/ncm2'</span> <span class="c">" Autocomplete</span>
Plug <span class="s1">'ncm2/ncm2-path'</span> <span class="c">" Path Autocomplete</span>
Plug <span class="s1">'ncm2/ncm2-bufword'</span> <span class="c">" Buffer AutoComplete</span>
Plug <span class="s1">'ncm2/ncm2-ultisnips'</span> <span class="c">" Ultisnips Autocomplete support</span>
Plug <span class="s1">'ncm2/float-preview.nvim'</span> <span class="c">" Float Preview autocomplete support</span>
Plug <span class="s1">'ncm2/ncm2-html-subscope'</span> <span class="c">" Detects JS/CSS subscopes in HTML</span>
Plug <span class="s1">'francoiscabrol/ranger.vim'</span> <span class="c">" Ranger Integration</span>
Plug <span class="s1">'tpope/vim-speeddating'</span> <span class="c">" Easy date increment</span>
Plug <span class="s1">'wellle/visual-split.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: [<span class="s1">'VSResize'</span><span class="p">,</span> <span class="s1">'VSSplit'</span><span class="p">,</span> <span class="s1">'VSSplitAbove'</span><span class="p">,</span> <span class="s1">'VSSplitBelow'</span>]} <span class="c">" Splits that adapt to visual selection</span>
Plug <span class="s1">'kkoomen/vim-doge'</span><span class="p">,</span> {<span class="s1">'do'</span>: { <span class="p">-></span> doge#install<span class="p">()</span> }<span class="p">,</span> <span class="s1">'on'</span>: [<span class="s1">'DogeGenerate'</span><span class="p">,</span> <span class="s1">'DogeCreateDocStandard'</span>]} <span class="c">" Much Docs, such generator, very wow</span>
Plug <span class="s1">'dstein64/vim-startuptime'</span> <span class="c">"Startup Time Profiling</span>
Plug <span class="s1">'rbgrouleff/bclose.vim'</span> <span class="c">" Creates BClose command to close buffer without closing window</span>
Plug <span class="s1">'unblevable/quick-scope'</span> <span class="c">" Highlight when pressing f/F/t/T/,/;</span>
Plug <span class="s1">'p00f/nvim-ts-rainbow'</span> <span class="c">" Treesitter-powered Rainbow Parentheses</span>
Plug <span class="s1">'rhysd/conflict-marker.vim'</span> <span class="c">"Helper for managing manual merge conflicts</span>
Plug <span class="s1">'embear/vim-localvimrc'</span> <span class="c">" Enables per-folder VimRC (editor settings)</span>
Plug <span class="s1">'chrisbra/NrrwRgn'</span> <span class="c">" Narrow Region</span>
Plug <span class="s1">'jceb/emmet.snippets'</span> <span class="c">" Emmet plugin for ultisnips, e<tab></span>
Plug <span class="s1">'edluffy/specs.nvim'</span> <span class="c">" Animazione quando il cursore si sposta di molto</span>
Plug <span class="s1">'folke/trouble.nvim'</span> <span class="c">" Schermata diagnostica migliorata (richiede LSP Interno)</span>
Plug <span class="s1">'nvim-lua/plenary.nvim'</span> <span class="c">" Dependency of many lua plugins</span>
Plug <span class="s1">'folke/todo-comments.nvim'</span> <span class="c">" TODOs/Fixes highlight</span>
Plug <span class="s1">'onsails/lspkind-nvim'</span> <span class="c">" LSP Icons</span>
Plug <span class="s1">'ray-x/lsp_signature.nvim'</span> <span class="c">" Signature Auto-help for nvim LSP</span>
Plug <span class="s1">'folke/lsp-colors.nvim'</span> <span class="c">" Support for LSP colors</span>
Plug <span class="s1">'kosayoda/nvim-lightbulb'</span> <span class="c">" Visible code actions</span>
Plug <span class="s1">'kyazdani42/nvim-tree.lua'</span> <span class="c">" Lua NerdTree Replacement</span>
Plug <span class="s1">'penaz91/fzf_dym'</span> <span class="c">" My 'Did you mean?' plugin</span>
<span class="k">call</span> plug#<span class="k">end</span><span class="p">()</span>
</code></pre></div>
<h3>Personalizzazioni</h3>
<p>Non si vive di soli plugin, parte del mio workflow è legata ad alcune funzioni personalizzate. Ecco qui quelle più interessanti.</p>
<p>Ho creato un piccolo "sistema di segnaposto", che mi consente di saltare e rimpiazzare delle etichette (usando <code><leader>j</code>) che sono evidenziate in rosso. Queste etichette hanno <code><+QUESTO FORMATO+></code> e sono veramente facili da vedere.</p>
<p><img alt="Il "Sistema di Segnaposto"" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_labels.png" /></p>
<p>Ho anche creato un piccolissimo repository locale di template, che usato in combinazione con il "sistema di segnaposto" ed il plugin <code>localvimrc</code> mi permette di avere un bel "menu di Template" che posso usare. Il tutto è impacchettato in un menu di FZF che mi permette di selezionare quale template inserire.</p>
<p><img alt="Il menu "Templates"" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_templates.png" /></p>
<p>Questo menu (legato al bottone F7) cambia a seconda del progetto ed il tipo di file che sto modificando nel buffer. Mi piacerebbe creare un plugin basato su quest'idea, ma per ora è un ammasso di VimScript orribile ed è strettamente legato alle mie necessità</p>
<p>Un altro menu trova origina nella mia abitudine di usare LanguageClient-NeoVim: un semplice menu LSP legato al pulsante F5. Nulla di più semplice.</p>
<p><img alt="Il Menu "LSP"" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_lspmenu.png" /></p>
<p>E siccome non ci sono mai troppi menu, eccone un altro, questa volta legato al bottone F6: questo è un menu di "operazioni miste": lo uso per aggiungere una "modeline" al file corrente, formattare XML o JSON, riparare conflitti di Git. È un cassetto dove tengo un po' tutto.</p>
<p><img alt="Il menu "Tutto il Resto"" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_custom_menu.png" /></p>
<p>Oh, ed ho anche un menu per selezionare la licenza da inserire, legato al comando <code>:Licenses</code>. Perchè non riesco mai a ricordare i nomi usati nel plugin <code>license-to-vim</code>.</p>
<p>L'unica personalizzazione che sono riuscito ad estrapolare in un plugin a sè stante è un set did funzioni per un menu "intendevi...?" che compare quando ho una corrispondenza parziale passata dalla shell ZSH. Originariamente era un altro plugin che ho rielaborato in un set di funzioni nel mio VimRC per far funzionare con FZF che successivamente ho estratto. L'ho chiamato <code>fzf_dym</code> perchè sono una persona altamente creativa.</p>
<h3>Conclusioni e futuri aggiornamenti</h3>
<p>Questo è semplicemente un post che volevo fare, così anche per vedere come le cose cambieranno in futuro e per "vantarmi" un pochettino (tanti sembra lo facciano, quindi perchè no).</p>
<p>Vedo la "luna" nel futuro della mia configurazione NeoVim, precisamente una luna portoghese/brasiliana: lua. NeoVim ha aggiunto il supporto nativo per luaJIT oltre che un punto d'accesso <code>init.lua</code>. Forse in futuro avrò la possibilità di riscrivere quell'ammasso di VimScript incasinato, trasformandolo in un ammasso incasinato di Lua. Vedremo cosa ci riserva il futuro.</p>
<p>Grazie a tutti per aver letto. State al sicuro ed in salute.</p>
<p>Penaz.</p>Analyzing my NeoVim Configuration2021-08-15T00:00:00+02:002021-08-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-08-15:/en/coding/MyNvimConfig.html<p>Let's take a quick look at what's under the hood of my coding (and this blog too): my NeoVim configuration.</p><h2>Let's take a quick look at what's under the hood of my coding (and this blog too): my NeoVim configuration.</h2>
<p>Hello everyone!</p>
<p>Contrary to many developers out there, I decided to avoid using a fully-fledged IDE for my work. My workflow involves jumping around folders, opening and closing files rapidly, so tabs may be distracting and switching workspaces may be cumbersome and slow.</p>
<p>This is why I decided to use NeoVim: I've been using Vim for a really long time, because I was curious about it, and after discovering how customizable it can be I just stuck with it: through university and now my current job.</p>
<p>This is my current setup (or at least a nice-ish screenshot of it):</p>
<p><img alt="A screen of my NeoVim, with some stuff inside" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_general.png" /></p>
<p>Let's have a (not so) quick look to what makes my setup tick. There will be <strong>a ton</strong> of plugins, as well as some customizations. Let's dive in!</p>
<h3>The plugins</h3>
<p>This is a huge part of my setup: I use a lot of plugins, but that's what comes with trying to get a single editor to do everything. Purists will be mad at me, and they can stay mad if they want. This fits <strong>my</strong> workflow, don't like it? Don't use it.</p>
<p>The plugins are not weighing down on the startup time too much, unless it's the first startup of the day: that takes around 4 to 8 seconds on HDD (still better than some IDEs). After that, the startup is almost instantaneous.</p>
<div class="codehilite"><pre><span></span><code><span class="c">"==================================================</span>
<span class="c">" Plugins</span>
<span class="c">"==================================================</span>
<span class="k">call</span> plug#begin<span class="p">(</span><span class="s1">'~/.config/nvim/plugged'</span><span class="p">)</span>
Plug <span class="s1">'nvim-treesitter/nvim-treesitter'</span><span class="p">,</span> {<span class="s1">'do'</span>: <span class="s1">':TSUpdate'</span>} <span class="c">" New syntax highlight parser</span>
Plug <span class="s1">'raimon49/requirements.txt.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'requirements'</span>} <span class="c">" Syntax Highlight for Python Requirements</span>
Plug <span class="s1">'Lenovsky/nuake'</span> <span class="c">" Quake-Style terminal</span>
Plug <span class="s1">'vim-pandoc/vim-pandoc-syntax'</span><span class="p">,</span> {<span class="s1">'for'</span>: [<span class="s1">'pandoc'</span><span class="p">,</span> <span class="s1">'markdown'</span>]} <span class="c">"Pandoc Syntax HL</span>
Plug <span class="s1">'iamcco/markdown-preview.nvim'</span><span class="p">,</span> {<span class="s1">'do'</span>: { <span class="p">-></span> mkdp#util#install<span class="p">()</span> }<span class="p">,</span> <span class="s1">'for'</span>: <span class="s1">'markdown'</span>}
Plug <span class="s1">'neovim/nvim-lspconfig'</span> <span class="c">" Language Protocol Client</span>
Plug <span class="s1">'ararslan/license-to-vim'</span> <span class="c">"License insertion command</span>
Plug <span class="s1">'norcalli/nvim-colorizer.lua'</span> <span class="c">" Highlight Color names/hex</span>
Plug <span class="s1">'windwp/nvim-ts-autotag'</span> <span class="c">" Automatic Tag Closing via TreeSitter</span>
Plug <span class="s1">'rhysd/committia.vim'</span> <span class="c">" Better Git Commits</span>
Plug <span class="s1">'tversteeg/registers.nvim'</span> <span class="c">" Registers Popup</span>
Plug <span class="s1">'RRethy/vim-illuminate'</span> <span class="c">" Highlight word under cursor</span>
Plug <span class="s1">'tpope/vim-repeat'</span> <span class="c">" Repeat Plugin commands via '.'</span>
Plug <span class="s1">'svermeulen/vim-cutlass'</span> <span class="c">" Makes delete operations actually delete</span>
Plug <span class="s1">'svermeulen/vim-yoink'</span> <span class="c">" YankRing</span>
Plug <span class="s1">'svermeulen/vim-subversive'</span> <span class="c">" Substitution commands and visual paste+replace fixes</span>
Plug <span class="s1">'tpope/vim-fugitive'</span> <span class="c">" Git Support</span>
Plug <span class="s1">'mhinz/vim-startify'</span> <span class="c">"Start screen</span>
Plug <span class="s1">'preservim/nerdcommenter'</span> <span class="c">"Quick comments</span>
Plug <span class="s1">'lukas-reineke/indent-blankline.nvim'</span> <span class="c">" Visual Indent Guides</span>
Plug <span class="s1">'liuchengxu/vista.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: [<span class="s1">'Vista!!'</span><span class="p">,</span> <span class="s1">'Vista'</span>]} <span class="c">" New tagbar plugin with LSP Support</span>
Plug <span class="s1">'mbbill/undotree'</span> <span class="c">" Undo tree</span>
Plug <span class="s1">'tpope/vim-surround'</span> <span class="c">" Surround with quotes, parenthesis etc...</span>
Plug <span class="s1">'junegunn/fzf'</span><span class="p">,</span> {<span class="s1">'do'</span>: {<span class="p">-></span> fzf#install<span class="p">()</span>}} <span class="c">" Fuzzy search of files</span>
Plug <span class="s1">'junegunn/fzf.vim'</span> <span class="c">"FZF Integration for VIM</span>
Plug <span class="s1">'Famiu/feline.nvim'</span> <span class="c">" Nice Status Bar</span>
Plug <span class="s1">'romgrk/barbar.nvim'</span> <span class="c">" Nice Tabline</span>
Plug <span class="s1">'rktjmp/lush.nvim'</span> <span class="c">" Color Scheme Assistant</span>
Plug <span class="s1">'npxbr/gruvbox.nvim'</span> <span class="c">" Color Scheme</span>
Plug <span class="s1">'junegunn/goyo.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Goyo'</span>} <span class="c">" Zen-Style Writing</span>
Plug <span class="s1">'godlygeek/tabular'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Tabularize'</span>} <span class="c">"Text Align</span>
Plug <span class="s1">'lewis6991/gitsigns.nvim'</span> <span class="c">" Version Control Symbols on Rows</span>
Plug <span class="s1">'matze/vim-move'</span> <span class="c">"Moving rows with ALT+j and ALT+k</span>
Plug <span class="s1">'wesQ3/vim-windowswap'</span> <span class="c">"Swap Windows with <leader>ww</span>
Plug <span class="s1">'mg979/vim-visual-multi'</span> <span class="c">" Multiple Cursors (Ctrl+n)</span>
Plug <span class="s1">'windwp/nvim-autopairs'</span> <span class="c">"Parentheses completion</span>
Plug <span class="s1">'ntpeters/vim-better-whitespace'</span> <span class="c">"Highlight and whitespace stripping</span>
Plug <span class="s1">'vimlab/split-term.vim'</span> <span class="c">"Split H/V Terminals</span>
Plug <span class="s1">'terryma/vim-expand-region'</span> <span class="c">" Expand region support</span>
Plug <span class="s1">'vim-scripts/Toggle'</span> <span class="c">"Toggle True/False >/<, etc...</span>
Plug <span class="s1">'SirVer/ultisnips'</span> <span class="p">|</span> Plug <span class="s1">'honza/vim-snippets'</span> <span class="c">" Snippets + Snippet collection</span>
Plug <span class="s1">'junegunn/limelight.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: <span class="s1">'Goyo'</span>} <span class="c">" GoYo Zen Writing extension</span>
Plug <span class="s1">'tyru/open-browser.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Browser preview (used for plantuml)</span>
Plug <span class="s1">'weirongxu/plantuml-previewer.vim'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Plantuml browser preview</span>
Plug <span class="s1">'aklt/plantuml-syntax'</span><span class="p">,</span> {<span class="s1">'for'</span>: <span class="s1">'plantuml'</span>} <span class="c">" Plantuml syntax HL</span>
Plug <span class="s1">'kyazdani42/nvim-web-devicons'</span> <span class="c">" Icons for plugins</span>
Plug <span class="s1">'roxma/nvim-yarp'</span> <span class="c">" Dependency</span>
Plug <span class="s1">'ncm2/ncm2'</span> <span class="c">" Autocomplete</span>
Plug <span class="s1">'ncm2/ncm2-path'</span> <span class="c">" Path Autocomplete</span>
Plug <span class="s1">'ncm2/ncm2-bufword'</span> <span class="c">" Buffer AutoComplete</span>
Plug <span class="s1">'ncm2/ncm2-ultisnips'</span> <span class="c">" Ultisnips Autocomplete support</span>
Plug <span class="s1">'ncm2/float-preview.nvim'</span> <span class="c">" Float Preview autocomplete support</span>
Plug <span class="s1">'ncm2/ncm2-html-subscope'</span> <span class="c">" Detects JS/CSS subscopes in HTML</span>
Plug <span class="s1">'francoiscabrol/ranger.vim'</span> <span class="c">" Ranger Integration</span>
Plug <span class="s1">'tpope/vim-speeddating'</span> <span class="c">" Easy date increment</span>
Plug <span class="s1">'wellle/visual-split.vim'</span><span class="p">,</span> {<span class="s1">'on'</span>: [<span class="s1">'VSResize'</span><span class="p">,</span> <span class="s1">'VSSplit'</span><span class="p">,</span> <span class="s1">'VSSplitAbove'</span><span class="p">,</span> <span class="s1">'VSSplitBelow'</span>]} <span class="c">" Splits that adapt to visual selection</span>
Plug <span class="s1">'kkoomen/vim-doge'</span><span class="p">,</span> {<span class="s1">'do'</span>: { <span class="p">-></span> doge#install<span class="p">()</span> }<span class="p">,</span> <span class="s1">'on'</span>: [<span class="s1">'DogeGenerate'</span><span class="p">,</span> <span class="s1">'DogeCreateDocStandard'</span>]} <span class="c">" Much Docs, such generator, very wow</span>
Plug <span class="s1">'dstein64/vim-startuptime'</span> <span class="c">"Startup Time Profiling</span>
Plug <span class="s1">'rbgrouleff/bclose.vim'</span> <span class="c">" Creates BClose command to close buffer without closing window</span>
Plug <span class="s1">'unblevable/quick-scope'</span> <span class="c">" Highlight when pressing f/F/t/T/,/;</span>
Plug <span class="s1">'p00f/nvim-ts-rainbow'</span> <span class="c">" Treesitter-powered Rainbow Parentheses</span>
Plug <span class="s1">'rhysd/conflict-marker.vim'</span> <span class="c">"Helper for managing manual merge conflicts</span>
Plug <span class="s1">'embear/vim-localvimrc'</span> <span class="c">" Enables per-folder VimRC (editor settings)</span>
Plug <span class="s1">'chrisbra/NrrwRgn'</span> <span class="c">" Narrow Region</span>
Plug <span class="s1">'jceb/emmet.snippets'</span> <span class="c">" Emmet plugin for ultisnips, e<tab></span>
Plug <span class="s1">'edluffy/specs.nvim'</span> <span class="c">" Animazione quando il cursore si sposta di molto</span>
Plug <span class="s1">'folke/trouble.nvim'</span> <span class="c">" Schermata diagnostica migliorata (richiede LSP Interno)</span>
Plug <span class="s1">'nvim-lua/plenary.nvim'</span> <span class="c">" Dependency of many lua plugins</span>
Plug <span class="s1">'folke/todo-comments.nvim'</span> <span class="c">" TODOs/Fixes highlight</span>
Plug <span class="s1">'onsails/lspkind-nvim'</span> <span class="c">" LSP Icons</span>
Plug <span class="s1">'ray-x/lsp_signature.nvim'</span> <span class="c">" Signature Auto-help for nvim LSP</span>
Plug <span class="s1">'folke/lsp-colors.nvim'</span> <span class="c">" Support for LSP colors</span>
Plug <span class="s1">'kosayoda/nvim-lightbulb'</span> <span class="c">" Visible code actions</span>
Plug <span class="s1">'kyazdani42/nvim-tree.lua'</span> <span class="c">" Lua NerdTree Replacement</span>
Plug <span class="s1">'penaz91/fzf_dym'</span> <span class="c">" My 'Did you mean?' plugin</span>
<span class="k">call</span> plug#<span class="k">end</span><span class="p">()</span>
</code></pre></div>
<h3>Customizations</h3>
<p>I don't live using only plugins, part of my workflow is tied to some custom-made functions. Here are the most notable customizations I use.</p>
<p>I made a "placeholder system", that allows me to quickly jump and fill in a label (using <code><leader>j</code>) that is highlighted in red. Such labels have <code><+THIS FORMAT+></code> and make it really easy for me to see them.</p>
<p><img alt="The "Placeholder System"" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_labels.png" /></p>
<p>I also made a tiny local template repository, that in combination with the "placeholder system" and the <code>localvimrc</code> plugin allows me to have a nice "Template Menu" that I can then customize for my needs. This is all wrapped nicely by a custom FZF menu that allows me to select what template to insert.</p>
<p><img alt="The "Templates" Menu" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_templates.png" /></p>
<p>This menu (bound to the F7 key) changes according to the project and the filetype I'm editing in the current buffer. I would love to make a plugin out of it one day, but as of now, it's a cluster of horrible VimScript coding and it's tightly tailored for my needs.</p>
<p>Another menu comes from my habit of using LanguageClient-NeoVim: a simple LSP Menu bound to the F5 key. Doesn't get any simpler than that.</p>
<p><img alt="The "LSP" Menu" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_lspmenu.png" /></p>
<p>And since there can't be too many menus, here is another one, this time bound to the F6 key: this is a "Miscellaneous operations" menu: I use it to append a modeline to the current file, pretty format XML or JSON, fixing Git Conflicts. It's a bag of tricks of sort.</p>
<p><img alt="The "Everything else" Menu" src="https://penazarea.altervista.org/Programming/images/nvim/nvim_custom_menu.png" /></p>
<p>Oh, I also have a menu to select the License I bound to the <code>:Licenses</code> command. Because I can't remember the names in the <code>license-to-vim</code> plugin.</p>
<p>The only customization I managed to pull into a standalone plugin was a set of functions I made for a "did you mean?" prompt when I get a partial completion from ZSH. It was originally a plugin, I reworked it into my VimRC to work with FZF and then extracted it again into its own thing. I called it <code>fzf_dym</code> because I'm a very creative person.</p>
<h3>Conclusions and future updates</h3>
<p>This is just a random post I wanted to make, to see how things will change in the future and to "flex" a tiny bit (seems many do that lately, so why not).</p>
<p>I see the "moon" in my NeoVim's configuration future, to be precise a portoguese/brazilian moon: lua. NeoVim added native support for luaJIT as well as a new <code>init.lua</code> entrypoint. Maybe in the future I will have the chance to rewrite all the messy VimScript stuff into messy lua. We'll see what the future holds.</p>
<p>Thank you everyone for reading. Stay safe and healthy.</p>
<p>Penaz.</p>Game Bytes: Darksiders Genesis2021-06-29T00:00:00+02:002021-06-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-06-29:/game-bytes/Game_Bytes_Darksiders_Genesis.html<p>Guerra è... libero? Tuffiamoci in questo prequel della trilogia di Darksiders!</p><h2>Guerra è... libero? Tuffiamoci in questo prequel della trilogia di Darksiders!</h2>
<p>Darksiders Genesis è un gioco ibrido che fonde elementi hack&slash e sparatutto con vista isometrica. Il gioco è sviluppato da Airship Syndicate e pubblicato da THQ Nordic ed in questo prequel gestiremo il team composto da Guerra e Conflitto nel tentativo di fermare i piani malvagi di Lucifero.</p>
<h3>Grafica</h3>
<p>La grafica è ben curata ed i modelli son ben curati, tanto che mi chiedo se la motivazione della vista isometrica sia semplicemente per facilitare il gioco nei panni di Conflitto.</p>
<h3>Setup e prestazioni</h3>
<p>Installare il gioco tramite Steam è veloce e facile, le prestazioni sono buone ma a risoluzioni più alte si nota qualche calo di frame apparentemente immotivato.</p>
<h3>Comparto sonoro</h3>
<p>Ottimo il sonoro, anche se alle volte il doppiaggio di alcuni personaggi può risultare incomprensibile a causa degli effetti di distorsione "demoniaca" applicati o semplicemente per un mixing un po' carente.</p>
<h3>Gameplay</h3>
<p>Il gioco poteva essere fantastico ma a causa del platforming, unito alla telecamera isometrica ed i bachi nella collisione con certi terreni la rabbia può prendere il sopravvento: Leviathan's Landing (per fortuna facoltativo) è un buco nero che assorbe tutta la voglia di giocare che hai in corpo.</p>
<p>Il gioco ha dei personaggi solidi, così come i comandi durante il combattimento, anche se ho detestato profondamente l'abilità "Aether Spark" di Conflitto (è un puzzle con una palla, dai!) che ancora una volta risulta frustrante.</p>
<p>Conflitto ha la stessa lingua tagliente di Spider-Man e viene sviluppato molto bene, il combattimento è soddisfacente, la storia è buona e fluisce discretamente, le abilità sono ben differenziate... Peccato per alcune pecche molto molto forti che peseranno sul giudizio finale.</p>
<h3>Conclusioni</h3>
<p>È suprema fonte di rabbia vedere così tanta potenzialità in un gioco venir rovinata da pochi elementi che risultano poco curati e frustranti.</p>
<p>Una visuale da dietro la spalla come gli altri giochi della serie, una maggior cura nel testing e la sostituzione dell'abilità "Aether Spark" con qualcosa di più curato avrebbero giovato enormemente al gioco, che così si sarebbe piazzato al secondo posto come "preferito della serie". Invece si piazza allo stesso posto del primo Darksiders, con lo stesso identico punteggio: <strong>75/100</strong>.</p>
<p>Se volete vedere le altre recensioni della serie, ve le lascio qui sotto:</p>
<ul>
<li><a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders.html">Link alla recensione di Darksiders: Warmastered Edition</a></li>
<li><a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders_2.html">Link alla recensione di Darksiders 2: Deathinitive Edition</a></li>
<li><a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders_3.html">Link alla recensione di Darksiders 3</a></li>
</ul>
<p>Grazie a tutti per aver letto, ci si vede al prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders Genesis"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "75",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders Genesis2021-06-29T00:00:00+02:002021-06-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-06-29:/en/game-bytes/Game_Bytes_Darksiders_Genesis.html<p>War is... free? Let's dive into this prequel of the Darksiders trilogy!</p><h2>War is... free? Let's dive into this prequel of the Darksiders trilogy!</h2>
<p>Darksiders Genesis is a hybrid game that merges together hack&slash with shooter elements, with an isometric view. The game was developed by Airship Syndicate and published by THQ Nordic. In this prequel we'll manage the War+Conflict team, trying to stop Lucifer's evil plans.</p>
<h3>Graphics</h3>
<p>The graphics are well made and the models are well done, so much that I'm asking myself if the isometric view was used just to make Conflict's gameplay easier.</p>
<h3>Setup e prestazioni</h3>
<p>Installing the game via Steam is fast and easy, performance is good but you can notice some seemingly random frame drops at higher resolutions .</p>
<h3>Sound</h3>
<p>Sound is excellent, even though sometimes the dubbing of certain characters can be unintelligible due to either "demonic" sound distortions or simply due to a bit of a lackluster mixing.</p>
<h3>Gameplay</h3>
<p>This game could have been fantastic, but due to platforming, isometric camera and collision detection bugs with some terrains, anger can take the best of you: Leviathan's Landing (luckily it's not mandatory) is a black hole that will absorb all your will to play from your body.</p>
<p>The game has solid characters, as well as solid fighting controls, although I hated Conflict's "Aether Spark" ability (come on, it's just a puzzle with a rolling ball!) which comes out as frustrating yet again.</p>
<p>Conflict is as sharp-tongued as Spider-Man and sees some good development during the course of the story, fighting is satisfying, the story is good and flows well, abilities are well differentiated... Sadly there are some big issues that will weigh on the final judgement.</p>
<h3>Conclusions</h3>
<p>It is a supreme source of anger seeing a game with so much potential in a game being ruined by few elements that come out as frustrating and uncared for.</p>
<p>Un behind-the-shoulder view like the other games in the series, a better care for testing and replacing "Aether Spark" with something better would have helped the game greatly, so much so that it would have easily become my second "favourite of the series". Instead it places at the same spot of the first game, with the exact same score: <strong>75/100</strong>.</p>
<p>If you want to see the other reviews in the series, I'll leave them below:</p>
<ul>
<li><a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders.html">Link to Darksiders: Warmastered Edition's Review</a></li>
<li><a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders_2.html">Link to Darksiders 2: Deathinitive Edition's Review</a></li>
<li><a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders_3.html">Link to Darksiders 3's Review</a></li>
</ul>
<p>Thank you everyone for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders Genesis"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "75",
"worstRating": "0",
"bestRating": "100"
}
}
</script>"2DGD_F0TH": La versione Epub è disponibile per il download!2021-04-13T00:00:00+02:002021-04-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-04-13:/misc/2DGD_F0TH_4.html<p>Dopo settimane di lavoro, è possibile scaricare la versione EPub di questo libro, con una piccola discussione sui cambiamenti avvenuti.</p><h2>Dopo settimane di lavoro, è possibile scaricare la versione EPub di questo libro, con una piccola discussione sui cambiamenti avvenuti.</h2>
<p>Questo è il seguito di un altro post: <a href="https://penazarea.altervista.org/misc/2DGD_F0TH_3.html">Leggi "2DGD_F0TH": Risultati statistici, analisi e pensieri</a> prima.</p>
<p>Salve a tutti, quanto tempo!</p>
<p>Finalmente dopo settimane di lavoro (saltuario), posso considerare il ramo "EPub" del libro abbastanza maturo da poter essere rilasciato al pubblico, nella speranza di non essermi dimenticato nulla.</p>
<p>Se volete scaricare il libro, potete farlo dall'iframe qui sotto:</p>
<iframe frameborder="0" src="https://itch.io/embed/688065?linkback=true&dark=true" width="552" height="167"><a href="https://therealpenaz91.itch.io/2dgd-f0th">2D Game Development: From Zero To Hero by Penaz</a></iframe>
<p>Vorrei prendere un po' di tempo per annotare come ho risolto i vari problemi presentatimisi, così da eventualmente aiutare chi in futuro vorrà intraprendere un'impresa simile alla mia.</p>
<h3>PDF Integrati</h3>
<p>Questa soluzione è stata abbastanza semplice dal lato tecnico, ma complessa per tutto il resto: è stato sufficiente convertire tutte le immagini in SVG.</p>
<p>Il problema è sorto quando il mio lettore di EPub preferito (il fantastico <a href="https://koreader.rocks/">KOReader</a>) si rifiutava di visualizzare le immagini nel formato EPub.</p>
<p>Ad un certo punto ho iniziato a sospettare che il problema fosse più legato al lettore che all'e-book in sè, e sono passato al lettore integrato di <a href="https://calibre-ebook.com/">Calibre</a> che ha mostrato tutte le immagini senza alcun problema.</p>
<p>La conversione delle immagini ad SVG ha risolto il problema del formato EPub, ed il buon Pandoc si occupa della conversione automatica per le release in PDF.</p>
<h3>Formule Matematiche</h3>
<p>Questa problematica è stata più facile del previsto: ho scoperto uno strumento che, usato come filtro per Pandoc, consente di convertire tutte le formule matematiche in immagini SVG, includendole nel documento automaticamente.</p>
<p>Tale strumento si chiama <a href="https://github.com/humenda/GladTeX">GladTeX</a> e sono veramente grato della sua esistenza.</p>
<h3>LaTeX Integrato e Listati di codice dinamici</h3>
<p>Questa è stata la parte più dura dell'intera transizione, la conversione di LaTeX in qualcosa di comprensibile a Pandoc.</p>
<p>Ho passato serate a studiarmi la documentazione ed ho scritto 7 filtri in Lua per consentire la conversione di vari segnaposto e "div" in un formato che possa andare bene per EPub e PDF, per un totale di 201 righe di Lua (che per uno che non conosce il linguaggio come me, è una mostruosità).</p>
<p>Altri pezzi di LaTeX sono stati eliminati convertendoli in immagini SVG, mentre altri ancora (le sezioni su due colonne) sono stati eliminati perchè non avevano senso in un formato "fluido" come EPub.</p>
<h3>Cosa Manca</h3>
<p>Non molto: manca la dedica nell'avantesto, la copertina posteriore e la copertina non riporta l'edizione. Sono tutte cose che ritengo minori, nel frattempo ritengo che rilasciare il libro per vedere se tutto il contenuto è leggibile sia più importante.</p>
<h3>Conclusioni</h3>
<p>Sono felice di aver vinto questa piccola grande sfida e di aver finalmente buttato fuori dalla porta questo risultato, ora mi sto dedicando (lentamente) ad aggiungere nuovo contenuto.</p>
<p>Grazie a tutti per aver letto.</p>
<p>Penaz.</p>"2DGD_F0TH": The Epub version is available for download!2021-04-13T00:00:00+02:002021-04-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2021-04-13:/en/misc/2DGD_F0TH_4.html<p>After weeks worth of work, the EPub version of this book is available for download, along with a small digression on the changes that came with it.</p><h2>After weeks worth of work, the EPub version of this book is available for download, along with a small digression on the changes that came with it.</h2>
<p>This is a follow-up to a previous post: <a href="https://penazarea.altervista.org/en/misc/2DGD_F0TH_3.html">Check out "2DGD_F0TH": Poll results, analysis and thoughts</a> first.</p>
<p>Hello everyone, long time no see!</p>
<p>Finally, after weeks of (irregular) work, I can consider the "EPub" branch of this book mature enough to be released to the public, with the hope I forgot nothing on the way.</p>
<p>If you want to download the book, you can do it from the following iframe:</p>
<iframe frameborder="0" src="https://itch.io/embed/688065?linkback=true&dark=true" width="552" height="167"><a href="https://therealpenaz91.itch.io/2dgd-f0th">2D Game Development: From Zero To Hero by Penaz</a></iframe>
<p>I would like to talk about how I solved the problems I found, hoping to help someone who wants to take on a challenge similar to mine.</p>
<h3>Embedded PDFs</h3>
<p>This solution was technically simple, but everything else was complex: converting the images to SVG was more than enough.</p>
<p>The problems started when my favourite Epub reader (the fantastic <a href="https://koreader.rocks/">KOReader</a>) refused to show images in the EPub format.</p>
<p>After a while, I started suspecting the problem was lying on the reader, more than the ebook itself, and I switched to the built-in reader used in <a href="https://calibre-ebook.com/">Calibre</a> which was showing all images without a single issue.</p>
<p>So converting images to SVG solved the issue with the EPub format, and good old Pandoc takes care of converting the images for the PDF release on its own.</p>
<h3>Math formulas</h3>
<p>This problem was easier to fix than I thought: I found a tool that, used as a Pandoc filter, allows to convert all math formulas to SVG images, automatically bundling them into the document.</p>
<p>Such tool is called <a href="https://github.com/humenda/GladTeX">GladTeX</a> and boy am I glad it exists (pun intended).</p>
<h3>Embedded LaTeX and Dynamic Code listings</h3>
<p>This was the toughest part of the whole transition, converting pure LaTeX to something Pandoc could understand.</p>
<p>I spend entire evenings studying the documentation and I wrote 7 Lua filters to allow converting various placeholders and "Divs" in a format that could work both for EPub and PDF, totalling 201 rows of Lua (which for someone like me, who doesn't know the language, it's huge).</p>
<p>Other pieces of LaTeX were deleted and converted to SVG images, some others (multi-column sections) were straight out deleted because they didn't make sense in a "fluid" format like EPub.</p>
<h3>What's missing</h3>
<p>Not much: the dedication is missing from the front matter, the back cover is missing and the front cover doesn't show the edition. These are all minor things in my book (pun intended, again), in the meantime I think releasing the book and see if everything is readable is far more important.</p>
<h3>Conclusions</h3>
<p>I'm happy that I won this little big challenge and finally get this result out of the door, now I am (slowly) dedicating myself to adding new content.</p>
<p>Thank you everyone for reading.</p>
<p>Penaz.</p>"2DGD_F0TH": Risultati statistici, analisi e pensieri2021-02-10T00:00:00+01:002021-02-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-02-10:/misc/2DGD_F0TH_3.html<p>In questo post darò un'occhiata ai risultati dei sondaggi su twitter, discuto alcuni problemi che sono comparsi e probabilmente dovrò rimangiarmi la parola.</p><h2>In questo post darò un'occhiata ai risultati dei sondaggi su twitter, discuto alcuni problemi che sono comparsi e probabilmente dovrò rimangiarmi la parola.</h2>
<p>Questo è il seguito di un altro post: <a href="https://penazarea.altervista.org/misc/2DGD_F0TH_2.html">Leggi "2D Game Development: From Zero To Hero - 2 anni dopo"</a> prima.</p>
<p>Ci sono pochissime cose che detesto più di dovermi rimangiare la parola. Cerco sempre di mantenere le mie promesse, a volte a mio stesso scapito.</p>
<p>Questo volta, devo rimangiarmi la parola, almeno in parte, e spiegherò il motivo qui.</p>
<p><strong>Attenzione:</strong> questo post contiene linguaggio tecnico, cercherò di semplificare quanto più possibile, ma potrei non riuscirci.</p>
<h3>I sondaggi</h3>
<p>Il 26 Gennaio, ho deciso di aprire un paio di sondaggi, della durata di 7 giorni, per capire cosa si aspettasse la gente dal progetto in un futuro prossimo.</p>
<p>La prima domanda riguarda il formato: ho chiesto quale formato fosse preferito per il libro, tra i seguenti:</p>
<ul>
<li>PDF (27.3%)</li>
<li>EPub (18.2%)</li>
<li>Sia EPub che PDF (54.5%)</li>
<li>Online (0%)</li>
</ul>
<p>Possiamo vedere che oltre la metà dei votanti (11 per la precisione), vorrebbero vedere un doppio rilascio PDF ed EPub.</p>
<p>La seconda domanda riguarda la prossima "edizione" da rilasciare, per vedere quale linguaggio dovrei coprire:</p>
<ul>
<li>Lua (60%)</li>
<li>C# (40%)</li>
<li>Altro (0%)</li>
</ul>
<p>Possiamo vedere che Lua ha vinto con il 60% dei voti (purtroppo solo 5 persone hanno votato).</p>
<h3>I linguaggi</h3>
<p>Conosco un buon numero di linguaggi di programmazione, come C++, Python e Java, ma non posso conoscerli tutti.</p>
<p>Lua sta in una posizione un po' strana: riesco a leggerlo, riesco a farci delle piccole cose (alcuni filtri che uso per produrre questo libro sono scritti in Lua), non sono un "esperto".</p>
<p>Lua è inoltre un linguaggio alquanto peculiare: non ha alcun sistema di classi, ma possiede delle caratteristiche di metaprogrammazione alquanto potenti (quindi se volessi, potresti creare un "sistema di classi" da zero), ed ha un tipo complesso molto potente chiamato "tables" (tabelle).</p>
<p>Tradurre il codice presente verso il linguaggio Lua sarebbe un compito molto grande e complesso per me.</p>
<p>Sono un novellino totale per quanto riguarda C#, ho iniziato ad impararlo in passato, sperando di imparare qualcosa di nuovo e riaccendere la mia voglia di imparare. Purtroppo mi sono fermato.</p>
<p>Creare una edizione in C# sarebbe una buona scusa per imparare nuovamente C#, ma sarebbe comunque un compito pesante.</p>
<h3>I formati</h3>
<p>Questo è un altro punto dolente del progetto: per ora (e per il futuro prossimo), un'edizione in EPub non è possibile.</p>
<p>Vi sono molteplici motivi e li esporrò uno dopo l'altro.</p>
<h4>PDF Integrati</h4>
<p>Per mantenere immagini nitide nel libro, ho deciso di fare uso di file "PDF Vettoriali", che consentono all'utente di ingrandire le immagini a piacere senza avere un aspetto "pixellato".</p>
<p>Sul lettore di libri di Calibre, queste immagini non sono visualizzate, e ricevo un sacco di errori in console a causa del "sandboxing". Non ho indagato ulteriormente.</p>
<div class="codehilite"><pre><span></span><code>ERROR: clbr://internal.sandbox/book/__index__:0: Failed to load <span class="s1">'clbr://internal.sandbox/book/EPUB/media/file1.pdf'</span> as a plugin, because the frame into which the plugin is loading is sandboxed.
</code></pre></div>
<h4>Formule Matematiche</h4>
<p>Un altro problema è dovuto alla matematica: alcuni pezzi di matematica LaTeX che ho usato non sono riconosciuti e convertibili in MathML:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span>WARNING<span class="o">]</span> Could not convert TeX math <span class="s1">'180\degree'</span>, rendering as TeX:
<span class="m">180</span><span class="se">\d</span>egree
</code></pre></div>
<p>Questo è un esempio semplice, ma matrici ed altre formule sono parte del problema, solitamente a causa dell'uso di <code>\degree</code>, <code>\textcolor</code> o <code>\bcancel</code>.</p>
<p>Questi errori non fermano l'esecuzione della build, ma mi lasciano con un ebook rotto, senza alcuni pezzi.</p>
<h4>LaTeX integrato e Listati di codice Dinamici</h4>
<p>Ci sono state alcune situazioni in cui avevo veramente bisogno di qualcosa (come una tabella) fatta esattamente in un certo modo, e non volevo creare un'immagine, quindi ho deciso semplicemente di integrare del codice LaTeX all'interno del documento Markdown.</p>
<div class="codehilite"><pre><span></span><code><span class="k">\begin</span><span class="nb">{</span>table<span class="nb">}</span>[H]
<span class="k">\centering</span>
<span class="k">\caption</span><span class="nb">{</span>Karnaugh Map for A XOR B<span class="nb">}</span>
<span class="k">\begin</span><span class="nb">{</span>tabular<span class="nb">}{</span>|c c|c c|<span class="nb">}</span>
<span class="k">\hline</span>
<span class="nb">&</span> <span class="nb">&</span> <span class="k">\multicolumn</span><span class="nb">{</span>2<span class="nb">}{</span>c|<span class="nb">}{</span>A<span class="nb">}</span><span class="k">\\</span>
<span class="nb">&</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>0<span class="nb">}</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>1<span class="nb">}</span><span class="k">\\</span>
<span class="k">\hline</span>
<span class="k">\multirow</span><span class="nb">{</span>2<span class="nb">}{</span>*<span class="nb">}{</span>B<span class="nb">}</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>0<span class="nb">}</span> <span class="nb">&</span> 0 <span class="nb">&</span> 1 <span class="k">\\</span>
<span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>1<span class="nb">}</span> <span class="nb">&</span> 1 <span class="nb">&</span> 0<span class="k">\\</span>
<span class="k">\hline</span>
<span class="k">\end</span><span class="nb">{</span>tabular<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>table<span class="nb">}</span>
</code></pre></div>
<p>Questo non è un problema quando vado a creare un documento PDF: il documento Markdown viene convertito in LaTeX in ogni caso, e il codice LaTeX che ho inserito viene semplicemente "passato di mano".</p>
<p>Il problema è quando devo pubblicare in formato EPub: il codice LaTeX viene completamente ignorato e cancellato. Senza nessuna traccia.</p>
<p>La stessa cosa accade per un'altra grossa caratteristica del progetto: i listati di codice dinamici. Per poter creare velocemente tutte le edizioni, ho creato un comando LaTeX:</p>
<div class="codehilite"><pre><span></span><code><span class="k">\code</span><span class="nb">{</span>nomefile<span class="nb">}{</span>descrizione<span class="nb">}</span>
</code></pre></div>
<p>Questo significa che la gran parte (se non tutti) dei listati di codice mancano all'interno del formato EPub "in produzione".</p>
<h3>Altri Problemi</h3>
<p>Oltre a questi problemi, alcuni potrebbero aver notato che la procedura di build su Travis sta fallendo. Non riesco a capirne la causa, quindi ogni volta che rilascio il libro devo aggiornare manualmente le release su GitHub.</p>
<p>Sto pensando di lasciar stare le Release su GitHub e gli Artifact di GitLab in favore di usare semplicemente Butler per inserire i file su Itch.io.</p>
<h3>L'ora di rimangiarsi la parola</h3>
<p>Ecco che arriva la parte difficile per me: devo ridimensionare i miei piani. E questo vuol dire che devo "rimangiarmi la parola".</p>
<p>Per quanto voglia rilasciare un "ramo EPub" di questo libro, questo non sarà possibile in un futuro prossimo. Molte cose devono essere riviste, dovrei costruire un nuovo template, così come il CSS e l'avantesto.</p>
<p>Purtroppo non vi saranno nemmeno delle edizioni in Lua o C#. Al momento non conosco abbastanza i linguaggi, e non ho il tempo (e soprattutto la forza d'animo) di impararli: il lavoro non mi sta trattando bene, e facendo lo sviluppatore di software, vedere ulteriore codice dopo aver finito di lavorare non è tra i miei desideri.</p>
<h3>Il futuro del progetto</h3>
<p>Il progetto è al momento in pausa: come ho detto, il lavoro mi sta trattando male, e voglio provare a riguadagnare un po' di energia prima di cercare di inserire nuovo contenuto. Preferisco concentrarmi sulla qualità piuttosto che sulla quantità, al costo di dover aspettare molto di più per un nuovo rilascio.</p>
<p>Quindi possiamo dire.</p>
<p>Vi sarà una versione Epub <del>in un futuro prossimo</del>.</p>
<p>Vi saranno edizioni Lua e C# <del>in un futuro prossimo</del>.</p>
<p>Semplicemente non ora.</p>
<p>Lavorerò per ridurre l'ammontare di LaTeX e migliorare la compatibilità ed abbassare la barriera d'entrata per chi vuole contribuire, rendendo il libro più "universale" e semplicemente migliore.</p>
<p>Questo progetto ha un pochino di fama, nel suo piccolo, alcune persone l'hanno aggiunto alle proprie "collezioni" di Itch, i download quotidiani sono "bassi" ma non sono costantemente a zero.</p>
<p>Purtroppo non penso questa fama sia "sufficiente" per permettermi di "raddoppiare il mio carico di lavoro" (creando ulteriori edizioni). Potrebbe essere che in questo momento sia il mio perfezionismo a parlare, ma voglio veramente veder crescere questo progetto.</p>
<p>Su GitHub questo progetto è bloccato attorno alle 45 stelle (7 su GitLab) ed al momento non si muove da lì.</p>
<p>Personalmente credo che questo sia un buon progetto. Davvero. Mi sto ripetendo, ma voglio vedere questo progetto crescere, e magari in futuro vedere qualcuno pubblicare il proprio primo videogioco e dire "Ho iniziato da qui, da questo libro".</p>
<h3>Cosa puoi fare</h3>
<p>L'unica cosa che posso chiedere è, se vuoi, di prendere un attimo di tempo e diffondere questo progetto. Non costa nulla ed ha effetti enormi, tali effetti li ho già visti.</p>
<p>Questo progetto è gratis e rimarrà gratis per sempre, vuole essere un punto di partenza per chiunque vuole creare un videogioco.</p>
<p>Concludo questo post con il link alla pagina Itch ufficiale del libro.</p>
<p><a href="https://itch.io/game/summary/688065">Link alla pagina Itch.io del libro</a></p>
<p>Se avete suggerimenti, inviatemi pure un tweet o aprite una Issue su GitHub, i miei social sono in fondo al blog.</p>
<p>Grazie per aver letto questo lungo discorso vuoto, e se avete deciso di diffondere il progetto, vi ringrazio il doppio.</p>
<p>Penaz.</p>"2DGD_F0TH": Poll results, analysis and thoughts2021-02-10T00:00:00+01:002021-02-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-02-10:/en/misc/2DGD_F0TH_3.html<p>In this post I will take a look at the results of the twitter polls, and discuss some problems that arose and will probably have to take back my word.</p><h2>In this post I will take a look at the results of the twitter polls, and discuss some problems that arose and will probably have to take back my word.</h2>
<p>This is a follow up to a previous post: <a href="https://penazarea.altervista.org/en/misc/2DGD_F0TH_2.html">check out "2D Game Development: From Zero To Hero - 2 years later"</a> first.</p>
<p>There are very few things I despise more than having to take my word back. I always strive to deliver on what I promise, sometimes to a fault.</p>
<p>This time, I have to take back my word, at least partially, and here I will explain why.</p>
<p><strong>Be aware:</strong> this post will contain technical jargon, I will try to simplify as much as possible, but I may fail.</p>
<h3>The polls</h3>
<p>On January 26th, I decided to open a couple of 7-day-long polls to understand what people were expecting from the project in its near future.</p>
<p>The first question was about the format: I asked what format people preferred the book to be published in among these:</p>
<ul>
<li>PDF (27.3%)</li>
<li>EPub (18.2%)</li>
<li>Both EPub and PDF (54.5%)</li>
<li>Online (0%)</li>
</ul>
<p>As you can see over half of the people who voted (11 to be precise), would like to see both a PDF and an EPub Release.</p>
<p>The second question was about what should the next "edition" cover, to see what language I should cover next:</p>
<ul>
<li>Lua (60%)</li>
<li>C# (40%)</li>
<li>Something else (0%)</li>
</ul>
<p>As we can see, Lua won with 60% of the votes (sadly only 5 people voted on this poll).</p>
<h3>The languages</h3>
<p>I know a fair number of languages, including C++, Python and Java, but I cannot possibly know them all.</p>
<p>Lua is a bit in a weird position: I can read it, I can do small things with it (some filters I use to produce the book are written in Lua), but I'm not a "Lua expert" by any means.</p>
<p>Lua is also quite a peculiar programming language: it has no class system, but it does have quite powerful metaprogramming capabilities (so if you wanted, you could make a "class system" from scratch), it has a powerful complex type called "tables".</p>
<p>Translating the current code in Lua would be quite a big and complex matter for me.</p>
<p>I'm a total newbie at C#, I started learning it in the past, hoping to get some new knowledge and spark some new will to learn. Sadly I stopped.</p>
<p>Making a C# edition would be a good excuse for me to learn C# again, but it would be a big task nonetheless.</p>
<h3>The formats</h3>
<p>This is another sore point of the project: as of now (and the foreseeable future) an EPub edition is not possible.</p>
<p>There are multiple reasons and I will explain them one after the other.</p>
<h4>Embedded PDFs</h4>
<p>To maintain crisp images throughout the book, I decided to make use of "Vector PDF" files, that allow the user to zoom into the images as much as they want without looking pixelated.</p>
<p>On the Calibre ebook reader those images are not shown, and I get a lot of console errors due to "sandboxing". I didn't delve further into the matter.</p>
<div class="codehilite"><pre><span></span><code>ERROR: clbr://internal.sandbox/book/__index__:0: Failed to load <span class="s1">'clbr://internal.sandbox/book/EPUB/media/file1.pdf'</span> as a plugin, because the frame into which the plugin is loading is sandboxed.
</code></pre></div>
<h4>Math Formulas</h4>
<p>Another problem that pops out is due to math: some pieces of LaTeX math I used are not recognized and cannot be converted to MathML:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span>WARNING<span class="o">]</span> Could not convert TeX math <span class="s1">'180\degree'</span>, rendering as TeX:
<span class="m">180</span><span class="se">\d</span>egree
</code></pre></div>
<p>This is a simple example, but matrices and other math is affected, either due to the use of <code>\degree</code>, <code>\textcolor</code> or <code>\bcancel</code>.</p>
<p>These errors don't stop the build, but leave a broken ebook, with missing parts.</p>
<h4>Embedded LaTeX and Dynamic Code Listings</h4>
<p>There have been some situations where I really needed something (like a table) made exactly a certain way, and I didn't want to just make an image out of it, so I decided to just embed LaTeX code inside the Markdown document.</p>
<div class="codehilite"><pre><span></span><code><span class="k">\begin</span><span class="nb">{</span>table<span class="nb">}</span>[H]
<span class="k">\centering</span>
<span class="k">\caption</span><span class="nb">{</span>Karnaugh Map for A XOR B<span class="nb">}</span>
<span class="k">\begin</span><span class="nb">{</span>tabular<span class="nb">}{</span>|c c|c c|<span class="nb">}</span>
<span class="k">\hline</span>
<span class="nb">&</span> <span class="nb">&</span> <span class="k">\multicolumn</span><span class="nb">{</span>2<span class="nb">}{</span>c|<span class="nb">}{</span>A<span class="nb">}</span><span class="k">\\</span>
<span class="nb">&</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>0<span class="nb">}</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>1<span class="nb">}</span><span class="k">\\</span>
<span class="k">\hline</span>
<span class="k">\multirow</span><span class="nb">{</span>2<span class="nb">}{</span>*<span class="nb">}{</span>B<span class="nb">}</span> <span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>0<span class="nb">}</span> <span class="nb">&</span> 0 <span class="nb">&</span> 1 <span class="k">\\</span>
<span class="nb">&</span> <span class="k">\textbf</span><span class="nb">{</span>1<span class="nb">}</span> <span class="nb">&</span> 1 <span class="nb">&</span> 0<span class="k">\\</span>
<span class="k">\hline</span>
<span class="k">\end</span><span class="nb">{</span>tabular<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>table<span class="nb">}</span>
</code></pre></div>
<p>This is not a problem when it comes to render a PDF document: the Markdown document gets converted to LaTeX anyway and the inline LaTeX I wrote just gets passed through.</p>
<p>The problem comes when I have to publish to EPub: the LaTeX gets completely ignored and scrapped. Leaving nothing behind.</p>
<p>This also happens for another huge feature of this project: the dynamic code listings. To be able to quickly build all the editions, I created a LaTeX command:</p>
<div class="codehilite"><pre><span></span><code><span class="k">\code</span><span class="nb">{</span>filename<span class="nb">}{</span>caption<span class="nb">}</span>
</code></pre></div>
<p>Meaning the great majority of (if not all) code listings are missing in the "draft EPub".</p>
<h3>Further issues</h3>
<p>Along with these problems, some may have noticed that the Travis build of this book is failing. I cannot pinpoint the cause of it, so every time I release the book I have to manually upload the releases on GitHub.</p>
<p>I have been thinking of dropping the GitHub Releases and GitLab Artifacts in favor of just using Butler to push on Itch.io.</p>
<h3>Time to take back my word</h3>
<p>Here comes the hard part for me: I have to scale back on my plans. And this entails me "taking back my word".</p>
<p>As much as I wish to release an EPub "branch" of this ebook, this won't be possible in the near future. Lots of things need to be reworked, a new template should be built, as well as its CSS and front matter.</p>
<p>Sadly there won't be a Lua or C# Edition either. I don't know enough of the languages yet, and I do not have the time (and most of all, willpower) to learn them at the moment: work is not being kind to me, and being a software developer, I don't really look forward to see more code when I'm off.</p>
<h3>The future of the project</h3>
<p>The project is currently on a hiatus: as I said, work is not being kind to me, and I just try to gather back some energy before pushing for more content. I'd rather focus on quality over quantity, even at the cost of waiting a lot more for a new release.</p>
<p>So we may just say:</p>
<p>There will be an EPub release in the <del>near</del> future.</p>
<p>There will be both Lua and C# releases in the <del>near</del> future.</p>
<p>Just not now.</p>
<p>I will be working to reduce the amount of LaTeX and improve compatibility and lower the barrier of entry for contributors, making the book more "universal" and just better.</p>
<p>This project has gained a bit of traction, some people added it to their "collection" on itch, daily downloads are "low" but not zero.</p>
<p>Sadly I don't believe this is quite "enough" traction to warrant essentially "doubling my workload" (by creating more editions) for it. It may be just my perfectionism speaking, but I really want to see this project grow.</p>
<p>On GitHub this project is stuck around 45 stars, (7 on GitLab) and it's currently plateauing.</p>
<p>I personally believe this is a good project. I truly do. I am repeating myself, but I want to see this project grow and maybe, just maybe, in the future see someone publish their first game and say "I started from here, from this book".</p>
<h3>What can you do</h3>
<p>The only thing I can ask for is, if you want, take the time and spread word about the project. It's free and goes a long way, I already saw the effects of it.</p>
<p>This project is free and will remain free forever, it is meant to be a starting point for anyone who wants to make a game.</p>
<p>I conclude this post with the link to the ebook's official Itch page.</p>
<p><a href="https://itch.io/game/summary/688065">Link to the Itch.io page of the book</a></p>
<p>And if you have any suggestion, feel free to send me a tweet or open a GitHub issue, my socials are in the footer of this blog.</p>
<p>Thank you for reading this long, drawn-out rant, and if you decided to spread word about the project, thank you twice as much.</p>
<p>Penaz.</p>Game Bytes: Darksiders 32021-02-08T00:00:00+01:002021-02-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-02-08:/game-bytes/Game_Bytes_Darksiders_3.html<p>Guerra è (ancora!) nei guai, vestiamo i panni di Furia e... Giochiamo ad un souls-like?</p><h2>Guerra è (ancora!) nei guai, vestiamo i panni di Furia e... Giochiamo ad un souls-like?</h2>
<p>Darksiders 3 è un gioco in stile hack&slash in terza persona sviluppato da Gunfire Games e pubblicato da THQ Nordic, dove vestiamo i panni di Furia con l'obiettivo di eliminare i sette peccati capitali.</p>
<h3>Grafica</h3>
<p>La grafica è fantastica! Gli effetti speciali sono interessanti, gli ambienti sono ben disegnati ed il gioco ha un buon supporto per tutti i tipi di risoluzione, senza grossi problemi.</p>
<h3>Setup e prestazioni</h3>
<p>Installare il gioco tramite Steam è veloce e facile, le prestazioni sono buone con una risoluzione di 2560x1440 e qualità alta.</p>
<h3>Comparto sonoro</h3>
<p>I suoni sono ben fatti e riprodotti senza latenze o salti. I campioni usati sono di alta qualità e si sincronizzano bene con il gioco.</p>
<p>Alcune volte il doppiaggio è un po' impacciato, soprattutto all'inizio, migliora di molto man mano che procediamo col gioco.</p>
<p>Nel complesso, una buona esperienza.</p>
<h3>Gameplay</h3>
<p>E qui casca l'asino. Il gioco inizia con una difficoltà un po' troppo alta, ed i controlli sono leggermente scomodi, fino a quando non ti ci abitui.</p>
<p>Inoltre il gameplay assomiglia troppo a Dark Souls: punti di salvataggio distanti tra loro e tra cui si può viaggiare, si aumenta di livello usando anime, il combattimento si basa pesantemente sui contrattacchi (ma con molta meno strategia), nessuna mappa, ambienti molto contorti e "verticali"...</p>
<p>Inoltre penso che nel comparto armi abbiamo avuto un peggioramento rispetto a Darksiders 2: le armi generate proceduralmente sono sparite, invece abbiamo una "arma base" (la frusta) e possiamo scegliere una tra le 4 armi secondarie (a seconda della "forma" selezionata).</p>
<p>Ogni forma ha i propri punti di forza ed usi, concentrandosi molto sul movimento.</p>
<p>Oltre a questo, quando ci si abitua ai controlli, Furia è agile e molto mobile ed il gioco diventa veramente divertente.</p>
<h3>Extra: Furia</h3>
<p>Ciò che ho gradito di più è l'evoluzione di Furia nel corso della storia.</p>
<p>Sono rimasto alquanto sorpreso nel vedere un personaggio principale, che onestamente odiavo all'inizio, crescere fino a diventare qualcuno di totalmente diverso (caratterialmente).</p>
<p>Penso questo sia la parte migliore del gioco.</p>
<h3>Conclusioni</h3>
<p>Il gioco è abbastanza nuovo, e soffre di un po' di "Invidia" verso Dark Souls, le meccaniche potrebbero sembrare un po' rigide e semplicemente "copiate" dal famoso gioco di "From Software".</p>
<p>Penso che questo gioco non meriti le critiche ricevute, non è un gioco "eccellente", ma è sicuramente un gioco molto buono.</p>
<p>Come al solito, il punteggio assegnato al gioco va da 0 (questo è l'ottavo peccato capitale) a 100 (questo gioco potrebbe far risorgere l'umanità).</p>
<p>Penso un punteggio giusto sia <strong>82/100</strong>, dritto nel mezzo tra i punteggi di Darksiders e Darksiders 2.</p>
<p>Ora ci serve solo un quarto gioco che completi la storia, magari un gioco in cooperativa a 4 giocatori con un'opzione che consenta di giocarlo in giocatore singolo, giocando ogni storia separatamente...</p>
<p>Giusto, THQ?</p>
<p>Questo conclude la serie di post dedicata a Darksiders, se volete vedere gli altri post, cliccate i seguenti link:</p>
<ul>
<li><a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders.html">Link alla recensione di Darksiders: Warmastered Edition</a></li>
<li><a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders_2.html">Link alla recensione di Darksiders 2: Deathinitive Edition</a></li>
</ul>
<p>Grazie a tutti per aver letto, ci si vede al prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders 3"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "82",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders 32021-02-08T00:00:00+01:002021-02-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-02-08:/en/game-bytes/Game_Bytes_Darksiders_3.html<p>War is (still!) in trouble, let's take on the role of Fury and... play a Souls-like?</p><h2>War is (still!) in trouble, let's take on the role of Fury and... play a Souls-like?</h2>
<p>Darksiders 3 is a 3rd person hack&slash game developed by Gunfire Games and published by THQ Nordic where we take on the role of Fury to take down the seven deadly sins.</p>
<h3>Graphics</h3>
<p>The graphics are great! The special effects are very entertaining, the environments are well designed and the game has good support for all kinds of resolutions, without much trouble.</p>
<h3>Setup and performance</h3>
<p>Installing the game via Steam is fast and easy, we have good performance with 2560x1440 resolution and high quality.</p>
<h3>Sound</h3>
<p>Sounds are well done, played without skipping or latency. The samples are high quality and synchronize well with the gameplay.</p>
<p>Sometimes the voiceover is a bit awkward, mostly at the beginning, it gets a lot better further into the game.</p>
<p>A good experience all around.</p>
<h3>Gameplay</h3>
<p>This is where we hit a snag. The game starts a bit too hard, and the controls are a bit awkward, until you get used to them.</p>
<p>Also the gameplay is a bit too much like Dark Souls: there are savepoints far from one another and you can travel between them, you level up by using souls, fighting is heavily based on counter-attacks (but a lot less strategic), no map, very twisty and "vertical" ambients...</p>
<p>Also I think the weapons are a step back from Darksiders 2: the procedurally generated weapons are gone, instead we have a "basic weapon" (the whip) and we can choose one between 4 secondary weapons (depending on the selected "hollow form").</p>
<p>Each form has its strength and uses, focusing a lot on movement around the map.</p>
<p>Besides this, when you get used to the controls, Fury feels nimble and very mobile and the game starts being really fun.</p>
<h3>Extra: Fury</h3>
<p>What I really liked the most is Fury's evolution throughout the story.</p>
<p>I was a bit surprised to see a main character, that I honestly despised at the beginning, being fleshed out to become someone totally different (as in behaviour).</p>
<p>I think this is the best part of the game.</p>
<h3>Conclusions</h3>
<p>This game is quite new, and suffers from a bit of "Envy" towards Dark Souls, the mechanics may seem a bit stiff and just "copied" from the famous game from "From Software".</p>
<p>I think the game doesn't deserve wave the criticism it has gotten, it is not an "excellent" game, but it is a very good one for sure.</p>
<p>As usual, the score assigned to this game goes from 0 (this is the 8th deadly sin) to 100 (this game could resurrect all humans).</p>
<p>I think a fair score is <strong>82/100</strong>, smack in the middle between Darksiders and Darksiders 2.</p>
<p>Now we just need a 4th game to wrap up the story, maybe a 4-player cooperative game with a single-player option where we play each story separatedly...</p>
<p>Right THQ?</p>
<p>This concludes the series of posts dedicated to Darksiders, if you want to see the other posts, just click the following links:</p>
<ul>
<li><a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders.html">Link to Darksiders: Warmastered Edition's Review</a></li>
<li><a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders_2.html">Link to Darksiders 2: Deathinitive Edition's Review</a></li>
</ul>
<p>Thank you everyone for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders 3"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "82",
"worstRating": "0",
"bestRating": "100"
}
}
</script>2D Game Development: From Zero To Hero - 2 anni dopo2021-01-26T00:00:00+01:002021-01-26T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-26:/misc/2DGD_F0TH_2.html<p>Sono passati quasi 2 anni dal primo rilascio di questo libro: lamentiamoci riguardo le speranze, esperienze e piani futuri.</p><h2>Sono passati quasi 2 anni dal primo rilascio di questo libro: lamentiamoci riguardo le speranze, esperienze e piani futuri.</h2>
<p>Il 13 Maggio 2019 ho posato la prima pietra di un progetto che volevo veder crescere. Volevo creare il libro che avrei voluto avere quando ho iniziato ad imparare l'arte dello sviluppo di videogiochi. Questo progetto è "2D Game Development: From Zero To Hero", del quale ho parlato in un <a href="https://penazarea.altervista.org/misc/2DGDF0TH.html">precedente post del 2019</a></p>
<p>Il piano era molto semplice: avviare il progetto con un linguaggio di markup che fosse semplice da imparare, usare e modificare, così che chiunque potesse contribuire con le proprie conoscenze.</p>
<p>L'obiettivo era quello di raccogliere la conoscenza di una comunità dedicata allo sviluppo di videogiochi, uniti da un unico obiettivo: creare una risorsa gratuita che potesse insegnare alle persone come creare giochi in 2D, senza insegnare uno strumento specifico, ma insegnando metodi, pianificazione di progetto e dando suggerimenti e trucchi.</p>
<h3>Speranze disattese, errori e dubbi</h3>
<p>Speravo di trovare qualche buona anima che si unisse alla mia impresa di creare questo libro, qualcuno al di fuori della mia cerchia di amici (i quali ringrazio profondamente per il loro aiuto e contributo).</p>
<p>Purtroppo, tale speranza è stata disattesa, costringendomi ad una ricerca in solitaria nel tentativo di riempire i buchi lasciati ed alle volte costringendomi a lasciare dei segnaposto.</p>
<p>Ho lasciato un post nel subreddit "gamedev", nella speranza di attirare un po' di interesse verso il progetto, ma senza successo. Il post ha ottenuto una trentina di "upvote" (un numero decente), ma non ha portato un grande interesse verso il progetto.</p>
<p>Probabilmente il peggior errore che ho fatto è stato la scelta della conservazione dei dati: essendo prevalentemente un libro tecnico, ho optato per l'uso di git come sistema di versionamento, con GitLab e GitHub come repository sul cloud. Questo significa che chi vuole contribuire deve conoscere un minimo di come funziona il sistema per poter apportare modifiche.</p>
<p>Il secondo errore più grande è stato il formato, Pandoc Markdown è un formato fantastico per scrivere documentazione, ci puoi scrivere interi libri ed è semplice da leggere e scrivere (la mia Tesi universitaria è stata scritta con tale linguaggio, e sto scrivendo anche questo post usando Markdown!). Il problema è che molte persone potrebbero non conoscerlo o volerlo imparare, inoltre ho avuto la necessità di mischiarci dentro del LaTeX, impedendomi di rilasciare una versione EPub.</p>
<p>Un modo migliore per pubblicare il libro sarebbe stato, probabilmente, usando una piattaforma wikimedia, come wikibooks: questo mi avrebbe comunque consentito di creare una versione PDF, dandomi forse più visibilità e rendendo le modifiche da parte di altri più semplici.</p>
<p>Tutto ciò ovviamente mi ha messo addosso un sacco di dubbi sulla validità del progetto nella sua interezza, fino al punto in cui ho pensato che questo fosse soltanto un "esercizio di inutilità".</p>
<h3>Sorprese Piacevoli</h3>
<p>Dopo un po', ho preso coraggio ed effettuato un fork del fantastico <a href="https://github.com/EbookFoundation/free-programming-books">Repository "Free Programming Ebooks" di EbookFoundation</a> ed aggiunto "2D Game Development: From Zero to Hero" come libro "in produzione".</p>
<p>Il libro è stato accettato e poco dopo ho trovato una nuova "issue" aperta nel repository di GitHub da parte di <a href="https://github.com/eshellman">Eric Hellman</a>, presidente della Ebook Foundation, con dei suggerimenti su come rendere migliore il libro e come navigare nel linguaggio legalese della licenza Creative Commons ed altri suggerimenti generalmente fantastici.</p>
<p>Prendo questo paragrafo per ringraziare dal profondo del mio cuore Eric Hellman per il suo aiuto e pazienza.</p>
<p>Poco dopo, sono venuto a conoscenza di un sito chiamato <a href="https://unglue.it">unglue.it</a>, connesso alla Ebook Foundation, e "2D Game Development: From Zero to Hero" era il libro in primo piano per alcuni giorni. Ora il libro ha pa propria <a href="https://unglue.it/work/441810/">pagina dedicata su unglue.it</a>, anche se non è aggiornata.</p>
<p>Un po' di tempo dopo tali accadimenti, ho deciso di pubblicare il libro su <a href="https://itch.io">itch.io</a>, ed è entrato a far parte della top 100 dei libri "nuovi e popolari" in relativamente poco tempo, ed ora è al 61mo posto nella categoria "libri popolari".</p>
<p>Il libro ha al momento 600 downloads su unglue, oltre 500 downloads su Itch (la versione C++ è la più scaricata) e 3 valutazioni. Purtroppo non mi è possibile tracciare i download diretti da GitLab e GitHub.</p>
<p>Parlando di GitHub, il progetto sta attorno alle 45 "stars" (che sono <strong>molte di più</strong> di qualunque altro mio progetto), con 3 fork (attualmente inattivi).</p>
<h3>Piani Futuri</h3>
<p>Lua! Questa è la prima cosa che mi viene in mente, vorrei veramente tradurre i listati di codice del libro in Lua, e creare un'ulteriore edizione con quello che è probabilmente (dopo C++) uno dei linguaggi più usati nello sviluppo di videogiochi.</p>
<p>Lua è usato come linguaggio di scripting nei videogiochi, oltre che linguaggio principale del motore <a href="https://love2d.org/">LÖVE</a>, di cui ho parlato molto tempo fa in un post dedicato: <a href="https://penazarea.altervista.org/gratis-sul-web/Love.html">Love: Un framework per la creazione di videogiochi 2D</a>. Perciò penso questo possa essere un'aggiunta molto apprezzata.</p>
<p>Un'altra edizione che potrebbe essere molto apprezzata è un'edizione dedicata al linguaggio C#, perchè è il linguaggio usato dal motore Unity.</p>
<p>I miei piani futuri includono portare il libro ad uno stato che ne consenta l'esportazione in formato EPub, se la comunità lo vuole (infatti creerò un sondaggio su Twitter al riguardo).</p>
<p>Prevedo inoltre di aprire ulteriori possibilità di interazione con la pagina di itch.io, attivando funzionalità simili a forum, invece di lasciare solo una sezione commenti.</p>
<h3>Conclusioni</h3>
<p>È stato un viaggio lungo e non ne vedo ancora la fine, spero vivamente che in futuro qualcuno si unisca a me in quest'impresa, in quanto ritengo che lo sviluppo di videogiochi sia un modo incredibile di esprimere la creatività di qualcuno e chiunque dovrebbe poter provare a sviluppare qualcosa.</p>
<p>Avere una risorsa gratuita per cominciare è qualcosa che, nella più modesta delle mie opinioni, è estremamente preziosa in un mondo pieno di risorse a pagamento che potrebbero essere al di fuori del nostro budget o potrebbero essere "la scelta sbagliata" per una certa persona.</p>
<p>Concludo questo post con i link all'ebook.</p>
<p><a href="https://itch.io/game/summary/688065">Link Alla pagina Itch.io del libro</a></p>
<p><a href="https://gitlab.com/Penaz/2dgd_f0th">Link al repository GitLab del libro</a></p>
<p><a href="https://github.com/Penaz91/2DGD_F0TH">Link al repository GitHub del libro</a></p>
<p>Grazie a tutti per aver letto questo lungo post (leggete "lamentela") e ci si vede nel prossimo!</p>
<p>Penaz.</p>2D Game Development: From Zero To Hero - 2 years later2021-01-26T00:00:00+01:002021-01-26T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-26:/en/misc/2DGD_F0TH_2.html<p>Almost 2 years have passed since the first release of this book: let's rant about hopes, experiences and future plans.</p><h2>Almost 2 years have passed since the first release of this book: let's rant about hopes, experiences and future plans.</h2>
<p>The 13th of May 2019 I put the first building block of a project I really wanted to see grow. I wanted to make the book I wish I had when I was learning to make videogames. This project is "2D Game Development: From Zero To Hero", which I talked about in <a href="https://penazarea.altervista.org/en/misc/2DGDF0TH.html">a previous post from 2019</a>.</p>
<p>The plan was simple: start up the project with a markup language that was easy to learn, use and edit, so that people could easily contribute with their own knowledge.</p>
<p>The objective was grasping the knowledge of a game development community, uniting to reach a common objective: creating a free resource that would teach people how to make 2D video games, without teaching a single tool, but instead teaching methods, project planning, tips and tricks.</p>
<h3>Hopes broken, mistakes and doubts</h3>
<p>I was hoping to find some good soul that would join into the effort of making this book, someone that was outside my circle of friends (who I thank deeply for their help and contributions).</p>
<p>Sadly that hope was unfulfilled, leaving me to research and try to feel the gaps and sometimes having to leave placeholders.</p>
<p>I left a post on the "gamedev" subreddit, hoping to gather some interest over the matter, but to no avail. The post got a decent 30-ish upvotes, but that didn't really bring much interest towards the project.</p>
<p>Probably the biggest mistake I have made was the storage: being mostly a technical book, I opted to use git as versioning system, with GitLab and GitHub as cloud repositories. This means that people need to know at least a little of its workings to be able to edit.</p>
<p>Second biggest mistake was the format, Pandoc's Markdown is a great format to write documentation in, and you can write whole books in it and it's easy to read and write in (my University Thesis was written with it, and I'm writing this post using markdown!). Issue again is that many people may not know or want to learn it, and I found the need to use some inline LaTeX, stopping me from making an EPub version.</p>
<p>A better way to publish the book would have probably been using some wikimedia platform, like wikibooks: this would still allow for a PDF version to be made, while probably giving it more visibility and making editing by others easier.</p>
<p>This obviously filled me with doubt on the validity of the project as a whole, to the point of even thinking that this was an exercise in futility.</p>
<h3>Pleasant surprises</h3>
<p>After a while, I took the courage to fork the amazing <a href="https://github.com/EbookFoundation/free-programming-books">EbookFoundation's Free Programming Ebooks Repository</a> and add "2D Game Development: From Zero to Hero" as a "in process" ebook.</p>
<p>The ebook got accepted and a bit later I found an issue in the book's GitHub repository by <a href="https://github.com/eshellman">Eric Hellman</a>, president of the Ebook Foundation, giving me suggestions on how to make the book better, how to navigate the Creative Commons license and just all around a lot of great things.</p>
<p>I take a small paragraph here to thank Eric Hellman from the bottom of my heart for the help and patience.</p>
<p>After that, I found out there is a website called <a href="https://unglue.it">unglue.it</a> that is connected to the Ebook Foundation, and "2D Game Development: From Zero To Hero" was the featured book for a few days. Now the book has its own <a href="https://unglue.it/work/441810/">dedicated page on unglue.it</a>, although it's not up to date.</p>
<p>A little while after that, I decided to publish the book on <a href="https://itch.io">itch.io</a>, and it has reached the top 100 books in the "new & popular" category in relatively little time, and is currently at 61st place in the "popular" books category.</p>
<p>The book has currently 600 downloads on unglue, over 500 downloads on Itch (with the most downloaded version being the "C++ Edition") and 3 ratings. Sadly I'm not able to count the dowloads from GitLab and GitHub.</p>
<p>Talking about GitHub, the project sits at around 45 stars (which is <strong>a lot more</strong> than any of my previous projects), with 3 (currently inactive) forks.</p>
<h3>Future plans</h3>
<p>Lua! This is the first thing that comes to mind. I would love to translate the book to Lua, and make another edition with probably one of the biggest languages (after C++) when it comes to game development.</p>
<p>Lua is used as a scripting language in videogames, as well as a language for the <a href="https://love2d.org/">LÖVE</a> game engine, which I talked about long ago in a dedicated post: "Love: A 2D game development framework" (this post is available only in Italian). So I feel it would be a really appreciated edition.</p>
<p>Another edition that may be appreciated would be a C# edition, because it is the language used in the Unity engine.</p>
<p>My future plans include getting the book into a state that will allow me to export an EPub edition, if the community wants it (in fact I will do a twitter poll about that).</p>
<p>I foresee opening more interaction possibilities with the itch.io page too, by enabling the forum-like features, instead of leaving only the comment section.</p>
<h3>Conclusions</h3>
<p>This has been a long journey and there is no end in sight, I really hope in future someone will join my effort, because I think that game development is an incredible way to express someone's creativity and anyone should have a shot at it.</p>
<p>Having a free resource to start with is something that, in my most humble opinion, is extremely precious in a world filled with paid resources that may be out of someone's budget and maybe even not the right choice for a certain person.</p>
<p>I conclude this post with the links to the ebook.</p>
<p><a href="https://itch.io/game/summary/688065">Link to the Itch.io page of the book</a></p>
<p><a href="https://gitlab.com/Penaz/2dgd_f0th">Link to the GitLab repository for the book</a></p>
<p><a href="https://github.com/Penaz91/2DGD_F0TH">Link to the GitHub repository for the book</a></p>
<p>Thank you everyone for reading this overly long post (read "rant") and see you in the next one!</p>
<p>Penaz.</p>Pico8: Una piccola "fantasy console" per sfidarti nel creare videogiochi2021-01-23T00:00:00+01:002021-01-23T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-23:/coding/Pico8.html<p>Diamo un'occhiata a Pico8: una "fantasy console" dove puoi sviluppare giochi come se fossero gli anni '80 (circa).</p><h1>Diamo un'occhiata a Pico8: una "fantasy console" dove puoi sviluppare giochi come se fossero gli anni '80 (circa).</h1>
<p>Non sono uno che parla di prodotti commerciali, ma lo ammetto: quando ho sentito parlare di Pico8 per la prima volta, l'ho snobbato. Fino a quando non me lo sono ritrovato in un bundle di <a href="https://itch.io">Itch.io</a> che ho acquistato.</p>
<p>Dopo averci dato un'occhiata, ho dovuto cambiare idea al riguardo.</p>
<h2>Cos'è Pico8?</h2>
<p>Pico8 è una "fantasy virtual console" (una console virtule di fantasia), che contiene delle limitazioni arbitrarie alla propria "potenza", così che il programmatore sia forzato a trovare una soluzione alternativa (o sottostare) a tali limiti per poter avere un prodotto funzionante.</p>
<p>Le limitazioni sono molto importanti per ogni processo di sviluppo dei videogiochi: ti aiutano a mantenere la concentrazione. Se avessi "potenza illimitata", probabilmente ti ritroveresti con talmente tante idee che:</p>
<ul>
<li>non riesci a svilupparne alcuna in pieno;</li>
<li>rimani bloccato a decidere cosa fare.</li>
</ul>
<h2>L'Editor di codice</h2>
<p>Il linguaggio scelto da Pico8 è <a href="https://www.lua.org/">Lua</a>, il software include un editor integrato con colorazione della sintassi: ovviamente in stile anni '80.</p>
<p><img alt="Immagine dell'editor Lua in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/code_editor.png" /></p>
<p>Il codice ha delle limitazioni arbitrarie a 8192 token di Lua e 65535 caratteri, con alcune "cartucce" che fanno uso di algoritmi interessanti.</p>
<h2>La grafica</h2>
<p>Il software include un editor di sprites, oltre che un editor di tiles, anch'essi con delle forti limitazioni.</p>
<p><img alt="Immagine dell'editor di tiles in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/tile_editor.png" /></p>
<p>Ogni gioco può avere solo una risoluzione di 128x128 pixel, e l'editor mette a disposizione 4 "sprite sheet" che contengono al massimo 64 tile ciascuno. Le sprites possono scegliere tra 16 colori pre-definiti.</p>
<h2>Il suono</h2>
<p>Questo software include alcuni strumenti molto completi per il sound design e la creazione di musica. L'editor di suoni supporta 4 ottave, 8 volumi e 8 forme d'onda.</p>
<p><img alt="Immagine dell'editor di suoni in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/sound_editor.png" /></p>
<p>Qui possiamo trovare le forme d'onda più usate, come triangolare, quadra ed a dente di sega, oltre ad altre forme d'onda che possono rendere il gioco più ricco. A queste possiamo aggiungere 8 effetti, rendendo i suoni ancora più coinvolgenti.</p>
<p>Pico8 possiede inoltre un tracker/sequencer musicale integrato.</p>
<p><img alt="Immagine del sequencer musicale in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/tracker.png" /></p>
<p>Questo sequencer supporta al massimo 4 canali e 64 pattern, consentendo tracce musicali che possono spaziare dal molto semplice al complesso.</p>
<h2>"Splore"</h2>
<p>Pico8 si avvia mostrando una linea di comando, ma digitando il comando <code>splore</code> verremo trasportati su un'interfaccia grafica che ci consente di esplorare le "cartucce" pubblicate da altre persone.</p>
<p>Tra i miei preferiti possiamo trovare "Pico de Pon" di <a href="https://www.lexaloffle.com/bbs/?uid=11765#m">Stevelavietes</a> che ho inserito in alcune schermate.</p>
<p>Un altro nome noto che troviamo è "Celeste", un gioco che è diventato un (fantastico) gioco da sé. La versione originale è stata fatta in Pico8.</p>
<p>So già qual'è la vostra prossima domanda:</p>
<blockquote>
<p>Ma riesce a far girare Doom?</p>
</blockquote>
<p>Beh, la risposta che cercate è <a href="https://freds72.itch.io/poom">Poom</a>, che è probabilmente l'uso più stupefacente di Pico8 che ho visto finora.</p>
<h2>Conclusioni</h2>
<p>Con la possibilità di condividere le tue creazioni, oltre a poterle esportare in formati autonomi su:</p>
<ul>
<li>Linux</li>
<li>Windows</li>
<li>Mac OS</li>
<li>Raspi</li>
<li>HTML5</li>
</ul>
<p>E considerando l'ammontare di strumenti già a tua disposizione, senza essere troppo soverchiante, Pico8 potrebbe sembrare inizialmente niente più che una novità equivalente ad un fuoco di paglia.</p>
<p>Quello che vedo è invece un sistema che può essere una buona introduzione allo sviluppo di videogiochi su scala ridotta, così come una piattaforma per chi vuole sfidarsi a programmare con forti limitazioni.</p>
<p>Pico8 è stato una bella sorpresa per me, se vuoi sfidarti e conosci un po' di Lua, dovresti provarlo.</p>
<p>Ecco il <a href="https://lexaloffle.itch.io/pico-8">link a Pico8 su Itch.io</a></p>
<p>Ci si vede al prossimo post!</p>
<p>Penaz.</p>Pico8: A tiny fantasy console to challenge yourself in developing games2021-01-23T00:00:00+01:002021-01-23T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-23:/en/coding/Pico8.html<p>Let's take a look at Pico8: A fantasy console where you can develop games like it's the 80's (Kind of).</p><h1>Let's take a look at Pico8: A fantasy console where you can develop games like it's the 80's (Kind of).</h1>
<p>I'm not someone to talk about commercial products, and I will admit this: when I first heard of Pico8, I snubbed it. Until I got it with a bundle on <a href="https://itch.io">Itch.io</a>.</p>
<p>After taking a look at it, I was forced to change my mind.</p>
<h2>What is Pico8?</h2>
<p>Pico8 is a "fantasy virtual console", it is made with arbitrary limitations to its "power" so that the coder is forced to work around (or with) such limitations to be able to get a working product.</p>
<p>Limitations are a really important part of any game development process: they help keeping you focused. If you had "unlimited power", you would probably have so many ideas that you either:</p>
<ul>
<li>develop none of them to their fullest;</li>
<li>get stuck trying to decide what is best.</li>
</ul>
<h2>The Code Editor</h2>
<p>The choice language for Pico8 is <a href="https://www.lua.org/">Lua</a>, the software includes a built-in editor with syntax highlighting: obviously in an 80's style.</p>
<p><img alt="Image of the Lua editor in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/code_editor.png" /></p>
<p>The code has an arbitrary limitation of 8192 Lua tokens and 65535 characters, which can result in some "cartridges" making use of very interesting algorithms.</p>
<h2>The Graphics</h2>
<p>The software includes a sprite editor, as well as a tile editor, which have their strong limitations too.</p>
<p><img alt="Image of the tile editor in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/tile_editor.png" /></p>
<p>Each game can have only a 128x128 pixel resolution, and the editor features 4 sprite sheets that can contain up to 64 tiles each. The sprites can choose between 16 pre-defined colors.</p>
<h2>The sound</h2>
<p>This software features some really comprehensive tools for sound design and music editing. The sound editor features 4 octaves, 8 volumes and 8 waveforms.</p>
<p><img alt="Image of Sound editor in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/sound_editor.png" /></p>
<p>Here we can find the most used waveforms, like triangle, square and sawtooth, along with some different ones that may make the games richer. To this we can add 8 effects, making the sound more engaging.</p>
<p>Pico8 also features a built-in music sequencer/tracker.</p>
<p><img alt="Images of the Music Sequencer in Pico8" src="https://penazarea.altervista.org/Programming/images/pico8/tracker.png" /></p>
<p>This sequencer supports at most 4 channels and 64 patterns, this allows for scores that can go from really simple to complex.</p>
<h2>"Splore"</h2>
<p>Pico8 starts showing a command line, but if we type the <code>splore</code> command we will be taken to a GUI that will allow us to explore all the published "cartridges" by other people.</p>
<p>Among my favourites we can find "Pico de Pon" by <a href="https://www.lexaloffle.com/bbs/?uid=11765#m">Stevelavietes</a> which i featured in some screenshots.</p>
<p>Another notable name we can find is "Celeste", a game which went on to become a (great) game of its own. The original version was made in Pico8.</p>
<p>I know what your next question is:</p>
<blockquote>
<p>Can it run Doom?</p>
</blockquote>
<p>Well, I think the answer you're looking for is <a href="https://freds72.itch.io/poom">Poom</a>, which is probably the most amazing thing done with Pico8 so far.</p>
<h2>Conclusions</h2>
<p>With the possibility to share your creations, as well as export in standalone formats on:</p>
<ul>
<li>Linux</li>
<li>Windows</li>
<li>Mac OS</li>
<li>Raspi</li>
<li>HTML5</li>
</ul>
<p>And considering the amount of tools you already have at your disposal, without being too overbearing, Pico8 may initially seem a small novelty and nothing more.</p>
<p>What I actually see is a system that can be a good introduction to small-scale game development, as well as a platform ready to challenge who wants to code with strict limitations.</p>
<p>Pico8 has been a nice surprise for me, and if you want to challenge yourself and know a bit of Lua, you should try it.</p>
<p>Here's the <a href="https://lexaloffle.itch.io/pico-8">link to Pico8 on Itch.io</a></p>
<p>See you in the next post!</p>
<p>Penaz.</p>Game Bytes: ZenoDyne R2021-01-19T00:00:00+01:002021-01-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-19:/game-bytes/Game_Bytes_ZenoDyne_R.html<p>Preparate i credits, scegliete la vostra nave e provate a sopravvivere in questo bullet hell veramente divertente!</p><h2>Preparate i credits, scegliete la vostra nave e provate a sopravvivere in questo bullet hell veramente divertente!</h2>
<p>ZenoDyne R è uno sparatutto a scorrimento verticale in stile anni '90, e secondo capitolo della serie "Zeno" (che include ZenoHell e ZenoDeath).</p>
<p>A dire il vero è un remake del ZenoDyne originale, con alcune modifiche apportate dopo aver ricevuto un po' di critiche.</p>
<h2>Grafica</h2>
<p>La grafica di ZenoDyne mi ricorda un po' Paint, ma siamo ben distanti dall'avere una grafica semplicistica: qui si parla di grafica veramente bella e così nitida che più nitida non si può.</p>
<p>I proiettili sono ben visibili, e quelli che (come i missili) potrebbero non essere ben visibili, sono circondati da un'aura viola. In questo modo, insieme alla hitbox della nave molto piccola, si rende molto difficile l'essere colpiti di sorpresa.</p>
<h2>Setup e prestazioni</h2>
<p>L'installazione, fatta tramite il client Itch.io è veloce ed indolore. Le prestazioni sono buone, senza alcun calo di frame. L'unica cosa di cui lamentarsi è la dimensione predefinita della finestra, troppo piccola per i miei gusti, ma tranquillamente modificabile dalle opzioni.</p>
<p>Complimenti agli sviluppatori per aver specificato che il gioco funziona bene sotto Wine per "voi cari utenti Linux". L'ho testato e funziona come se stesse girando nativamente sotto una macchina Windows.</p>
<h2>Comparto Sonoro</h2>
<p>Il comparto sonoro ci mette davanti ad una soundtrack molto intrigante, basata sul suono del chip YM2612 (il chip usato nella Sega Genesis/MegaDrive), questa va a complementare il gioco in maniera fantastica.</p>
<p>Gli effetti sonori sono soddisfacenti e "croccanti". Nulla di cui lamentarsi qui!</p>
<h2>Gameplay</h2>
<p>Il gameplay è nel classico stile "bullet hell", si spara ad orde di navi nemiche mentre si schivano pattern di proiettili che sono tanto belli a vedersi quanto letali, fino a quando non si incontra un boss.</p>
<p>Ogni nave è ben differenziata dalle altre ed ha una piccola storia allegata, inoltre ogni nave ha due modalità di fuoco uniche, consentendo un po' di strategia in tempo reale al riguardo di quale modalità vuoi usare.</p>
<p>Un'altra caratteristica interessante sono i "Tech Points": questi vengono assegnati a seconda delle tue prestazioni nel livello, con bonus per:</p>
<ul>
<li>Aver terminato un livello senza usare "continues"</li>
<li>Aver ucciso tutti i mini-boss</li>
<li>Aver terminato un livello senza mai morire</li>
</ul>
<p>I "Tech Points" sono automaticamente usati nella "unlock list" per ricompensarti con nuovi tipi di navi, storia o addirittura vite o continue aggiuntivi per il tuo prossimo tentativo. Questo rende il gioco tanto più accessibile quanto più lo si gioca.</p>
<p>Questo gioco inoltre ha una modalità "Normale" per i giocatori alle prime armi, ed una modalità "arcade" per gli esperti. Tali modalità differiscono per l'ammontare di punti necessari per una vita extra ed il fatto che la "modalità Arcade" ha delle "strade" selezionabili che permettono di variare il gameplay.</p>
<h2>Conclusione</h2>
<p>Questo gioco è semplicemente divertente, e molto molto molto difficile!</p>
<p>È sufficientemente semplice da non essere "soverchiante" ma abbastanza complesso da consentire una grande rigiocabilità ed è semplicemente uno di quei giochi a cui voglio tornare quando non so cosa giocare (un altro è VVVVVV).</p>
<p>Un certo gioco (<a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Raiden_V.html">Raiden V</a>) potrebbe imparare una cosa o due da questa piccola gemma (si, sono ancora arrabbiato con quel gioco).</p>
<p>Come al solito il punteggio va da 0 a 100. Questo gioco si merita un buon <strong>82/100</strong>, con acuni difettucci qui e li, ma merita decisamente una prova se vi piace il genere.</p>
<p>Grazie per aver letto. Ci vediamo nel prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Shoot-em-up",
"name": "ZenoDyne R"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "82",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: ZenoDyne R2021-01-19T00:00:00+01:002021-01-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-19:/en/game-bytes/Game_Bytes_ZenoDyne_R.html<p>Ready your credits, Choose your ship and try to survive this bullet hell that is just a lot of fun!</p><h2>Ready your credits, Choose your ship and try to survive this bullet hell that is just a lot of fun!</h2>
<p>ZenoDyne R is a 90's style, vertical scrolling, shoot-em-up and second chapter of the "Zeno Series" (Including ZenoHell and ZenoDeath).</p>
<p>It is actually a remake of the original ZenoDyne, with some tweaks after receiving some criticism.</p>
<h2>Graphics</h2>
<p>ZenoDyne's graphics remind me a bit of MS Paint, but they are nothing close to simplistic: they feature beautiful art and are as crisp as they can get.</p>
<p>Bullet's are well visible, and the ones (like missiles) that may not be as visible, have a purple aura surrounding them. This, in conjunction with a very small ship hitbox, makes it very hard to get hit unfairly.</p>
<h2>Setup and Performance</h2>
<p>The setup, done via the Itch.io client is fast and painless. There is good performance, with no frame drops. The only thing to complain about is that the default screen size is way too small for my comfort, but it is easily changeable in the settings.</p>
<p>Props to the developers for specifying that the game works well under Wine for "you dear Linux users". I tested it and it works like it was running on a native Windows sytem.</p>
<h2>Sound</h2>
<p>The sound features a very intriguing YM2612 (the chip used in the Sega Genesis/Megadrive) soundtrack that is a great complement to the game itself.</p>
<p>The sound effects are crunchy and satisfying. No complaints here!</p>
<h2>Gameplay</h2>
<p>The gameplay is in the usual style of a "bullet hell" game, you shoot down hordes of ships while avoiding beautiful and deadly bullet patterns until you meet a boss.</p>
<p>Each ship is well differentiated from the others and has a small lore attached, furthermore each ship has two unique fire modes, allowing for some real-time strategies based on which mode you want to use.</p>
<p>Another interesting feature is "Tech Points": these are awarded according to your performance on the level, with bonuses for:</p>
<ul>
<li>Finishing a stage without using a continue</li>
<li>Killing all mid-bosses</li>
<li>Finishing a stage without dying</li>
</ul>
<p>Tech points are automatically used in the "unlock list" to award you with new ship types, lore text or even additional lives or continues on your next playthrough. This makes for a game that becomes more accessible the more you play it.</p>
<p>The game also features a "normal" game mode for casual players and an "arcade" mode for experts, which differ in how many points you need to get an extra life and the fact that "arcade mode" features selectable paths that change up the gameplay.</p>
<h2>Conclusion</h2>
<p>This game is just fun, and very very very hard!</p>
<p>It is simple enough to not feel "overbearing" but complex enough to allow for great replayability and it's just something I want to go back when I don't know what to play (another one is VVVVVV).</p>
<p>A certain game (<a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Raiden_V.html">Raiden V</a>) could learn a thing or two from this little gem (yes, I'm still mad at that game).</p>
<p>As usual the score goes from 0 to 100. And this game deserves a good <strong>82/100</strong>, with some blemishes here and there, but definitely worth a try if you like the genre.</p>
<p>Thank you for reading. See you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Shoot-em-up",
"name": "ZenoDyne R"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "82",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Raiden V Director's Cut2021-01-14T00:00:00+01:002021-01-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-14:/game-bytes/Game_Bytes_Raiden_V.html<p>Fatti strada tra ondate di nemici con il tuo potentissimo velivolo mentre il centro di comando NON RIESCE A STAR ZITTO.</p><h1>Fatti strada tra ondate di nemici con il tuo potentissimo velivolo mentre il centro di comando NON RIESCE A STAR ZITTO.</h1>
<p>Ci sono un sacco di cose che la gente può dire nella propria vita, ma sono abbastanza sicuro che "Gioco agli sparatutto perchè mi piace la storia" non sia tra queste.</p>
<p>Raiden V Director's Cut è uno sparatutto sviluppatto da MOSS e pubblicato internazionalmente da UFO Interactive (la pubblicazione in Giappone è gestita da MOSS). È parte dell'amata serie Raiden che ha avuto inizio nel 1990 nelle macchine arcade.</p>
<h2>Grafica</h2>
<p>La grafica 3D è ottima e ben curata, gli effetti speciali sono fantastici ed è una vera soddisfazione vedere i boss esplodere in maniera spettacolare.</p>
<p>Data la varietà delle ambientazioni, a volte i proiettili sono veramente difficili da vedere; la situazione peggiora quando lo sfondo si muove molto in fretta. Questo tende ad essere una forte distrazione e rende il gioco molto meno godibile.</p>
<p>Avrei preferito una minore saturazione degli sfondi, oltre ad un minor movimento di essi, in favore di una miglior giocabilità.</p>
<h2>Setup and Performance</h2>
<p>Installare il gioco tramite Steam è assolutamente indolore, le prestazioni sono buone, non noto alcun calo di frame evidente ad alte risoluzioni.</p>
<h2>Comparto Sonoro</h2>
<p>I suoni sono eccellenti, con buona qualità e vengono riprodotti senza latenze.</p>
<p>La musica è molto buona, ma alcune tracce danno una sensazione di genericità che riduce il "valore percepito" del gioco.</p>
<h2>Gameplay</h2>
<p>Il gameplay è il classico sparatutto a scorrimento verticale con alcune differenze che sono più o meno benvenute in questo gioco.</p>
<p>Un grande punto di forza è la possibilità di scegliere il proprio velivolo e la possibilità di decidere come le 3 armi andranno a funzionare, scegliendo tra 3 modalità diverse per arma. Questo aumenta la rigiocabilità ed aggiunge uno strato di personalizzazione e varietà.</p>
<p>Il "sistema a vite" è rimpiazzato da una "barra scudo", questo consente ai giocatori di sopportare più di un colpo senza perdere il proprio punteggio. Questo è contro pesato dalla presenza di una sola "vita" prima che ci venga chiesto di "continuare" e perdere il nostro punteggio.</p>
<p>"Flash Point" è un'altra novità carina, è un mero moltiplicatore che si scarica lentamente se non uccidi nemici. È un grande aiuto quando si vuole arrivare in alto nella classifica, dato che questo gioco ha una componente multigiocatore.</p>
<p>La componente multigiocatore è ulteriormente rafforzata dal sistema "Cheer", che consente ai giocatori di "complimentarsi" con altri quando questi sbloccano un achievement. I "cheer" vanno ad accrescere la barra del "cheer call", che può essere usato quando ci si trova in una brutta situazione: tutti i proiettili nemici vengono cancellati, e le sub-armi vengono temporaneamente potenziate.</p>
<p>In confronto all'altro gioco della serie Raiden che ho giocato (Raiden II), esiste solo un tipo di bomba "pulisci-schermo" che genera un'esplosione generica con alcuni raggi. Questo delude fortemente il bambino che è in me.</p>
<h2>Extra: Storia</h2>
<p>E qui arriviamo alla più grossa lamentela che ho nei confronti di questo gioco, vengo messo di fronte a quello che lentamente si rivela essere un <strong>gigantesco muro di testo</strong>. Con tanto di voce fuoricampo.</p>
<p>Non ho alcun problema con il concetto di "spiegare cosa sta succedendo", o addirittura di avere una storia in uno sparatutto, ma c'è un punto oltrepassato il quale è semplicemente ridicolo.</p>
<p>Il gioco ha finali multipli, che può essere visto come un bene ed un male: i finali multipli aumentano la rigiocabilità, ma si vanno ad aggiungere ad un gioco che beneficerebbe molto da diverse semplificazioni.</p>
<p>Per l'intera durata del gioco, il centro di comando si occupa di commentare le tue prestazioni in battaglia oltre che parlare, parlare e <strong>parlare</strong> e <strong>PARLARE</strong> tutto il tempo.</p>
<p>Le mie orecchie pregano per avere il dolce sollievo del silenzio (o un caso miracoloso di "sordità selettiva"): il chiacchiericcio è estremamente fastidioso e questo si riflette sul gioco, costringendomi a fare due cose alla volta e facendole entrambe male.</p>
<h2>Conclusione</h2>
<p>Quando ero piccolo ho giocato a Raiden II, e ne ho adorato ogni singolo secondo.</p>
<p>Voglio adorare questo gioco. Lo voglio adorare talmente tanto che non è nemmeno divertente.</p>
<p>Ma non ci riesco.</p>
<p>La grafica è ottima, anche se i proiettili non sono "abbastanza evidenti" secondo me, andando ad inficiare il gameplay. Il sonoro è in generale molto buono.</p>
<p>Ci sono grossi passi avanti nel gameplay: la barra dello scudo, il sistema "flash point"... Anche il sistema "cheer" ha un suo posto se vuoi parteciparvi (è possibile disabilitarlo).</p>
<p>Avere solo un tipo di bomba è triste, però, non è una cosa importante ma ho sempre adorato come i due velivoli erano ben distinti in Raiden II, sia per colore che per tipo di bombe.</p>
<p>La storia potrebbe anche essere interessante, ma non riesco a capirne una sillaba: il muro di testo iniziale è talmente soverchiante che l'ho saltato direttamente ed il chiacchiericcio del centro di comando dovrebbe essere un sistema per mandare avanti la storia, ma indovina un po?</p>
<p><strong>Non posso ascoltare! Sto sparando a nemici che non sono propriamente felici di vedermi!</strong></p>
<p>La storia è soverchiante e ti viene spinta giù per la gola senza alcun rispetto per i tuoi neuroni ed il tuo desiderio di divertirti.</p>
<p>Oggi nessun riferimento divertente o intelligente al gioco nella spiegazione dei punteggi. Sono furente.</p>
<p><strong>62/100</strong></p>
<p>Grazie per aver letto.</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Shoot-em-up",
"name": "Raiden V - Director's Cut"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "62",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Raiden V Director's Cut2021-01-14T00:00:00+01:002021-01-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-14:/en/game-bytes/Game_Bytes_Raiden_V.html<p>Rip through waves of enemies with your amazing aircraft while the command center JUST WON'T SHUT UP.</p><h1>Rip through waves of enemies with your amazing aircraft while the command center JUST WON'T SHUT UP.</h1>
<p>There are many things that people will say in their lives, but I'm pretty sure "I play shoot-em-ups for their story" is not among those things.</p>
<p>Raiden V Director's Cut is a shoot-em-up game developed by MOSS and published worldwide by UFO Interactive (Japan's publishing is handled by MOSS). It is part of the beloved Raiden series that started back in 1990 on arcades.</p>
<h2>Graphics</h2>
<p>The 3D graphics are great and well fleshed out, special effects are amazing and it is really satisfying to see the bosses explode in spectacular fashion.</p>
<p>Being how varied the settings are, sometimes bullets are really hard to see; the situation gets worse when the background is moving really fast. This tends to be really distracting and makes the game a lot less enjoyable.</p>
<p>I would have preferred less background saturation and movement in favour of better playability.</p>
<h2>Setup and Performance</h2>
<p>Installing the game via Steam is absolutely painless, performance is good, I didn't notice any major frame drop with high resolution.</p>
<h2>Sound</h2>
<p>The sound design is excellent, sounds have good quality and play without latency.</p>
<p>Music is very good, although some themes tend to feel generic and bring down the perceived value of the game.</p>
<h2>Gameplay</h2>
<p>The gameplay is the classic vertical scrolling shoot-em-up that we all know, with some twists that are more or less welcome to the game.</p>
<p>A great plus is the possibility to choose your fighter and being able to choose how your 3 weapons will fire, with 3 modes each. This increases replayability and adds a welcome layer of customization and variety.</p>
<p>The "lives" system is replaced with a "shield bar", this allows the players to endure more than one hit without losing their score. This is countered by having only one "life" before being asked to "continue" and lose your score.</p>
<p>"Flash Point" is another welcome addition, it is merely a score multiplier that slowly depletes if you don't kill enemies. It is a huge help when it comes to leaderboard positioning, since this game features a multiplayer component.</p>
<p>The multiplayer component is further boosted by the "Cheer System", allowing players to "cheer on others" when an achievement is unlocked. Cheers increase your "Cheer Call", which can be used when you find yourself in a tight situation: all enemy bullets are cancelled and sub-weapons are temporarily boosted.</p>
<p>Compared to the other Raiden game I played (Raiden II), there is only one type of screen-clearing bomb that does a generic explosion with some rays. This deeply disappoints the 10-year-old inside of me.</p>
<h2>Extra: Story</h2>
<p>Here is the biggest complaint I have about this game. As soon as I start the game, I am welcomed by what slowly reveals itself to be a <strong>humongous wall of text</strong>. With voice acting too.</p>
<p>I have no issues with explaining what is going on, or even having a plot in a shoot-em-up, but you can only go so far without getting ridiculous.</p>
<p>The game features multiple endings, which can be seen as both a positive and a negative: multiple endings increase replayability, but also add to a game that could benefit from simplification.</p>
<p>The whole game features the command center commenting on your performance and talking, talking, talking and <strong>talking</strong> and <strong>TALKING</strong> all the time.</p>
<p>My ears beg for the sweet relief of silence (or a miraculous case of selective deafness): the chatter is extremely distracting and this reflects on gameplay, making me try to do two things at once and ending up doing both of them terribly.</p>
<h2>Conclusion</h2>
<p>I played Raiden II when I was a little kid, and I loved every second of it.</p>
<p>I want to love this game. I want to love it so badly it's not even funny.</p>
<p>But I just can't.</p>
<p>The graphics are great, although bullets are not "evident enough" in my opinion, negatively affecting gameplay. Sound is overall very good.</p>
<p>There are great steps forward in gameplay: the shield gauge, the "flash point" system... Even the "Cheer System" finds its place if you want to participate (you can opt out of it).</p>
<p>Having only one bomb type is sad though, it's not a huge thing but I always liked how the two aircrafts were well-distinguished in Raiden II, both by color and bomb types.</p>
<p>The story may be interesting too, but I literally cannot understand any of it: the initial wall of text was so overbearing I just skipped it and the chit-chat from the command center is supposed to be a system to deliver some plot, but guess what?</p>
<p><strong>I can't listen! I'm shooting down enemies that are not really happy to see me!</strong></p>
<p>The plot is overbearing and violently shoved down your throat without any respect for your braincells and your desperate trials to have fun.</p>
<p>No funny or smart references to the game in the score explanation today. I'm mad.</p>
<p><strong>62/100</strong></p>
<p>Thank you for reading.</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Shoot-em-up",
"name": "Raiden V - Director's Cut"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "62",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders 2 Deathinitive Edition2021-01-08T00:00:00+01:002021-01-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-08:/game-bytes/Game_Bytes_Darksiders_2.html<p>Guerra è ancora nei guai: vestiamo i panni di Morte per trovare un modo per riscattarlo</p><h1>Guerra è ancora nei guai: vestiamo i panni di Morte per trovare un modo per riscattarlo</h1>
<p>Darksiders 2 è un gioco in stile hack&slash in terza persona sviluppato da Vigil Games e pubblicato da THQ Nordic.</p>
<p>Vestiamo i panni di Morte, "primus inter pares" dei quattro cavalieri dell'apocalisse, alla ricerca di un modo per riscattare l'onore del proprio fratello Guerra, accusato di aver iniziato l'apocalisse prima del tempo.</p>
<p>Questa recensione cita molte volte il capitolo precedente, quindi vi consiglio di leggere prima il capitolo <a href="https://penazarea.altervista.org/game-bytes/Game_Bytes_Darksiders.html">Game Bytes: Darksiders Warmastered Edition</a>.</p>
<h2>Grafica</h2>
<p>Darksiders 2 porta una grafica comparabile a Darksiders Warmastered Edition, con buon supporto per alte risoluzioni, textures di ottima qualità ed ambienti vari e ben dettagliati.</p>
<p>La varietà grafica è stata leggermente sacrificata in nome di una maggiore immediatezza di gioco: in contrasto con i vari appigli utilizzabili nel predecessore, come corde d'acciaio, travi metalliche o di legno, abbiamo pochi tipi di appigli ben riconoscibili.</p>
<p>Tale sacrificio è ben ripagato in altri settori del gioco, inoltre quello che c'è nel comparto grafico è ben curato e si amalgama bene nell'ambientazione.</p>
<h2>Installazione e Performance</h2>
<p>Installare il gioco tramite Steam è assolutamente veloce ed indolore, le performance sono ottime, senza alcun calo di frame a risoluzioni e qualità alte. Non ho avuto particolare necessità di cambiare i controlli di default che risultano comunque abbastanza comodi dopo un po' di acclimatazione.</p>
<h2>Comparto Sonoro</h2>
<p>Ottimo il comparto sonoro, i suoni hanno una qualità eccellente e vengono riprodotti senza latenze.</p>
<p>Diversamente dalla remake del predecessore non ho rilevato alcun baco nel reparto sonoro, mantenendo l'immersione dell'utente per tutta la durata del gioco.</p>
<h2>Gameplay</h2>
<p>Il gioco è un hack&slash in terza persona, in cui controlliamo il cavaliere Morte.</p>
<p>I comandi sono leggermente diversi dal predecessore, con uno schema di tasti che reputo migliore nel complesso, ed un sistema di combo che continua ad essere semplice da apprendere ed usare.</p>
<p>Anche questo gioco ha dei puzzle che possono risultare leggermente più ostici del predecessore, ma sono nel complesso meglio disegnati e danno una minor impressione di "arbitrarietà" nel gioco.</p>
<p>Diversamente da Guerra, che risultava (giustamente) pesante, Morte è leggero ed agile, con possibilità di correre sui muri, volteggiare tra diversi punti di appiglio con facilità e leggiadria. Morte è veramente un piacere da controllare.</p>
<p>Inoltre il gioco fa uso di armi, armature e talismani generati proceduralmente, che aggiungono un ulteriore livello di profondità al gioco, ulteriormente migliorato dalle "armi possedute" che possono aumentare di livello "dando in pasto" altre armi che non usiamo.</p>
<h2>Extra: I bug e le campagne aggiuntive</h2>
<p>Rispetto al gioco precedente sono stati fatti passi da gigante sul fronte della stabilità: ho rilevato solo 3 bug nel corso di due interi gameplay (di cui il primo qualche anno fa).</p>
<p>Iniziamo con il primo baco, trovato durante entrambi i gameplay: la collisione di un dato muro invisibile, similmente al predecessore, non viene rimossa successivamente ad una battaglia in stile arena, impedendo il proseguimento.</p>
<p>Il problema viene risolto ricaricando il salvataggio.</p>
<p>Il secondo baco invece è un'altra istanza di "caduta fuori dalla mappa", ma in questo caso la presenza di un "death plane" ha forzato il "decesso" di Morte, riportandoci dove dovuto.</p>
<p>Le campagne aggiuntive sono decisamente una aggiunta molto gradita per allungare di un paio d'ore il gameplay, ma avrei preferito potervi accedere direttamente dal gioco principale piuttosto che doverle selezionare dal menu principale.</p>
<h2>Conclusione</h2>
<p>Nel secondo capitolo, la serie Darksiders vede un fantastico sequel che supera il primo capitolo in tutto e per tutto: la storia è avvincente, le ambientazioni varie e ben dettagliate, stabilità migliorata, ottimo sound design e gameplay eccellente.</p>
<p>Come al solito, il punteggio va da 0 (l'equivalente dell'apocalisse sulla terra) a 100 (la sacra reliquia della Città Bianca).</p>
<p>Il punteggio che gli assegno è: <strong>88/100</strong>, solido e molto vicino alla perfezione, a parte qualche piccola inezia.</p>
<p>Grazie ancora per la lettura, ci si vede nel prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders 2: Deathinitive Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "88",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders 2 Deathinitive Edition2021-01-08T00:00:00+01:002021-01-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-08:/en/game-bytes/Game_Bytes_Darksiders_2.html<p>War is still in trouble: let's take on the role of Death to find a way to clean his name</p><h1>War is still in trouble: let's take on the role of Death to find a way to clean his name</h1>
<p>Darksiders 2 is a 3rd person hack&slash style game developed by Vigil Games and published by THQ Nordic.</p>
<p>We take on the role of Death, "primus inter pares" (first among equals) of the four horsement, looking for a way to redeem his brother War, who was accused of starting the apocalypse before it was due.</p>
<p>This review references the previous chapter, so I suggest you to read <a href="https://penazarea.altervista.org/en/game-bytes/Game_Bytes_Darksiders.html">Game Bytes: Darksiders Warmastered Edition</a> first.</p>
<h2>Graphics</h2>
<p>Darksiders 2 has graphics which are comparable to Darksiders Warmastered Edition, with good support for high resolutions, high-quality textures and varied and very detailed settings.</p>
<p>Graphical variety was sacrificed in favour of a more immediate gameplay: instead of various handholds like steel cables, metal or wooden beams, we have few well-recognizable types of holds.</p>
<p>Such sacrifice is well repaid in other sections of the game. What's here is still well detailed and mixes well with the environment.</p>
<h2>Setup and Performance</h2>
<p>Installing the game via Steam is absolutely fast and painless, performance is great, without any frame drop with high resolution and quality. I didn't feel the need to change the default controls, which are still comfortable enough after getting used to them.</p>
<h2>Sound</h2>
<p>Great sound design, sounds have excellent quality and are played without any latency.</p>
<p>Countrary to the remake of the previous chapter, I didn't find any bugs when it comes to sound. This keeps the player immersed in the game for the whole duration of the experience.</p>
<h2>Gameplay</h2>
<p>The game is a 3rd person hack&slash style of game, where we are controlling the horseman Death.</p>
<p>Controls are slightly different compared to the previous chapter, with a control scheme that I judge better overall, and a combo system that continues to be simple to use and learn.</p>
<p>This game also has some puzzles that can be a bit harder than the previous chapter, but are overall better designed and feel less "arbitrary".</p>
<p>Compared to War, which felt (rightfully) heavy, Death is nimble and light, allowing for wall-runs and vaulting between different handles with ease and gracefulness. Death is a pleasure to control.</p>
<p>Furthermore, this game has weapons, armors and talismans that are procedurally generated, adding another level of depth to the game. This is further improved by "possessed weapons" which can level up by "eating" other weapons that we don't use.</p>
<h2>Extra: Bugs and extra campaigns</h2>
<p>Compared to the previous game, a lot of improvement was made when it comes to stability: I found only 3 bugs while playing through the entire game twice (the first time some years ago).</p>
<p>Let's start with the first one, found in both gameplays: the collision of a certain "invisible wall", similarly to the previous chapter, fails to be removed after an arena-style battle, stopping us from proceeding.</p>
<p>The problem is solved by loading the savefile again.</p>
<p>The second bug is another instance of "falling out of the map", but this time a "death plane" forces Death's "demise", bringing us back where we should be.</p>
<p>The extra campaigns are a very appreciated addition, that lengthens the gameplay by a couple of hours, but I would have preferred accessing them directly from the main campaign instead of selecting them from the main menu.</p>
<h2>Conclusion</h2>
<p>In its second chapter, the Darksiders series finds a fantastic sequel that surpasses the first chapter in every field: the story is compelling, the setting is varied and well-crafted, stability is improved, sound design is excellent as is the gameplay.</p>
<p>As usual, the score goes from 0 (the equivalent of Apocalypse on Earth) to 100 (the sacred relic in the White City).</p>
<p>The score is: <strong>88/100</strong>, solid and very close to perfection, besides some trifles here and there.</p>
<p>Thank you again for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders 2: Deathinitive Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "88",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders Warmastered Edition2021-01-05T00:00:00+01:002021-01-05T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-05:/game-bytes/Game_Bytes_Darksiders.html<p>Guerra è nei guai e farà di tutto per pulire il proprio nome. Vestiamo i panni di uno dei quattro cavalieri in Darksiders!</p><h1>Guerra è nei guai e farà di tutto per pulire il proprio nome. Vestiamo i panni di uno dei quattro cavalieri in Darksiders!</h1>
<p>Darksiders è un gioco in stile hack&slash in terza persona sviluppato da Vigil Games e pubblicato da THQ Nordic in cui vestiamo i panni del cavaliere Guerra, nel tentativo di pulire il nostro nome dal peccato più grande mai commesso: aver dato inizio all'apocalisse prima del tempo.</p>
<h2>Grafica</h2>
<p>La versione remastered (o "Warmastered") porta risoluzioni maggiori con il supporto per schermi ultrawide e texture a maggior risoluzione, anche se vi sono alcune situazioni in cui le risoluzioni ultrawide sono mal gestite, portando a dei flash di glitch grafici all'apertura dei menu.</p>
<h2>Installazione e Performance</h2>
<p>Installare il gioco tramite Steam è assolutamente veloce ed indolore, le performance sono discrete con qualche minimo drop di frame a risoluzione 2560x1440 e qualità massima. Non ho avuto particolare necessità di cambiare i controlli di default che risultano comunque abbastanza comodi dopo un po' di acclimatazione.</p>
<h2>Comparto Sonoro</h2>
<p>Ottimo il comparto sonoro, i suoni hanno una buona qualità e vengono riprodotti senza latenze.</p>
<p>Le uniche grosse pecche che ho rilevato sono la mancanza di riproduzione di un suono ogni tanto (si parla di una volta ogni diverse ore di gioco) e dell'audio dei filmati che presenta un volume <strong>molto</strong> inferiore a quello del gioco, cosa fastidiosa ma non troppo.</p>
<h2>Gameplay</h2>
<p>Il gioco è un hack&slash in terza persona, in cui controlliamo il cavaliere Guerra.</p>
<p>I comandi sono veloci nella risposta ed il sistema di combo è abbastanza semplice da apprendere, con un po' di pratica è possibile concatenare combo con diverse armi con facilità.</p>
<p>Il gioco ha dei puzzle che sono molto semplici, alcuni possono risultare un po' fastidiosi ma nel complesso non sono "abbastanza fastidiosi" da essere una pecca del gioco.</p>
<p>Guerra è "pesante" come dovrebbe essere per un individuo della sua stazza con un grosso braccio metallico, tale "pesantezza" non influenza negativamente il gameplay e la ritengo un punto positivo per dare più "realismo" al gioco.</p>
<h2>Extra: I bug</h2>
<p>Purtroppo qui arriviamo al punto dolente del gioco: i bachi (o bug).</p>
<p>Mi sono scontrato con diversi bachi durante la mia esperienza, nessuno dei quali ha "rotto il gioco", ma che sono risultati comunque abbastanza fastidiosi.</p>
<p>Il primo baco vede Guerra scomparire completamente dallo schermo dopo un filmato, lasciando solo le luci della spada ad informarci della sua posizione. Ricaricare il salvataggio ha risolto il problema.</p>
<p>Come detto precedentemente, vi sono istanze in cui il volume dei filmati è troppo basso o un singolo suono non viene riprodotto. In totale non sono stati riprodotti 3 effetti sonori nell'intera campagna, mentre tutti i filmati sono affetti dal problema del volume.</p>
<p>Altro baco vede Guerra teletrasportato all'interno di un muro dopo un filmato, alla pressione di un bottone il personaggio viene espulso dal muro e fuori dalla mappa, dove cadrà per l'eternità. Ancora una volta un caricamento del salvataggio risolve il problema, senza perdita di progressi.</p>
<p>Ultimo baco è legato alla sparizione delle "pareti invisibili" che bloccano il nostro progresso: quando siamo in una data area, vengono alzate delle pareti di fuoco (con annessa collisione) per impedirci di fuggire. Tali pareti vengono rimosse all'uccisione di tutti gli avversari. Purtroppo in due istanze tale rimozione non ha rimosso la collisione, impedendo di proseguire.</p>
<p>Ancora una volta, caricare il salvataggio risolve il problema senza perdita di progressi.</p>
<h2>Conclusione</h2>
<p>Con qualche anno sulle spalle, Darksiders è una serie conosciuta e trova una degna remaster in questo gioco, anche se i bachi rendono l'esperienza meno godibile di quanto potrebbe essere, dati i solidi elementi di gameplay e la storia avvincente (che si protrae per diversi giochi).</p>
<p>Come al solito, il punteggio va da 0 (l'equivalente dell'apocalisse sulla terra) a 100 (la sacra reliquia della Città Bianca).</p>
<p>Il punteggio che gli assegno è: <strong>75/100</strong>, solido ma decisamente migliorabile.</p>
<p>Grazie ancora per la lettura, ci si vede nel prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders: Warmastered Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "75",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Darksiders Warmastered Edition2021-01-05T00:00:00+01:002021-01-05T00:00:00+01:00Penaztag:penazarea.altervista.org,2021-01-05:/en/game-bytes/Game_Bytes_Darksiders.html<p>War is in trouble and will do anything to clean his name. Let's take on the role of one of the Four Horsemen in Darksiders!</p><h1>War is in trouble and will do anything to clean his name. Let's take on the role of one of the Four Horsemen in Darksiders!</h1>
<p>Darksiders is a 3rd person hack&slash game developer by Vigil Games and published by THQ Nordic where we take on the role of the horseman War, trying to clean our name from the biggest sin ever committed: starting the apocalypse before it was due.</p>
<h2>Graphics</h2>
<p>The remaster (or "Warmstered") brings higher resolutions with support for ultrawide monitors and higher resolution textures, even though there are some situations where ultrawide resolutions are badly managed, with some glitchy flashes when opening menus.</p>
<h2>Setup and Performance</h2>
<p>Installing the game via Steam is absolutely fast and painless, performance is good with some small frame drop at 2560x1400 and highest quality. I didn't feel the need to change the default controls, which are comfortable enough after a bit of getting used to.</p>
<h2>Sound</h2>
<p>Sounds are excellent, with good quality and no perceivable latency.</p>
<p>The only big issues I found are some sounds missing (once every few hours of gameplay) and the cutscene audio having a volume <strong>way</strong> lower than the one in-game, something that is definitely annoying but not too much.</p>
<h2>Gameplay</h2>
<p>The game is a 3rd person hack&slash, where we are controlling War, one of the horsemen.</p>
<p>Commands respond quickly and the combo system is quite easy to learn, with some practice you can chain combos with different weapons with ease.</p>
<p>The game features some puzzles which are quite easy, but some can be a bit of a nuisance. Overall, they are not "annoying enough" to be a problem for the game.</p>
<p>War is "heavy" like he should be, being a huge dude with an enormous metal arm, the "heaviness" doesn't affect the gameplay negatively and I find it to be a plus, being more "realistic".</p>
<h2>Extra: Bugs</h2>
<p>Sadly here we are at the worst point of the game: bugs.</p>
<p>I came across a lot of bugs in my gameplay, none of them has "broken the game", but they have nonetheless been quite annoying.</p>
<p>First one sees War disappearing from the screen after a cutscene, leaving only some lights from the sword to inform us of his position. Loading the savefile solved the issue.</p>
<p>Like stated earlier, there are situations where the volume inside the cutscenes was too low, or where a single sound was not played. In total 3 sound effects were skipped in the entire campaign, while all cutscenes were affected by the volume issues.</p>
<p>Another bug features War being teleported inside a wall after a cutscene, after pressing a button the character gets ejected from the wall, outside the map, where he will fall for eternity. Once again, loading the latest savefile solves the issue, without losing any progress.</p>
<p>The last bug is connected to "invisible walls" that stop us from proceeding: when we are inside a certain area, some fire walls are raised (with relative collision) to avoid us from escaping. Such walls are removed when all enemies are killed. Sadly, such removal didn't remove the collision twice, stopping me from proceeding.</p>
<p>Once again, loading the savefile solves the issue without losing any progress.</p>
<h2>Conclusion</h2>
<p>Being some years old, Darksiders is a known series and finds a worthy remater in this game. Bugs make the experience less enjoyable than it should be, given the solid gamelplay and a great story (that spans more games).</p>
<p>As usual, the score goes from 0 (the equivalent of Apocalypse on Earth) to 100 (the sacred relic in the White City).</p>
<p>My score is: <strong>75/100</strong>, solid but definitely improvable.</p>
<p>Thank you again for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Hack&Slash",
"name": "Darksiders: Warmastered Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "75",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Essent10: Il tema responsive minimale che funziona senza JavaScript2020-12-29T00:00:00+01:002020-12-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-12-29:/coding/Essent10.html<p>Dopo diversi giorni di sperimentazioni, ritocchi e design, ecco Essent10: il tema per Pelican minimale privo di JavaScript</p><h1>Dopo diversi giorni di sperimentazioni, ritocchi e design, ecco Essent10: il tema per Pelican minimale privo di JavaScript</h1>
<p>Buongiorno a tutti,</p>
<p>Ero veramente stanco del vecchio tema del mio blog, che per quanto elegante non era assolutamente usabile su dispositivi mobili e non faceva buon uso delle caratteristiche di HTML5 e CSS3. Oltretutto la gestione degli articoli e del tema stesso erano pessime, dato che era una versione modificata (male, mea culpa) del tema <a href="https://github.com/getpelican/pelican/tree/master/pelican/themes/notmyidea/">"notmyidea"</a>.</p>
<p>Chi mi conosce bene, sa che una delle mie filosofie nella creazione di siti web è "meno JavaScript c'è, più son contento", quindi ho voluto vedere fino a quale folle estremo posso portare questa filosofia, a qualunque costo.</p>
<p>Il risultato di tutto questo è Essent10 (pronunciato "Essentio"): un tema responsive minimale che non fa alcun uso di JavaScript.</p>
<h2>Supporto "Dark Mode"</h2>
<p>Come tutti i migliori "Lord del lato oscuro", una delle caratteristiche che volevo assolutamente implementare nel tema è il supporto per un "dark mode".</p>
<p>Questo è stato abbastanza semplice grazie alle variabili CSS ed alle nuove "Media Queries Level 5", che comprendono un nuova media query: <code>prefers-color-scheme</code>.</p>
<p>Se l'utente imposta il proprio browser per richiedere al sito di far uso della "dark mode", automaticamente lo schema colori verrà caricato e cambiato. Per evitare di fare uso di JavaScript, non ho implementato un sistema per "cambiare al volo" lo schema colori. Lo ritengo una caratteristica inutile in ogni caso, dato che quando imposto uno schema colori, solitamente resta lo stesso per sempre.</p>
<h2>Menu Laterale A Scomparsa</h2>
<p>Ho deciso di abbandonare il doppio menu orizzontale (con annessi orrori sul lato usabilità) in favore di un menu laterale a scomparsa.</p>
<p>Tale menu è implementato tramite regole CSS ed una checkbox nascosta, tramite tale hack è possibile avere un menu a scomparsa funzionante senza far uso di JavaScript.</p>
<p>In modalità mobile, il menu sarà inizialmente nascosto e verrà estratto facendo click sul pulsante "hamburger" in alto a sinistra dello schermo.</p>
<p>Alcuni ritengono che il "simbolo hamburger" non vada ad esprimere un menu, con conseguente aumento del carico cognitivo. Personalmente ritengo che tale critica abbia valore per un'utenza meno avvezza all'informatica moderna; il "menu ad hamburger" è stato introdotto nel 2009 ed ormai è diventato un punto cardine delle applicazioni mobili e consente di risolvere un problema abbastanza critico: la mancanza di spazio.</p>
<p>Se il menu non viene sovraccaricato di voci e viene usato come un sistema di "navigazione secondaria", come in questo caso, ritengo il suo uso sia più che accettabile.</p>
<h2>Casella di Ricerca</h2>
<p>Il tema mette a disposizione una casella di ricerca per aiutare l'utenza a trovare qualcosa all'interno del sito.</p>
<p>In questo caso ho dovuto imbrogliare: la casella di ricerca fa uso di un servizio esterno (DuckDuckGo) per le ricerche interne al sito: una form effettua una richiesta <code>HTTP GET</code> su DuckDuckGo, limitando la ricerca al dominio del sito.</p>
<p>Tale casella è disattivabile e leggermente personalizzabile, con molta probabilità è possibile usare altri motori di ricerca che funzionano in maniera simile a DuckDuckGo.</p>
<p>Una seconda casella di ricerca compare nel menu ad hamburger in modalità mobile (mentre quella nella testata viene nascosta) per risparmiare spazio.</p>
<p>Questo mi consente di avere una funzionalità di ricerca senza PHP o uso di sistema di ricerca statica come Tipue Search (che fa uso di JQuery).</p>
<h2>Social</h2>
<p>Il tema offre funzionalità di "condivisione sui social" senza JavaScript e senza tracciatori: completamente configurabile da <code>pelicanconf.py</code>, il sistema consente di inserire una casella alla fine di ogni articolo per condividere la pagina o il post su:</p>
<ul>
<li>Twitter</li>
<li>Facebook</li>
<li>Buffer</li>
<li>LinkedIn</li>
<li>Pinterest</li>
<li>Reddit</li>
<li>Hacker News</li>
<li>Email</li>
</ul>
<p>Permettendo inoltre di decidere se aprire la schermata di condivisione in una nuova tab, il tutto senza includere alcuno script e liberandoci di tracciatori dei vari social network.</p>
<h2>Accessibilità</h2>
<p>Questo tema cerca di avere un occhio di riguardo per l'accessibilità da diversi dispositivi (mobile, desktop, screen reader, etc...), oltre che cercare di offrire un contenuto ben visibile da parte di persone affette da disturbi della visione.</p>
<p>I colori cercano di essere quanto meglio contrastanti possibile (cercando ove possibile di raggiungere gli standard WCAG AAA), i font sono ben grandi e le righe hanno interlinea maggiorati per semplificare la lettura.</p>
<h2>Cosa avrei voluto fare in più</h2>
<p>Ci sono alcune cose che avrei voluto aggiungere in questo tema ma che per ragioni di tempo o altro non ho potuto fare.</p>
<h3>Ritmo Verticale</h3>
<p>Una delle cose che avrei fortemente voluto implementare nel tema è il concetto di "ritmo verticale": un concetto abbastanza nuovo nel web, dove la dimensione dei font e degli interlinea sono specificamente creati per essere consistenti e dare una maggior sensazione di "ordine" nel testo.</p>
<p>Purtroppo calcolare la baseline e tutti i margini per rientrare nel concetto di "ritmo verticale" è un calcolo che, seppur non troppo complesso, si scontra con l'ammontare di energia che voglio spendere per creare questo tema.</p>
<p>Magari più avanti nel tempo, potrei pensare di implementare tale concetto.</p>
<h3>Meta Tag Proprietari</h3>
<p>Il mio blog ora si appoggia sull'ottimo plugin <a href="https://github.com/pelican-plugins/seo">pelican-seo</a>, che non fa uso di tag proprietari (Ad esempio per le "Twitter Card") in quanto sono considerati tag il cui uso mette a suo modo a repentaglio il concetto di "Internet Aperta", coinvolgendo siti in una "guerra tra corporazioni" che non dovrebbe esistere.</p>
<p>Essendo sostanzialmente d'accordo con il ragionamento dei creatori di pelican-seo, al momento ho preferito evitare di far uso di tali tag (anche se nella versione precedente del blog lo facevo), in favore di "tag aperti" come i classici "meta tag" e JSON-LD.</p>
<p>In futuro potrei appoggiarmi ad un plugin specifico o includere un sotto-template per generare tali tag.</p>
<h3>Miglior supporto "dark mode"</h3>
<p>Al momento il supporto "dark mode" è un po' instabile, in caso di mancanza di preferenza dovrebbe caricare il tema "chiaro", invece viene caricato il "tema scuro". Vorrei arrivare in fondo alle ragioni per cui questo accade, correggere il problema ed avere la "mente libera" da questo pensiero.</p>
<p>Essendo ancora un "editor's draft" (sostanzialmente una funzionalità ancora sperimentale), potrebbe essere che le combinazioni colori e la media query <code>prefers-color-scheme</code> non si comportino come dovuto.</p>
<h2>Eventuali Piani Futuri</h2>
<p>Il tema è già online ed utilizzabile, ma ci sono ancora alcune cose che vorrei poter aggiungere per renderlo più "universale" ed appetibile per chi vuole modificarlo o usarlo con esigenze diverse dalle mie.</p>
<h3>Miglioramenti di usabilità</h3>
<p>Nonostante tutta la mia attenzione per l'usabilità, ho completamente dimenticato alcune cose fondamentali per l'usabilità.</p>
<p>Prima di tutto voglio inserire una voce nascosta "salta la navigazione" per la comodità di utenti facenti uso di screenreader, inoltre voglio generare dinamicamente degli "tab-stop" per chi vuole usare la tastiera per navigare tra i link.</p>
<h3>Riordino Template</h3>
<p>Andrò ad effettuare un riordino dei template, andando ad inserire i "template parziali" (che contengono pezzi di pagina) in una sottocartella, così da facilitarne la gestione.</p>
<p>Questo è un miglioramento molto semplice da implementare, finché il tema è piccolo, se dovessi aggiungere ulteriori caratteristiche prima di farlo, tale migrazione potrebbe risultare problematica.</p>
<h3>Copyright</h3>
<p>Al momento il tema non contiene alcuna menzione al copyright sul contenuto del blog o sito web creato. Vorrei quindi aggiungere un paio di opzioni sul file <code>pelicanconf.py</code> che permettano di visualizzare una frase simile a "© Anno Nome" in fondo alla pagina.</p>
<h3>Minificazione CSS/JS e Thumbnails</h3>
<p>Nei siti web è importante avere risorse piccole: dobbiamo dare per assunto che il traffico sia limitato ed il consumarne il meno possibile è una questione di rispetto verso l'utente.</p>
<p>Inizialmente il tema doveva supportare il plugin <a href="https://github.com/pelican-plugins/webassets">pelican-webassets</a>, ma mi sono scontrato con problemi di diversa natura che mi hanno impedito di proseguire per questa strada.</p>
<p>L'idea è quella di riuscire a ripristinare il supporto per <code>pelican-webassets</code> ed effettuare una minificazione dei fogli stile CSS ed eventuali JavaScript che potrebbero essere inclusi in futuro.</p>
<p>Successivamente vorrei integrare il plugin con <a href="https://github.com/pelican-plugins/image-process">pelican-image-process</a> per creare thumbnails ed immagini "responsive" tramite i tag HTML5 <code><picture></code>.</p>
<h3>Lightbox</h3>
<p>La prima componente che farà uso di JavaScript sarà una cosiddetta "LightBox": al click su un'immagine vada ad aprire una "finestra modale" in sovrimpressione alla pagina, contenente la versione originale dell'immagine.</p>
<p>Questo potrebbe essere utile dal lato dell'usabilità utente, se ben implementata, ma non è una priorità.</p>
<h3>Supporto Disqus</h3>
<p>Nell'ambiente dei "blog statici" generati da software come Pelican e Jekyll, Disqus è un servizio molto apprezzato per mettere a disposizione una sezione commenti dedicata ad un certo post.</p>
<p>Vorrei mettere a disposizione dell'utente tale funzionalità, attivabile a scelta, così da offrire la massima libertà possibile.</p>
<h3>Supporto Google Analytics e Tag Manager</h3>
<p>Anche se personalmente non sono interessato, alcune persone potrebbero trarre vantaggio dall'implementazione di script di Google Analytics (per l'analisi del traffico) oltre che di Google Tag Manager (usato per gestire i tag di tracking ed analisi del traffico).</p>
<p>L'idea è simile a molti temi già esistenti: far inserire all'utente il proprio codice o ID in <code>pelicanconf.py</code> ed automaticamente il sistema si occuperà di inserire gli script necessari nelle pagine.</p>
<h2>Conclusioni</h2>
<p>Il tema per ora è molto basilare e cambierà nel tempo, ma per il momento incarna per la maggior parte i principi che volevo seguire: usabilità, leggerezza, flessibilità e la riduzione dell'uso di JavaScript.</p>
<p>Non so ancora cosa pensare per quanto concerne il "design" in sé, che potrebbe cambiare in futuro.</p>
<p>Se volete dare un'occhiata al tema, seguite il link al <a href="https://github.com/Penaz91/Essent10">repository github di Essent10</a>.</p>
<p>Grazie a tutti per aver letto. Alla prossima!</p>
<p>Penaz.</p>Essent10: The minimal and responsive theme that works without JavaScript2020-12-29T00:00:00+01:002020-12-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-12-29:/en/coding/Essent10.html<p>After many days of experiments, tweaks and designing, here comes Essent10: the minimal theme for Pelican, without JavaScript</p><h1>After many days of experiments, tweaks and designing, here comes Essent10: the minimal theme for Pelican, without JavaScript</h1>
<p>Hello everyone,</p>
<p>I was really tired of the old theme used in my blog, even though it was elegant it was also absolutely unusable on smartphones, and did not make good usage of HTML5 and CSS3's features. Furthermore the content and theme management was horrible, since it was based on a (badly) modified version of the <a href="https://github.com/getpelican/pelican/tree/master/pelican/themes/notmyidea/">"notmyidea"</a> theme (that's on me).</p>
<p>The people who know me well, are aware that one of my guidelines when making a website is "The less JavaScript there is, the happier I feel", so I wanted to see how far I could push this Philosophy, whatever the cost.</p>
<p>The final result is Essent10 (pronounced "Essentio"): a responsive and minimal them that makes no use of JavaScript.</p>
<h2>Dark Mode Support</h2>
<p>Like the best "dark side lords", one of the features I absolutely wanted to be in my theme was "dark mode".</p>
<p>This was fairly easy thanks to CSS Variables and the new "Media Queries Level 5", which include a new media query: <code>prefers-color-scheme</code>.</p>
<p>When the user sets their browser to demand a website to use "dark mode", the color scheme will be automatically loaded and changed. To avoid using JavaScript, I decided to not code a system to switch the color scheme "on the fly". I think of it as a pretty useless feature, since when I set a color scheme, it's going to stay the same forever.</p>
<h2>Retractable Sidebar</h2>
<p>I decided to give up the double horizontal menu (with its inherent usability horrors) in favor of a retractable sidebar.</p>
<p>Such menu is implemented via CSS rules and a hidden checkbox, using such hack it is possible to have a working retractable sidebar without any JavaScript.</p>
<p>When on mobile, the sidebar will be hidden by default and it can be toggled via the "hamburger" button on the top left side of the screen.</p>
<p>Some think that the "hamburger symbol" doesn't really convey the meaning of a menu, and subsequently heightens the cognitive load of a website. I personally think that such criticism is valid when it comes to people with less experience in modern IT; the so-called "hamburger menu" was introduced in 2009 and has become a cornerstone of many mobile applications, as it allows to solve a critical issue: the lack of space.</p>
<p>If such menu is not overloaded with buttons, and is mostly used as a "secondary navigation", like in the case of a blog, I think it is more than simple acceptable.</p>
<h2>Search Box</h2>
<p>This theme has a search box that helps your users finding content in your website.</p>
<p>In this case I had to cheat: the search box makes use of an external service (DuckDuckGo) to search inside the website: the form makes an <code>HTTP GET</code> request on DuckDuckGo, limiting the search to the website's domain.</p>
<p>Such search box can be disabled and is slightly customizable, there is good probability you can use other search engines that work in a similar way to DuckDuckGo.</p>
<p>A second search box appears in the hamburger menu in mobile mode (while the one in the header gets hidden) to save on space.</p>
<p>This allows me to search through the website without using PHP o a static search system like Tipue Search (which uses JQuery).</p>
<h2>Social</h2>
<p>This theme offers a "share on social media" feature, without JavaScript or trackers: completely customizable via <code>pelicanconf.py</code>, this system allows to insert a box at the end of each post to allow sharing on:</p>
<ul>
<li>Twitter</li>
<li>Facebook</li>
<li>Buffer</li>
<li>LinkedIn</li>
<li>Pinterest</li>
<li>Reddit</li>
<li>Hacker News</li>
<li>Email</li>
</ul>
<p>It also allows to decide if you want the sharing screen to open on a new tab, everything without any script and getting rid of social network trackers.</p>
<h2>Accessibility</h2>
<p>This theme tries to be accessible from different devices (mobile, desktop, screen readers, etc...), as well as offer content that is readable from people with visual impairments.</p>
<p>Colors try to be as contrasting as possible (trying to follow the WCAG AAA guidelines where possible), fonts are big and increased line spacing improve readability.</p>
<h2>What I would have liked to do</h2>
<p>There are some things I wanted to add to this theme, but for time constraints or other reasons I couldn't add.</p>
<h3>Vertical Rhythm</h3>
<p>One of the things I really wanted to implement in this theme was the "vertical rhythm" concept: something that is quite new on the web, where font sizing and line spacing are specifically tailored to be consistent and give a better sensation of "order" in the text.</p>
<p>Sadly calculating the baseline and all the margins to follow the "vertical rhythm" guidelines is a calculation that, even though not really too complex, conflicts with the amount of energy I want to spend to create this theme.</p>
<p>Maybe in a distant future, I may think to implement such concept.</p>
<h3>Proprietary Meta Tags</h3>
<p>My blog now makes use of the great <a href="https://github.com/pelican-plugins/seo">pelican-seo</a> plugin, which doesn't use any proprietary tags ("twitter cards" for instance) since such tags are considered a danger to the concept of "open internet", involving websites in a "corporate war" that should not exist.</p>
<p>Agreeing in a substantial way with such line of thought, I preferred avoiding such tags (even though I used them in the previous blog) for now, favouring "open tags" like the old "meta tags" and JSON-LD.</p>
<p>In a distant future I may use a specific plugin or make some sub-templates to generate such tags.</p>
<h3>Better "dark mode" support</h3>
<p>At the moment, "dark mode" is a bit unstable: when no preference is set the "light" theme should be loaded, instead "dark mode" gets enabled. I would like to understand why this happens, fix the issue and "free my mind" from such worry.</p>
<p>Being still an "editor's draft" (substantially an experimental feature), there is a possibility that the color schemes and the <code>prefers-color-scheme</code> media queries are not working as intended.</p>
<h2>Future Plans</h2>
<p>The theme is already public and usable, but there some things I would like to add to make it more "universal" and easier to use for the people who have different needs or just edit it.</p>
<h3>Usability Improvements</h3>
<p>Even though I paid close attention to usability, I completely forgot some usability cornerstones.</p>
<p>First of all, I want to add a hidden "skip navigation" link, for better navigation by screen reader users, also I want to dynamically generate some "tab-stops" for the people who want to use the keyboard to surf between the links.</p>
<h3>Template Sorting</h3>
<p>I will sort the templates, putting the "partial templates" (which contain pieces of pages) in a sub-folder, making their management easier.</p>
<p>This is a really simple improvement, while the theme is small and self-container, if I add more features before doing this, such migration may become a problem.</p>
<h3>Copyright</h3>
<p>At the moment, this theme doesn't contain any mention on the copyright of the website or blog. I would like to add a couple options in the <code>pelicanconf.py</code> file that will allow to show a phrase similar to "© Year Name" in the page's footer.</p>
<h3>JS Minification and Thumbnails</h3>
<p>In websites it is important to have small resources: we have to assume that data is limited, and using the least amount possible is a matter of respect towards our users.</p>
<p>This theme was supposed to support the <a href="https://github.com/pelican-plugins/webassets">pelican-webassets</a> plugin, but some problems stopped me from completing this integration.</p>
<p>I want to restore support for the <code>pelican-webassets</code> plugin and minify CSS style sheets and JavaScripts that may be included in the future.</p>
<p>After this, I would like to make use of the <a href="https://github.com/pelican-plugins/image-process">pelican-image-process</a> plugin, to create thumbnails and "responsive" images via the <code><picture></code> HTML5 tag.</p>
<h3>Lightbox</h3>
<p>The first component that will make use of JavaScript will probably be a so-called "LightBox": when an image is clicked a "modal dialog" will be opened, overlaying the page, containing the original version of the image.</p>
<p>This may be useful on the usability side, if well made, but it is not a priority at the moment.</p>
<h3>Disqus Support</h3>
<p>In "static blogs" which are generated by software such as Pelican and Jekyll, Disqus is a well-regarded service to allow to put a comment section inside a certain page.</p>
<p>I would like to give the user the chance to use such service, if activated, so to offer the maximum amount of freedom possible.</p>
<h3>Google Analytics and Tag Manager support</h3>
<p>Even though I am not really interested in it, some people may find use implementing Google Analytics (traffic Analytics) and Google Tag Manager (tag management and traffic Analytics) scripts.</p>
<p>This idea is really similar to one widely used by other themes: let the user insert their code or ID in their <code>pelicanconf.py</code> and the system will automatically insert the necessary scripts in the right pages.</p>
<h2>Conclusions</h2>
<p>This theme is really basic and will change with time, but for now it implements the majority of principles I wanted to follow: usability, low weight, flexibility and reduced use of JavaScript.</p>
<p>I don't know what to think of the "design" of the website itself, which may change in future.</p>
<p>If you want to take a look at the theme, follow the link to the <a href="https://github.com/Penaz91/Essent10">Essent10 github repository</a>.</p>
<p>Thank you all for reading. See you next time!</p>
<p>Penaz.</p>Android, Accounts, Ottimizzatori, Modalità Sviluppatore e fastidi portatili2020-12-25T00:00:00+01:002020-12-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-12-25:/misc/android_accounts.html<p>Molti smartphone moderni arrivano nelle nostre case con ottimizzatori ed opzioni disattivate. Esploriamo come queste scelte possano infastidire uno sviluppatore.</p><h1>Molti smartphone moderni arrivano nelle nostre case con ottimizzatori ed opzioni disattivate. Esploriamo come queste scelte possano infastidire uno sviluppatore.</h1>
<p>Buongiorno a tutti,</p>
<p>È da un po' di tempo che faccio uso del mio smartphone anche per esigenze lavorative: occupandomi principalmente di sviluppo web, non esiste nessun emulatore che possa compararsi all'esperienza diretta di un'applicazione web su un dispositivo fisico.</p>
<p>Purtroppo come tutti i dispositivi commercialmente diffusi, gli smartphone arrivano con delle "impostazioni di fabbrica" che potrebbero non essere adatte ad un utente avanzato; questo non è un problema fintanto che tali impostazioni possano essere cambiate ed il software non continui ad infastidire l'utente per ripristinare tali "impostazioni di fabbrica".</p>
<p>La triste realtà è che non sempre tali impostazioni sono semplici da cambiare, né tanto meno il software "accetta di buon grado" le nostre scelte. Nella mia esperienza ho trovato diverse istanze in cui questo accade, oltre ad altri "fastidi" che riassumerò in questo post.</p>
<h2>Ottimizzatori</h2>
<p>Nei dispositivi venduti al giorno d'oggi (tranne alcuni basati su versioni Android "pure") troverete sicuramente un "ottimizzatore": un'applicazione dedicata alla pulizia periodica delle cache, dei file ingombranti ed in alcuni casi effettuare una scansione di sicurezza.</p>
<p>Tale applicazione (che alcuni possono ritenere di dubbia utilità) solitamente semplifica operazioni tranquillamente effettuabili tramite le impostazioni di sistema di android, ma diventa un enorme fastidio quando entrano in gioco alcune meccaniche.</p>
<h3>Punteggi</h3>
<p>Gran parte degli ottimizzatori offerti dai produttori danno un "punteggio" di performance al tuo dispositivo, per dare un'idea della situazione; ma tale punteggio viene molte volte "truccato" perchè le tue scelte "non si allineano" con quanto previsto dal produttore.</p>
<p>Cambiare il launcher con qualcosa di diverso da quello del produttore porta ad un abbassamento del punteggio, così come la decisione di non utilizzare il loro servizio cloud; il tutto diventa quasi una sorta di "pubblicità occulta", dove viene impiantata l'idea "se non usi i nostri prodotti il tuo smartphone è inferiore".</p>
<h3>"Riparazioni" automatizzate</h3>
<p>A volte mi capita di dover usare la modalità di Debug tramite USB per android, ed ogni singola volta che vado ad effettuare una manutenzione periodica, la modalità sviluppatore viene disattivata e con essa anche il debug USB.</p>
<p>Ogni volta che voglio collegare la modalità debug remota di Firefox, devo effettuare nuovamente la procedura di attivazione della modalità sviluppatore, riattivare il debug USB e ricollegare il telefono. Veramente fastidioso.</p>
<h2>Software Preinstallato</h2>
<p>Grandissima parte dei dispositivi in vendita al giorno d'oggi arriva con software preinstallato che potrebbe non servirci (backup cloud automatico, trasferimento dati, browser alternativi, ...), in diverse forme: in alcuni casi è già parte del sistema, in altri viene scaricato successivamente da Play Store, in maniera automatica.</p>
<p>Tale software è considerato "software di sistema" e non può essere disinstallato in alcun modo senza un "root" del telefono (operazione che può risultare rischiosa e può portare ad una decadenza della garanzia). Al massimo è possibile disinstallare gli aggiornamenti di tali software e "disattivare" l'applicazione, però tale applicazione continuerà ad occupare spazio sul nostro dispositivo.</p>
<p>Penso il fornire del software "di fabbrica" sia una buona idea dal lato del "supporto alla clientela": l'utente ha un prodotto pronto all'uso e comunque la maggior parte degli utenti userà il software preinstallato; ma ritengo che "bloccare" tale software sul telefono sia una pratica deplorevole che rinforza il concetto del "usa i nostri prodotti o subirai conseguenze negative" (in questo caso lo spazio sprecato).</p>
<h2>Contratti di licenza</h2>
<p>Ulteriore pratica fastidiosa è quella di costringere l'utente ad accettare un contratto di licenza e/o privacy per consentire l'uso di una certa applicazione. Tale pratica è ancora più preoccupante quando devo accettare un'informativa privacy su software che non ha motivo (nelle sue funzionalità principali) di elaborare dati al di fuori del mio dispositivo.</p>
<p>Non dovrei accettare un'informativa privacy per un file manager, e se tale applicazione si interfaccia con servizi in cloud, dovrei avere la possibilità di fare opt-in per tali servizi (cioè il software inizialmente è impostato con i servizi disattivati, ed eventualmente decido io di attivarli). Stesso discorso per un player audio locale, o un player video.</p>
<p>Questo si collega al fatto che <em>nessuno</em> legge i contratti di licenza dalla testa al fondo (non mentire, non li hai letti nemmeno tu), in alcuni casi potremmo ritrovarci ad aver accettato contratti che consentono al produttore profiling a scopi commerciali, tracciamento ed altro senza rendercene conto.</p>
<p>L'alternativa è l'impossibilità di usare il software preinstallato, con conseguente spreco di spazio, dato che non può essere disinstallato.</p>
<h2>Account-Gating</h2>
<p>Un'altra pratica che ho rilevato è quella che io chiamo "account-gating", l'atto di limitare l'accesso ad una funzionalità dietro all'accesso ad un account del produttore. Questo pone diversi quesiti e problemi che accentuano il fastidio di usare un dispositivo smartphone come sviluppatore.</p>
<h3>L'ennesimo account</h3>
<p>Come sviluppatore ed appassionato di informatica, ho un sacco di account attivi su diversi servizi più o meno usati. Essere costretto a creare ancora un altro account solo per poter usare delle caratteristiche di un prodotto che ho pagato è veramente molto fastidioso.</p>
<p>Un'altra password da gestire, altre email commerciali che verranno ricevute uniti al fatto che alcune impostazioni comunque subiscono un reset da parte degli "ottimizzatori", questo mi fa perdere la voglia di usare il mio smartphone.</p>
<h3>Privacy</h3>
<p>Per i più patiti della privacy, la creazione di un nuovo account comporta il rilascio di alcuni dati: sicuramente un indirizzo email, altre volte anche nome e cognome. Inoltre anche il solo accesso all'account può dare al produttore informazioni su cosa stiamo facendo.</p>
<p>Se accediamo al nostro account perchè vogliamo attivare la modalità sviluppatore, il produttore lo saprà, potrà ipotizzare che siamo uno sviluppatore o che comunque abbiamo una certa expertise nel campo degli smartphone. Questo rientra in uno schema di profilazione che personalmente non gradisco.</p>
<h2>Conclusioni</h2>
<p>Alcuni potrebbero dire che queste tattiche vengono usate per "semplificare" e "tenere al sicuro" l'utenza, a cui io rispondo che esistono già diversi sistemi per "tenere al sicuro" l'utente.</p>
<p>La modalità sviluppatore è nascosta, e non è immediata da attivare, esistono avvertimenti dei pericoli all'attivazione del debug USB: non è necessario forzare l'utente ad accedere ad un account "per la propria sicurezza", semplicemente non riesco a trovarne il motivo.</p>
<p>Nel mio dispositivo ho trovato diverse istanze di "punteggi" ed "account-gating", soprattutto per la modalità sviluppatore, l'installazione di applicazioni tramite USB (nel caso stessi sviluppando una app per android) e, nei casi più estremi, uno sblocco del bootloader (alcuni potrebbero voler cambiare sistema operativo o "fare un refresh" del proprio telefono).</p>
<p>A mio parere non esiste una ragione tecnica per l'uso di queste tattiche, se non per esercitare forme di controllo sulla propria utenza e/o per scopi di profilazione commerciale.</p>
<p>Personalmente tutte queste tattiche di profilazione mi fanno sentire più "una risorsa commerciale" che una persona, il che è a suo modo umiliante.</p>
<p>Grazie per aver letto. Alla prossima.</p>
<p>Penaz.</p>Android, Accounts, Optimizers, Developer Mode and other portable nuisances2020-12-25T00:00:00+01:002020-12-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-12-25:/en/misc/android_accounts.html<p>Many modern smartphones enter our homes with optimizers and some disabled options. Let's see how these choices can annoy a developer.</p><h1>Many modern smartphones enter our homes with optimizers and some disabled options. Let's see how these choices can annoy a developer.</h1>
<p>Hello everyone,</p>
<p>I have been using my smartphone for my job since a big of time ago: being mainly a web developer, there is no emulator that can compare to direct experience on a physical device, when it comes to testing an application.</p>
<p>Sadly, like all widely available devices, smartphones come to us with some "factory settings" that may not suit an advanced user; this is not a problem if such settings can be easily changed and the software doesn't annoy the user to "go back to factory settings".</p>
<p>The sad reality is that such settings may not be easy to change, and the software doesn't "willingly accept" our choices. In my daily use, I found some instances of this behaviour, as well as other "nuisances" that I will summarize in this post.</p>
<h2>Optimizers</h2>
<p>Inside the devices currently sold (besides some based on "pure" android editions) you will surely find an "optimizer": an app dedicated to periodic maintenance, like cleaning your app cache, cleaning some of the larger files and in some cases even do a "security scan".</p>
<p>Such app (that someone may consider useless) usually simplifies some things that can be done from the android system settings without much trouble, but such app becomes a huge nuisance when some mechanics come into play.</p>
<h3>Scores</h3>
<p>Many optimizers that are offered by manufacturers shell out a "score" for your device's performance, just to give a rough idea of the current situation; but such score is "tweaked" in many situations when your choices "don't align" with what the manufacturer wants.</p>
<p>Changing your launcher with something other than the manufacturer's will reduce your score, as well as not using their cloud services; everything becomes sort of a "covert advertisement", where the "if you don't use our products, your smartphone is less worthy" idea is pushed onto us.</p>
<h3>Automatic "Repairs"</h3>
<p>Sometimes I need to use the USB Debugging mode on android, and every single time I go and do a periodic maintenance, the developer mode gets disabled, and with that the USB debug.</p>
<p>Every time I want to connect Firefox's remote debugger, I need to re-enable the developer mode, re-enable the USB debug and re-connect my smartphone. It's really annoying.</p>
<h2>Bundled Software</h2>
<p>The great majority of devices sold today comes with bundled software that we may not need (automatic backups on the cloud, data transfer, alternative browsers, ...), installed in different ways: sometimes they're part of the system, other times they get automatically downloaded from Play Store.</p>
<p>Such software is considered "system software" and cannot be uninstalled in any way, unless you "root" your device (which can be dangerous and may void your warranty). At most you can uninstall the app updates and then "disable" the app, though such app will continue to waste space on our device.</p>
<p>I think giving "bundled software" is a good thing for customers: many users will have their phone ready to use and the majority of users uses bundled software anyway; but I think that "locking" such software on the device is a regrettable choice that strengthens the concept of "use our products or there will be consequences" (in this case, wasted space).</p>
<h2>License Agreements</h2>
<p>Another annoying thing is forcing the user to accept a license and/or privacy agreement to allow them to use a certain app. Such practice is even more worrisome when I have to accept a privacy disclaimer for software that has no reason (in its main function) to process data outside my device.</p>
<p>I shouldn't need to accept a privacy disclaimer for a file manager, and if such app integrates with some cloud services, I should have the choice to opt-in on such services (that means the software has such services disabled by default, and I will decide if I want to activate them). Same goes for a local audio player, or a video player too.</p>
<p>This links to the fact that <em>nobody</em> reads license agreements from top to bottom (don't lie, you never read them either), in some cases we may find ourselves accepting agreements that allow the manufacturer to profile us for marketing purposes, tracking and more; without realizing.</p>
<p>The alternative is not being able to use bundled software, with consequential waste of space, since we cannot uninstall such software.</p>
<h2>Account-Gating</h2>
<p>Another really annoying practice I found is what I call "account-gating", limiting the access of a feature and forcing the user to access their account on the manufacturer's website. This raises some questions and issues that only exacerbate the nuisance of using a smartphone as a developer.</p>
<h3>Yet another account</h3>
<p>As a developer and IT aficionado, I have lots of active accounts on many different services that I may use or not. Being forced to create yet another account just to be able to use some features of a product I paid is really annoying.</p>
<p>Yet another password to manage, yet more marketing emails that I will receive join the fact that some settings will still be reset by "optimizers", this really makes me want to stop using my device.</p>
<h3>Privacy Concerns</h3>
<p>For the people that are concerned about privacy, creating a new account entails giving out some data: a web address is needed, sometimes you will need to use your first and last name. Moreover, even the mere accessing an account can give the manufacturer information about what we are doing.</p>
<p>If we access our account because we want to activate developer mode, the manufacturer will know about it, and will be able to hypothesize that we are a developer or someone that has some expertise in the field of smartphone devices. This is part of a profiling habit that I do not appreciate the slightest.</p>
<h2>Conclusions</h2>
<p>Some may say that such tactics are used to "simplify" and "keep users safe", and my answer is that there are systems to "keep the user safe" already implemented.</p>
<p>Developer mode on android is hidden, its activation method is not really straightaway, there are warnings displayed when activating USB debug: you don't need to force a user to sign in "for their safety", I really can't find a valid reason.</p>
<p>In my personal device I found many instances of "scores" and "account-gating", mostly for developer mode, installing applications via USB (in the case I develop for Android) and, in the more "extreme" cases, unlocking the bootloader (some people may want to change OS or "refresh their devices").</p>
<p>In my opinion, there is no technical reason for using these tactics, if not to exercise control over the users and/or for market profiling purposes.</p>
<p>These profiling methods make me feel like a "resource" more than a person, which is in its way humiliating.</p>
<p>Thank you for reading. See you next time.</p>
<p>Penaz.</p>Teorie cospirazioniste nell'era digitale2020-10-17T00:00:00+02:002020-10-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2020-10-17:/misc/digital_conspiracies.html<p>La situazione odierna nel mondo ha visto un forte aumento di negazionismi e teorie cospirazioniste, diamo un'occhiata a come funzionano e come Internet ha finito per influenzare la visione di così tante persone.</p><h1>La situazione odierna nel mondo ha visto un forte aumento di negazionismi e teorie cospirazioniste, diamo un'occhiata a come funzionano e come Internet ha finito per influenzare la visione di così tante persone.</h1>
<p>Salve a tutti, quanto tempo!</p>
<p>La situazione corrente nel mondo è... particolare... ed una cosa che abbiamo notato e vissuto sulla nostra pelle è l'aumento di popolarità delle teorie cospirazioniste. In questo piccolo testo daremo un'occhiata alle fallacie logiche coinvolte, a come l'era della comunicazione digitale abbia finito per rinforzare il problema e semplicemente imparare a pensar meglio.</p>
<p>Partiamo!</p>
<h2>Le teorie cospirazioniste sono interessanti!</h2>
<p>Questa non è formalmente una fallacia, ma è comunque possibile legarla ad uno dei nostri meccanismi mentali. Prima di tutto le teorie cospirazioniste ci fanno pensare di vivere in un mondo molto più interessante: come un film in cui persone malvagie mettono a rischio la vita della gente per guadagno personale.</p>
<p>La noia è una cosa difficile da sopportare, e faremmo di tutto per rendere la nostra vita più interessante, e le teorie cospirazioniste marciano su tale concetto.</p>
<p>Ancor peggio, le teorie cospirazioniste tendono ad essere fumose, lasciano un sacco di spazio alla fantasia, per poter raggiungere la loro conclusione; inoltre non hanno propriamente un modo ripetibile di provare la propria teoria.</p>
<p>Ed è qui che Internet fa il suo ingresso: riceviamo una grande massa di informazioni in un tempo molto breve, e molte volte non leggiamo tutto e semplicemente lo condividiamo.</p>
<h2>Le teorie cospirazioniste giocano con i nostri pregiudizi cognitivi</h2>
<p>Ogni persona ha dei pregiudizi cognitivi, siamo fatti così.</p>
<p>Uno dei pregiudizi cognitivi più grandi che abbiamo è il "pregiudizio di proporzionalità", che può essere riassunto nella frase:</p>
<blockquote>
<p>Grandi eventi hanno grandi cause.</p>
</blockquote>
<p>Solitamente ciò non è vero, gli incidenti capitano con la stessa probabilità a persone normali, a VIP e ufficiali governativi. La maggior parte delle volte, un incidente è semplicemente un incidente.</p>
<h2>La fallacia del carrozzone</h2>
<p>L'era di Internet ci ha portato un sacco di belle cose: comunicazioni veloci, informazione e negli ultimi 10 anni abbiamo i cosiddetti "social networks".</p>
<p>Comunità di individui con visioni simili del mondo possono essere vittima della "fallacia del carrozzone", che possiamo esprimere come:</p>
<blockquote>
<p>Molta gente ci crede, quindi deve essere vero.</p>
</blockquote>
<p>Più grande è il numero di persone che crede in qualcosa, più veritiera tale cosa appare. Se tutti iniziassimo a credere di poter infrangere la legge di gravità, la gravità continuerà ad esistere ed a tenere i nostri piedi a terra.</p>
<h2>Le teorie cospirazioniste sono auto-sigillanti</h2>
<p>Questa è una fallacia che possiamo esprimere con la frase:</p>
<blockquote>
<p>Se non sei contro la cospirazione, allora ne sei parte</p>
</blockquote>
<p>Questo è il cosiddetto "falso dilemma" (anche detto "falsa dicotomia" o "mentalità bianco e nero"): la teoria raggruppa tutto in due categorie distinte e mutuamente esclusive: o sei con noi, o sei contro di noi.</p>
<p>La presenza di community molto strette che rinforzano la mentalità "noi contro loro" su Internet, rinforzato dalla fallacia del carrozzone rinforza ulteriormente il problema.</p>
<h2>Le teorie cospirazioniste possono dire di tutto</h2>
<p>Tutto ciò che viene detto da una teoria cospirazionista assume il fatto che la cospirazione esista.</p>
<p>Questo è detto "ex falso quod libet": data una premessa falsa qualsiasi conclusione è vera (questa è una proprietà fondamentale dell'implicazione logica), alcune volte viene chiamata "principio di esplosione".</p>
<p>Le teorie cospirazioniste partono dall'assunzione che la cospirazione esista per poter costruire le proprie argomentazioni.</p>
<h2>Le teorie cospirazioniste cercano relazioni spurie</h2>
<p>Le teorie cospirazioniste tendono a confondere "correlazione" e "causa", proponendo una "correlazione" in veste di "causa interessante".</p>
<p>La maggior parte delle volte, c'è un "anello mancante" che connette gli argomenti e ci da una miglior visione delle cose.</p>
<p>Prendiamo un esempio famoso: "Le torri 5G causano il coronavirus" (<strong>non è vero!</strong>)</p>
<p>Alcune persone potrebbero portarti delle mappe che confrontano la diffusione del coronavirus e la diffusione del 5G; e tali mappe sono molto simili, facendoci raggiungere la conclusione di cui sopra.</p>
<p>Se invece guardiamo una terza mappa, con la densità di popolazione, noteremo che è molto simile alle prime due. Perchè?</p>
<p>La risposta è semplice: viene data priorità di diffusione del 5G nelle aree più popolate, per servire più persone ed abbassare i costi. Inoltre i virus si diffondono più velocemente in aree più densamente popolate.</p>
<p>Facendo uso delle tecnologie e dei sistemi statistici fornitici dall'era digitale, possiamo trovare relazioni più in fretta e più facilmente, basta che guardiate la pagina in inglese <a href="https://tylervigen.com/spurious-correlations">tylervigen.com</a> e ne costruiate una da voi!</p>
<h2>Le teorie cospirazioniste fanno appello ad "esperti"</h2>
<p>Molte volte vedrete un "esperto" che vi riempie di informazioni. Non è così che funziona la scienza, nella scienza non vi è un "principio di autorità", ho addirittura scritto un post al riguardo: <a href="https://penazarea.altervista.org/misc/Authority.html">Sul principio di autorità, miti ed Informatica</a>.</p>
<p>Con le nuove tecnologie è veramente semplice creare prodotti che sembrano ufficiali, oltre a creare produzioni così ben fatte da dare più credibilità ai produttori. Tale "finta credibilità" può rinforzare la credibilità di "falsi esperti".</p>
<h2>Le teorie cospirazioniste mischiano un sacco di fallacie informali</h2>
<p>Spostare l'onere della prova, appello all'emozione, ragionamenti circolari, petitio principii, argomenti fantoccio, tu quoque (conosciuto come "appello all'ipocrisia", solitamente riconoscibile dalla frase "ma anche...")...</p>
<p>Le teorie cospirazioniste usano così tante fallacie che non posso elencarle tutte.</p>
<h2>Le teorie cospirazioniste fanno leva sulla tua mancanza di conoscenza</h2>
<p>Per quanto intelligenti e ben istruiti possiamo essere, non possiamo sapere tutto. Sono uno sviluppatore software decente, ma non so nulla di come si costruisce un aeroplano, o come si effettua un'operazione chirurgica.</p>
<p>L'educazione protegge dalle teorie cospirazioniste, perchè se qualcosa non ha senso, ce ne accorgiamo subito. Prendiamo un esempio che mi è capitato personalmente.</p>
<p>Ho visto un video cospirazionista sul 5F (ma guarda un po!) condiviso da una mia conoscenza: questo video collega la connessione 3G al cancro al cuore, e mostra (vado a memoria):</p>
<blockquote>
<p>una stanza di test dove dei ratti sono posti ad 1 metro di distanza attorno ad un'antenna che emette radiazioni ad 1.8GHz di potenza.</p>
</blockquote>
<p>Avete notato l'errore?</p>
<p>1.8GHz non è una misura di potenza, è una frequenza. È come dire "ti colpirò 1.8 miliardi di volte al secondo" senza dire se ti colpirò con un pugno (con conseguente atomizzazione del tuo corpo) o con un getto d'aria alquanto delicato (con conseguente e giustificato fastidio da parte tua).</p>
<p>Il video non esprime alcuna misura di potenza, se l'antenna emettesse 1MW (Watt è la misura di potenza in questo caso) ad 1 metro di distanza, probabilmente il cancro si sviluppa nei ratti, ma andrebbe a distruggere l'argomento del video, siccome i cellulari 3G emettono radiazioni di potenza molto inferiore (il calcolo dei valori SAR è complicato e diverso tra Stati Uniti ed Europa, quindi non entro nei particolari).</p>
<p>Inoltre 3G e 5G sono tecnologie completamente differenti: 3G fa uso di grandi torri per coprire grandi aree con una grande potenza, mentre il 5G usa un sacco di antenne più piccole che emettono una potenza estremamente inferiore (sto semplificando da morire).</p>
<p>Alcuni potrebbero lamentarsi che il 5G faccia uso di nuove frequenze: questo non è propriamente vero, in realtà fa uso di frequenze precedentemente dedicate alla TV digitale, è come allargare una strada rimuovendo il marciapiede.</p>
<p>Questo video è stato condiviso su Facebook, il che ci porta ad un altro problema: l'ammontare di informazioni non può essere filtrato, qualcosa inevitabilmente passa attraverso i filtri.</p>
<h1>Come possiamo proteggerci?</h1>
<p>Questa è l'era digitale, dove masse di contenuti ci raggiungono e dedichiamo sempre meno tempo ad ogni singolo contenuto. Quando qualche teoria (o notizia!) ci raggiunge, facciamoci delle domande:</p>
<ul>
<li>Arriva da una sorgente che posso reputare affidabile?</li>
<li>Sta cercando di sollevare una reazione emotiva da parte mia?</li>
<li>È provata? (Potresti voler cercare una "meta-analisi" sulla materia, non un singolo studio)</li>
<li>Esiste una ragione più realistica per quanto detto?</li>
<li>Ho una conoscenza sufficiente della materia per giudicarne la veridicità?</li>
</ul>
<p>Con tempo e dedizione, diverrà sempre meno difficile distinguere tra ciò che è "probabilmente vero" e ciò che è "probabilmente una teoria cospirazionista", ed imparare ad impedire a persone che nemmeno conosciamo di giocare con le mostre menti.</p>
<p>In questo caso, la tecnologia può esserci d'aiuto, dato che i social networks stanno iniziando a segnalare contenuti dannosi, come le teorie cospirazioniste, che potrebbero avere serie ramificazioni (sia politiche che di salute pubblica).</p>
<h1>Conclusioni</h1>
<p>Esistono un sacco di altre domande che possiamo porci e non è assolutamente possibile porle tutte e rispondervi.</p>
<p>Questo post inoltre è molto debolmente legato alla tecnologia, nonostante questo sia un blog primariamente tecnologico. Questo è semplicemente un flusso di coscienza nella speranza di far pensare la gente; un posto provocato anche da eventi ed esperienze personali.</p>
<p>La tecnologia digitale è con noi da un sacco di tempo ed ha reso le nostre vite molto più semplici, ci ha fatto conoscere un sacco di gente nuova, ma è anche un'arma a doppio taglio da trattare con i guanti, così come qualsiasi altro strumento comunicativo.</p>
<p>Le teorie cospirazioniste hanno cavalcato l'onda di Internet e si sono diffuse a macchia d'olio, raggiungendo sempre più persone che cercano risposte ad eventi senza precedenti, un capro espiatorio, una "bolla" in cui vivere, con i le proprie convinzioni mai messe in discussione, oppure semplicemente la ricerca di una via d'uscita dalla noia quotidiana che è andata troppo in là.</p>
<p>Grazie per aver letto.</p>Conspiracy Theories in the digital age2020-10-17T00:00:00+02:002020-10-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2020-10-17:/en/misc/digital_conspiracies.html<p>The current situation in the world has seen a huge rise in conspiracy theories and negationism, let's take a look at how they work and how the Internet influenced the views of so many people.</p><h1>The current situation in the world has seen a huge rise in conspiracy theories and negationism, let's take a look at how they work and how the Internet influenced the views of so many people.</h1>
<p>Hello everyone, long time no see.</p>
<p>The current world situation is... particular... and one thing we all have seen and experienced closely is the rise in popularity of conspiracy theories. In this small piece we'll take a look at the logical fallacies usually involved in conspiracy theories, how the age of digital communication and the Internet have exacerbated the issue and just learn to think better.</p>
<p>Here we go!</p>
<h2>Conspiracy theories are interesting!</h2>
<p>This is not a formal fallacy, but it can be tied to one of our minds' mechanisms. First of all, conspiracy theories makes us think we live in a way more interesting world: like a movie where there are evil people who put people's lives in danger for personal gain.</p>
<p>Boredom is a hard thing to deal with, and we'd do almost anything to spruce up our lives, and conspiracy theories tie into that.</p>
<p>Even more, conspiracy theories tend to behave like smokescreens, they leave a lot of "blank space" for our minds to reach their conclusion and they don't have a really sound, repeatable way of proving themselves.</p>
<p>This is where the Internet comes in: we receive a lot of information in a very short time, and many times we don't read everything and just pass it on.</p>
<h2>Conspiracy Theories play into our cognitive biases</h2>
<p>Every person has some cognitive biases, that's how we just are.</p>
<p>One of our biggest cognitive biases is the "proportionality bias", which can be summarized with the following phrase:</p>
<blockquote>
<p>Big events must have big causes.</p>
</blockquote>
<p>This is usually not true, accidents happen with the same probability to normal people as they happen to VIPs or government officials. Most of the time, an accident is just what it is: an accident.</p>
<h2>The Bandwagon Fallacy</h2>
<p>The age of the Internet brought us a lot of nice things: fast communication, information and in the last 10 years we got "social networks".</p>
<p>Communities of similar-minded individuals can be victim of the "bandwagon fallacy", which we can express as:</p>
<blockquote>
<p>Many people believe it, so it must be true.</p>
</blockquote>
<p>The higher the number of people that believe something is, the more truthful such thing seems. If we all suddenly started believing we could defy gravity, gravity would still exist and keep our feet on the ground.</p>
<h2>Conspiracy Theories are self-sealing</h2>
<p>This is a fallacy can be expressed with the following phrase:</p>
<blockquote>
<p>If you are not against the conspiracy, then you are part of the conspiracy</p>
</blockquote>
<p>This is what is called a "false dilemma" (sometimes called "false dichotomy" or "black or white fallacy"): the conspiracy theory puts everything in two distinct and mutually exclusive categories: either you're with us, or against us.</p>
<p>Having tight-knit communities that reinforce the "us versus them" on the Internet, reinforced by the bandwagon fallacy expressed above just exhacerbates the issue.</p>
<h2>Conspiracy theories can say anything</h2>
<p>Anything the conspiracy theories say take in account that the conspiracy actually exists.</p>
<p>This is called a "ex falso quod libet": given a false premise any conclusion is true (this is a fundamental property of Material Implications in logic), sometimes this is also called "Principle of explosion".</p>
<p>Conspiracy theories start assuming the conspiracy exists, to be able to build their own argument.</p>
<h2>Conspiracy theories look for spurious relationships</h2>
<p>Conspiracy theories tend to confuse "correlation" and "causation", by giving an "interesting causation" from some "correlations".</p>
<p>Most of the time, there is a "missing element" that connects the dots and gives us a better view of things.</p>
<p>Let's take a famous example: "5G towers cause coronavirus" (<strong>they do not!</strong>)</p>
<p>Some people may bring you maps comparing the coronavirus spread and the 5G towers rollout and they would look really similar, thus reaching the conclusion above.</p>
<p>If we check a third map with the population density, we will find that it looks really similar to the first two maps. How so?</p>
<p>Simple: 5G rolls out in more densily populated areas, to serve more people and lower costs. Also viruses spread faster in denser areas.</p>
<p>With new technologies and statistic systems given to us by the digital age, now we can find relationships faster and more easily, just see the page dedicated to them at <a href="https://tylervigen.com/spurious-correlations">tylervigen.com</a> and build one yourself!</p>
<h2>Conspiracy theories appeal to "experts"</h2>
<p>Many times you will see an "expert" filling you with information. This is not how science works, in science there is no "principle of authority", I even wrote a post about it: <a href="https://penazarea.altervista.org/en/misc/Authority.html">On the principle of authority, myths and IT</a>.</p>
<p>With the newer technologies it is really easy to create some production that looks official and create well-made products that give the producers more credibility. Such "faked credibility" can also boost "fake experts".</p>
<h2>Conspiracy theories mix and match a lot of informal fallacies</h2>
<p>Shifting the burden of proof, appeal to emotion, circular reasoning, begging the question, strawman arguments, tu quoque (also known as "appeal to hypocrisy" and its variant "whataboutism")...</p>
<p>Conspiracy theories make use of so many of these that I cannot possibly list them all.</p>
<h2>Conspiracy theories leverage on your lack of knowledge</h2>
<p>As intelligent and educated as we can be, we do not know everything. I am a decent software developer, but I know nothing of how a plane is built, or how a surgery is performed.</p>
<p>Education protects you from conspiracy theories, because if something doesn't make sense, it will ring all the bells in your head. Let's take an example that happened to me personally.</p>
<p>I saw a conspiracy video on 5G (go figure!) shared by an acquaintance: this video links 3G connectivity and heart cancer, and shows (I'm quoting from memory and translating):</p>
<blockquote>
<p>a test chamber where rats were put at 1 meter of distance around an antenna emitting at 1.8 GHz of power.</p>
</blockquote>
<p>Did you see the error?</p>
<p>1.8GHz is not a measure of power, it's a frequency. This is like saying "I'm going to hit you 1.8 billion times a second" without stating if I would hit you with a punch (thus probably atomizing you) or a slightly delicate puff of air (thus thoroughly annoying you).</p>
<p>The video expressed no real mention of power, if the antenna emitted 1MW (Watt is the measure of power in this case) at 1 meter cancer would probably develop in rats, but also it would defeat the purpose of the video, since 3G mobile phones emit a lot lower power than that (calculating SAR values is complicated and differs between US and Europe, so I will not delve into it).</p>
<p>Also 3G and 5G are completely different technologies: 3G uses big towers to cover large areas with high power, while 5G uses lots of smaller antennas that emit a lot less power (I am massively oversimplifying here).</p>
<p>Some would complain about the fact that 5G uses new frequencies: this is not true, it merely uses frequencies that were once dedicated to digital TV, it's the same as enlarging a road by repurposing the sidewalk.</p>
<p>This video was shared on Facebook, which brings us to another problem: the sheer amount of content cannot be all filtered, some will inevitably slip through.</p>
<h1>How can we protect ourselves?</h1>
<p>This is the digital age, where masses of content reach us and we dedicate every one of them less and less time. When some theory (or news!) reaches us, let's ask ourselves some questions:</p>
<ul>
<li>Does it come from a reputable source?</li>
<li>Is this trying to elicit an emotional response from me?</li>
<li>Is it proven? (You want a "meta-analysis" on the matter, not just a single study)</li>
<li>Is there a more realistic reason for what is stated?</li>
<li>Do I know enough about the matter to be able to judge its truthfulness?</li>
</ul>
<p>With some time and dedication, it will become less and less difficult to distinguish what is "likely true" to what is "probably a conspiracy theory", and learn to stop people we don't even know from playing with our minds.</p>
<p>In this case, technology can come to our help, since social networks are starting to flag damaging content such as some conspiracy theories that may have ramifications (either political or in public health).</p>
<h1>Conclusions</h1>
<p>There are lots of other questions that we can ask ourselves and we cannot ask and answer them all.</p>
<p>This post is also very loosely tied to technology, this being a technology-first blog. This is just a stream of consciousness in the hopes to incite some thoughts to people, also given by some personal experiences and events.</p>
<p>Digital Technology has been with us for a while and made our lives a lot easier, made us know a lot of new people, but it is also a double-edged sword and should be treated with care, as any other media.</p>
<p>Conspiracy theories have ridden the wave of the Internet and spread far and wide, reaching more and more people who look for a response for unprecedented events, a scapegoat, a "bubble" where to live in, with their thoughts unchallenged or maybe just a way out of their daily boredom and ended up going too far.</p>
<p>Thank you for reading.</p>Game Bytes: aD&D The forgotten realms: Eye of the Beholder2020-08-07T00:00:00+02:002020-08-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2020-08-07:/game-bytes/Game_Bytes_Eye_Of_Beholder.html<p>Un dungeon crawler in prima persona basato su Dungeons & Dragons? Datemelo!</p><h1>Un dungeon crawler in prima persona basato su Dungeons & Dragons? Datemelo!</h1>
<p>"aD&D The forgotten realms: Eye of the Beholder" (da qui in poi EOB) è un dungeon crawler in prima persona sviluppato da Westwood Associates e pubblicato da Strategic Simulations Inc. che ha luogo nell'universo di Dungeons & Dragons, usando una delle primissime versioni delle regole (THAC0, mai sentita?).</p>
<h2>Grafica</h2>
<p>La grafica è fantastica per i tempi, il gioco consente di selezionare tra diverse modalità video compatibili (CGA, EGA e VGA, per esempio) e gli ambienti pseudo-3d sono veramente ben disegnati, i dettagli minuti possono nascondere bottoni e compartimenti segreti in cui puoi trovare cibo e armi.</p>
<h2>Installazione e Performance</h2>
<p>Installare il gioco tramite il client GOG Galaxy è assolutamente indolore e le performance sono molto buone, grazie a DosBox. Nota di merito a GOG per aver creato un bel strumento di configurazione che aiuta a cambiare le impostazioni di base del gioco e della propria DosBox collegata.</p>
<h2>Comparto Sonoro</h2>
<p>Il suono è tipico dell'era DoS, grezzo e semplice. Il gioco non ha musica (a parte nelle schermate di presentazione), e veramente pochi suoni (come le porte, i colpi ed i passi dei mostri).</p>
<p>Questo non vuol dire che il gioco manchi di suono, in realtà questa mancanza aggiunge all'atmosfera. Se stessi esplorando un dungeon, sicuramente non avresti un lettore MP3 con te.</p>
<p>Di nuovo il gioco consente la selezione tra lo speaker del PC (il cosiddetto "beeper"), una scheda AdLib/SoundBlaster, il sistema a 3 canali Tandy oppure semplicemente nessun suono.</p>
<h2>Gameplay</h2>
<p>Il gioco è un dungeon crawler 3D controllato tramite mouse. Fai uso della GUI per tutto, dalla gestione dell'inventario al combattimento.</p>
<p>Il movimento nel dungeon è più immediato usando il tastierino numerico (4,6 per spostarsi lateralmente, 5,8 per avanti/indietro e 7,9 per voltarsi a destra/sinistra) ma se ti ritrovi un mostro davanti dovrai sbrigarti a rimettere la mano destra sul mouse.</p>
<p>Il gameplay è... goffo. Il gioco sta in quel posto sbagliato tra un gioco a turni ed un gioco d'azione in tempo reale, rendendolo un gioco a turni dove i turni scorrono ogni secondo. Dopo un po' ci si fa l'abitudine, e l'atmosfera del gioco, così come la varietà di cose che si possono fare e la dimensione stessa dei dungeon e del gioco stesso valgono la fatica.</p>
<p>Preparatevi: <strong>sicuramente</strong> vi perderete nei dungeons.</p>
<h2>Conclusione</h2>
<p>EOB è vecchio e goffo, ma in realtà è invecchiato molto bene. Il gioco è godibile e ti sorprende positivamente. Suggerimento personale: usate un automapper come "All seeing eye", che aiuta molto nell'esplorazione dei dungeon e nel riconoscere i teletrasporti nascosti (anche se il segnale più evidente è la bussola che cambia direzione).</p>
<p>Come al solito, il punteggio va da 0 (il gioco dovrebbe essere distrutto dal raggio mortale di un Beholder) a 100 (questo gioco potrebbe essere il tesoro alla fine del dungeon).</p>
<p>Il punteggio che gli assegno è: <strong>88/100</strong>, da vedere coi vostri occhi.</p>
<p>Grazie ancora per la lettura, ci si vede nel prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "DOS",
"applicationCategory": "RPG",
"name": "aD&D: Eye of the Beholder"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "88",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: aD&D The forgotten realms: Eye of the Beholder2020-08-07T00:00:00+02:002020-08-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2020-08-07:/en/game-bytes/Game_Bytes_Eye_Of_Beholder.html<p>A first person dungeon crawler based on Dungeons & Dragons? Sign me up!</p><h1>A first person dungeon crawler based on Dungeons & Dragons? Sign me up!</h1>
<p>"aD&D The forgotten realms: Eye of the Beholder" (from now on EOB) is a first person dungeon crawler developed by Westwood Associates and published by Strategic Simulations Inc. that takes place in the Dungeons & Dragons universe, using the earlier editions of its ruleset (THAC0, anyone?).</p>
<h2>Graphics</h2>
<p>Graphics are great for the era, the game allows to select between many compatible video modes (CGA, EGA and VGA, for instance) and the pseudo-3d environments are really well-drawn, minute details can hide buttons or secret compartments you can find weapons and food.</p>
<h2>Setup and Performance</h2>
<p>Installing the game via the GOG Galaxy is absolutely painless and performance is really good, thanks to DosBox. One note goes to GOG for creating a nice setup tool that allows to easily configure the basic settings for the game and its DosBox.</p>
<h2>Sounds</h2>
<p>Sounds are the typical quality of the DoS era, crunchy and simple. The game has no music (besides on the presentation screens), only very few sounds (like doors, hits and steps of the monsters).</p>
<p>This doesn't mean the game sounds "lacking" (pun intended), it actually adds to the atmosphere. If you were exploring a dungeon, you wouldn't have an MP3 player with you.</p>
<p>Again the game allows to select between the PC speaker (the beeper), AdLib/SoundBlaster, Tandy 3-voice system or no sound at all.</p>
<h2>Gameplay</h2>
<p>The game plays like a 3D dungeon crawler controlled with your mouse. You use the GUI to take care of everything, from inventory management to combat.</p>
<p>Movement can be easier to do using the keypad (4,6 to strafe left/right, 5,8 to go forwards/backwards, 7,9 to turn left/right) but if you find a monster in front of yourself, you will have to put your right hand back on the mouse.</p>
<p>The gameplay is a bit... clunky. The game is in that wrong place between a turn-based game and a real-time action game, making it a turn-based game where turns change every second. But after a while, you get used to it, and the atmosphere of the game, as well as the variety of things you can do and the sheer size of the dungeons and the game itself make the game just worth it.</p>
<p>Also be prepared: you <strong>will</strong> get lost in dungeons.</p>
<h2>Conclusion</h2>
<p>EOB is old and clunky, but it actually aged really really well. The game is overall enjoyable and surprises you positively. My personal suggestion is to use an automapper like "All seeing Eye", which helps a lot in exploring the dungeons and recognizing hidden teleporters (even though the biggest sign of those is your compass changing).</p>
<p>As usual, the score goes from 0 (this game should be terminated by a Beholder's death ray) to 100 (this game may as well be the treasure at the bottom of the dungeon).</p>
<p>My score is: <strong>86/100</strong>, truly a sight to behold.</p>
<p>Thanks again for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "DOS",
"applicationCategory": "RPG",
"name": "aD&D: Eye of the Beholder"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "88",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Il sorgente di VVVVVV arriva su GitHub.2020-01-16T00:00:00+01:002020-01-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-01-16:/misc/VVVVVV_Github.html<p>Il codice sorgente di VVVVVV arriva su GitHub, e come questo ha cambiato il mio punto di vista su molte cose.</p><h1>Il codice sorgente di VVVVVV arriva su GitHub, e come questo ha cambiato il mio punto di vista su molte cose.</h1>
<p>Buongiorno a tutti,</p>
<p>All'arrivo del nuovo anno, con il messaggio di commit "Hello WWWWWWorld!", il codice sorgente del gioco VVVVVV è approdato su GitHub.</p>
<p>VVVVVV è uno dei miei giochi preferiti, e da programmatore non ho potuto esimermi dal guardare tale codice, cercando di carpire tecniche e strutture che hanno portato all'uscita di quello che è stato quasi universalmente etichettato come "un gran gioco", nel suo piccolo.</p>
<p>Quello che ho visto, però, è risultato essere ben lontano dalle mie attese iniziali.</p>
<p>Leggere questo codice è stato un'emozione unica, mista ad una punta disappunto, con qualche goccia di amarezza e critica. Ma alla fine di tutto è stata un'epifania, uno scossone emotivo di cui forse tutti i programmatori hanno bisogno una volta nella vita.</p>
<p>Mi spiego.</p>
<p>La pubblicazione di questo codice sorgente è l'equivalente di aprire il vaso di Pandora, rimuovendo quel "velo" che fa sembrare il gioco un'opera di ingegno eccezionale.</p>
<p>Dietro a tal velo, invece, si nascondono funzioni per convertire valori booleani in stringhe, "switch" con centinaia di "case" (immaginate centinaia di condizionali, concatenati) e file sorgenti monolitici di 7000 righe.</p>
<p>Il codice è indiscutibilmente poco strutturato, non fa uso di grandi pattern che possano migliorarne la manutenibilità, non ha nemmeno una struttura separata dedicata alla gestione dei menu.</p>
<p>Ma se pensiamo oltre al mero codice, è perfettamente accettabile che sia così.</p>
<p>Il gioco è pubblicato, funziona bene ed è divertente.</p>
<p>Quale lezione possiamo ricavare da questo? Un codice ben strutturato permette una grande manutenibilità nel futuro di un prodotto. E la mancanza di una struttura solida può determinare la morte di tal prodotto (a meno che non si operi un profondo refactoring). Ma se lo sviluppatore resta imbrigliato in una rete infinita di "miglioramenti strutturali", senza apportare nulla alla sostanza (il gameplay, nel caso dei videogiochi), il prodotto non vedrà mai la luce del giorno.</p>
<p>Questo vale anche per le nostre conoscenze, io personalmente ne sono colpevole al 100%, personalmente sono incagliato in un'infinita battaglia per la conoscenza prima di "gettarmi nello sviluppo" di un videogioco.</p>
<p>Ad un certo punto è necessario fermare la corsa alla conoscenza ed iniziare a scrivere codice.</p>
<p>E come possiamo vedere, non è necessario avere grandi strutture di codice per creare un gioco di successo. Certo, tali strutture aiutano, soprattutto nell'ottica di espandere il gioco nel futuro, ma tali strutture devono essere al nostro servizio, e non essere un altro ostacolo all'oggi nella speranza di un domani migliore.</p>
<p>A volte è necessario semplicemente rimboccarsi le maniche e provarci.</p>
<p>Grazie a tutti per aver letto questo primo articolo dell'anno. Alla prossima!</p>
<p>Penaz.</p>VVVVVV's source code comes on GitHub.2020-01-16T00:00:00+01:002020-01-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2020-01-16:/en/misc/VVVVVV_Github.html<p>VVVVVV's source code came on GitHub, and how this changed my point of view on many things.</p><h1>VVVVVV's source code came on GitHub, and how this changed my point of view on many things.</h1>
<p>Hello everyone,</p>
<p>Along with the new year, with the commit message "Hello WWWWWWorld!", the source code of the game "VVVVVV" landed on GitHub.</p>
<p>VVVVVV is one of my favourite videogames, and as a programmer I just couldn't avoid taking a peek at such code, trying to understand the techniques and structures that brought us something that is almost-universally labeled as "a great game", in it own small way.</p>
<p>What I saw, though, was very far from my expectations.</p>
<p>Reading such code has been a unique experience, mixed with a dash of disappointment, some drops of bitterness and critique. But in the end it was an epiphany, an emotional shake that maybe all programmers need once in their lives.</p>
<p>Let me explain.</p>
<p>Publishing this source code is equivalent to open Pandora's Box, removing a "veil" that makes a videogame look like an exceptional engineering feat.</p>
<p>Behind such veil, instead, functions to convert booleans into strings, "switch" statements with hundreds of "case" (think about hundreds of concatenated conditionals) and monolithic 7000-lines source files are hiding.</p>
<p>The code is arguably lacking structure, doesn't use huge patterns that allow for greater maintenance, it doesn't even have a dedicated structure to manage menus.</p>
<p>Although, if we think beyond the mere code, this is perfectly acceptable.</p>
<p>The game is shipped, works well and it's fun.</p>
<p>What kind of lesson can we get from this? A well-structured code allows for a great maintainability in the future of a product. And lacking a solid structure can effectively kill such product (unless you do a huge refactoring work). But if the developer is tied in an endless net of "structural improvements", without anything of substance being shipped (gameplay, in the case of a videogame), the product will never see the light of day.</p>
<p>This reasoning stands when it comes to knowledge too, I am 100% guilty of being stuck in an endless battle for knowledge before "diving myself" into developing a videogame.</p>
<p>There comes a time where we need to stop our "knowledge rush" and start writing code.</p>
<p>As we can see, we don't need to have great code structures to create a successful game. Sure, such structures will help, specially if you want to expand on the game in the future, but such structures must be at our service, and not be yet another obstacle for today's deeds, hoping for a better tomorrow.</p>
<p>Sometimes it's just necessary to roll up your sleeves and try.</p>
<p>Thanks to everyone for reading the first post of the year. See you next time!</p>
<p>Penaz.</p>Game Bytes: Undertale2019-12-01T00:00:00+01:002019-12-01T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-12-01:/game-bytes/Game_Bytes_Undertale.html<p>Un gioco dove la scelta è tutto con una recensione dove la scelta è tutto.</p><h1>Un gioco dove la scelta è tutto con una recensione dove la scelta è tutto.</h1>
<p><strong>Avviso:</strong> Questa recensione contiene alcuni "micro-spoiler" che potrebbero rovinare l'esperienza di gioco, tali spoiler saranno nascosti, e potete visualizzarli passandovi sopra il mouse oppure toccandoli:</p>
<p><span class="spoiler">Ciao! Sono uno spoiler!</span></p>
<hr>
<p>Undertale è un gioco unico nel suo genere, è un GDR che inizia con la nostra caduta nel "mondo dei mostri" e dovremo farci strada per uscire.</p>
<h2>Grafica</h2>
<p>La grafica è semplicistica e non fa urlare al capolavoro, ma i punti forti del gioco sono altri.</p>
<h2>Installazione e Prestazioni</h2>
<p>L'installazione da Steam è assolutamente indolore e le prestazioni sono ottime, considerata la semplicità del gioco.</p>
<h2>Comparto sonoro</h2>
<p>Qui è dove il gioco inizia a mostrare i muscoli, Toby Fox ha creato delle tracce fantastiche e memorabili che accompagneranno il nostro viaggio, con anche alcune chicche nascoste (<span class="spoiler">ad esempio, la traccia di Asgore contiene elementi della musica di Toriel, moglie di Asgore</span>).</p>
<p>I suoni sono buoni, ricordando l'era 8 bit, ma non limitandosi strettamente al genere.</p>
<h2>Gameplay e Storia</h2>
<p>La caratteristica principe del gioco è che per proseguire nel gioco non è necessario combattere contro i mostri (<span class="spoiler">anzi, se fate una partita perfettamente pacifica sarete ricompensati lautamente</span>), mettendo a disposizione delle opzioni "combatti", "azione non violenta", "inventario" e "risparmia" e funzionando come un GDR a turni.</p>
<p>Le vostre azioni hanno effetto sull'andamento del gioco (<span class="spoiler">anche oltre le aspettative</span>), il che rende le nostre decisioni importanti (<span class="spoiler">ad esempio le conseguenze di una partita in cui non si lascia alcuna traccia di mostri sul proprio cammino</span>).</p>
<p>Durante la storia il gioco riuscirà a sorprendervi ed a ribaltare tutti i preconcetti che avete sul gioco stesso.</p>
<h2>Conclusione</h2>
<p>Questa recensione è volutamente breve e <strong>volutamente</strong> vaga, giusto per incuriosirvi, vi lascio semplicemente con il punteggio finale.</p>
<p>Come al solito, il voto va da 0 (il gioco è un ottimo combustibile da barbecue) a 100 (tutti gli esseri umani ed i loro animali domestici dovrebbero possedere una copia del gioco).</p>
<p>Il mio giudizio è: <strong>99/100</strong></p>
<p>Grazie ancora a tutti per aver letto, e ci vediamo al prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "RPG",
"name": "Undertale"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "99",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Undertale2019-12-01T00:00:00+01:002019-12-01T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-12-01:/en/game-bytes/Game_Bytes_Undertale.html<p>A game where choice is everything now has a review where choice is everything.</p><h1>A game where choice is everything now has a review where choice is everything.</h1>
<p><strong>Warning:</strong> This review contains some "micro-spoilers" that could potentially ruin your gaming experience, those spoilers will be hidden, and you can temporarily view them by hovering them with your cursor or by tapping on it:</p>
<p><span class="spoiler">Hi! I'm a spoiler!</span></p>
<hr>
<p>Undertale is a unique game, it's an RPG that starts by us falling in the "world of monsters" and we will need to make our way through it to its exit.</p>
<h2>Graphics</h2>
<p>Graphics are really simple and they won't make you scream "masterpiece", but the game's strong points are others.</p>
<h2>Setup and Performance</h2>
<p>Installing the game via Steam is absolutely painless and performance is really good, considering the game's simplicity.</p>
<h2>Sounds</h2>
<p>This is where the game starts to flex its muscles, Toby Fox made some fantastic and memorable score that will accompany us in our journey. The score has some hidden things too (<span class="spoiler">for instance, Asgore's track contains some elements of Toriel's music, Toriel being Asgore's wife</span>).</p>
<p>Sound is good, reminiscent of the 8 bit era, but doesn't limit itself to that genre.</p>
<h2>Gameplay and Story</h2>
<p>The main feature of the game is that you don't need to fight anyone to be able to progress (<span class="spoiler">actually, you will be handsomely rewarded for a fully pacifist run</span>), giving us the "fight", "act", "item" and "spare" options and behaving exactly like a turn-based RPG.</p>
<p>Our actions will have an effect on the game (<span class="spoiler">sometimes surpassing our expectations</span>), which means our decisions are important (<span class="spoiler">for instance the consequences of a run where we don't leave anyone alive</span>).</p>
<p>While the story progresses, the game will surprise us and manage to flip on its head every single concept we had on the game itself.</p>
<h2>Conclusion</h2>
<p>This review is willingly short and <strong>willingly</strong> vague, just to make you curious to try it, I'll just leave you with the final score.</p>
<p>As usual, the score goes from 0 (this game is great as barbecue fuel) to 100 (all humans and their pets should have a copy of the game).</p>
<p>My score is: <strong>99/100</strong></p>
<p>Thanks again for reading, see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "RPG",
"name": "Undertale"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "99",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: System Shock Enhanced Edition2019-11-19T00:00:00+01:002019-11-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-11-19:/game-bytes/Game_Bytes_SystemShock.html<p>Immergiamoci negli orrori di Citadel Station con un classico dei giochi DOS, rivisto e migliorato!</p><h1>Immergiamoci negli orrori di Citadel Station con un classico dei giochi DOS, rivisto e migliorato!</h1>
<p>Un horror in tema cyberpunk con elementi che ricordano i giochi di ruolo? Roba vecchia! Precisamente del 1994.</p>
<p>System Shock è un gioco d'azione in prima persona con elementi di sparatutto, puzzle ed horror. Ci ritroveremo intrappolati in una stazione spaziale cercando di sopravvivere a mutanti e robot sotto il comando dell'intelligenza artificiale S.H.O.D.A.N. la quale ha completamente perso il controllo.</p>
<h2>Grafica</h2>
<p>La grafica risulta un po' datata, ma le texture migliorate della enhanced edition rinfrescano l'aspetto mantenendo comunque le proprie radici del gioco per DOS.</p>
<p>Le sprite fanno uso della tecnica "billboarding" (tutte le sprite sono rivolte verso il giocatore da tutte le angolazioni), come DOOM 1 e 2.</p>
<h2>Installazione e Prestazioni</h2>
<p>L'installazione da GOG (tramite il client Galaxy) è indolore e le prestazioni sono buone anche su PC di fascia medio-bassa.</p>
<p>Per i migliori risultati possibili però sarà necessario tuffarsi in alcune modifiche non troppo difficili, ma che richiedono comunque un minimo di attenzione (vedi prossima sezione).</p>
<h2>Comparto sonoro</h2>
<p>Il comparto musicale è assolutamente <strong>misero</strong>. Ma non è colpa del gioco.</p>
<p>Il gioco fa uso di tracce audio MIDI create per girare sotto una scheda Sound Blaster 16, purtroppo il sintetizzatore MIDI di windows fa ridere i polli; le tracce sono piatte e mancano di strumenti (oppure tali strumenti sono a volume talmente basso da essere inudibili).</p>
<p>Fatevi un grosso favore ed installate un sintetizzatore MIDI decente, come <a href="http://coolsoft.altervista.org/en/virtualmidisynth">VirtualMidiSynth</a> e scaricare un buon soundfont (io mi sono trovato discretamente con <a href="https://fatboy.site">Fatboy</a> ma alcuni consigliano WeedsGM3 o Giant Soundfont).</p>
<p>Gli effetti sonori sono tipici dell'era DOS, soddisfacenti ed ispessiscono l'atmosfera del gioco.</p>
<p>La voce di S.H.O.D.A.N. è molto sintetica e "difettosa", aumentando l'impressione di una Intelligenza Artificiale impazzita. La cadenza e le parole mettono il giocatore a disagio.</p>
<h2>Gameplay</h2>
<p>Il gameplay originale è ostico, difficile da capire ed a tratti frustrante; in quanto non è disponibile il mouse-look (come negli FPS moderni) ma è possibile mirare con il mouse mentre allo stesso tempo il mouse può essere usato in tempo reale per gestire il proprio inventario.</p>
<p>La Enhanced Edition ha aggiunto "il sacro tasto E" che permette di passare dalla modalità "FPS" (con mouse-look) alla modalità "gestione inventario", premendo il tasto E. Questo migliora notevolmente la giocabilità.</p>
<p>Il gioco permette di selezionare il livello di difficoltà in ciascuna delle 4 aree principali: missioni, combattimento, puzzle e cyberspazio; garantendo una flessibilità che non si vede spesso.</p>
<p>Le missioni nello cyberspazio costituiscono una rottura dalla monotonia dell'esplorazione e dello shooting, mettendo a disposizione spazi in wireframe da navigare con tutti e 6 i gradi di libertà, il che può risultare in un po' di confusione.</p>
<h2>Conclusione</h2>
<p>Se volete provare un gioco che ha fatto la storia dell'horror e dello shooting, System Shock è sicuramente un'opzione da provare, sempre che giochiate con tutte le semplificazioni e le comodità introdotte dalla versione Enhanced.</p>
<p>Il giudizio finale, come al solito, va da 0 (lanciate questo gioco nello spazio siderale) a 100 (il possesso di questo gioco dovrebbe essere parte di tutte le convenzioni internazionali dal 1800 ad oggi).</p>
<p>Il mio giudizio è: <strong>90/100</strong></p>
<p>Grazie ancora a tutti per aver letto, e ci vediamo al prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, DOS",
"applicationCategory": "Shooter",
"name": "System Shock Enhanced Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "90",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: System Shock Enhanced Edition2019-11-19T00:00:00+01:002019-11-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-11-19:/en/game-bytes/Game_Bytes_SystemShock.html<p>Let's dive into the horrors of Citadel Station with a classic DOS game, revised and enhanced!</p><h1>Let's dive into the horrors of Citadel Station with a classic DOS game, revised and enhanced!</h1>
<p>A cyberpunk-themed horror with RPG elements? That's old stuff! From 1994, to be precise.</p>
<p>System Shock is a first person action game with shooting, puzzle and horror elements. We will find ourselves trapped in a space station, trying to survive against mutants and robots under the control of S.H.O.D.A.N., an artificial intelligenze that went rogue.</p>
<h2>Graphics</h2>
<p>Graphics are dated, but the better textures from the enhanced edition give a fresher look while keeping it rooted into the DOS game.</p>
<p>Sprites use the "billboarding" technique (all sprites are facing the player from all angles), like DOOM 1 and 2.</p>
<h2>Setup and Performance</h2>
<p>Setup from GOG (via the Galaxy client) is painless and performance is good even on low-end PCs.</p>
<p>For the best result it will be necessary to dive into some modifications that are not too hard, but still require a bit of attention (see next section).</p>
<h2>Sounds</h2>
<p>Music is absolutely <strong>miserable</strong>. But it's not the game's fault.</p>
<p>The game uses MIDI tracks that have been created to work with a Sound Blaster 16 sound card, sadly Windows's MIDI synth is laughable; music comes out as flat and some instruments are completely missing (or such instruments are at such a low volume they are impossible to hear).</p>
<p>Do yourself a huge favour and install a decent MIDI synth, like <a href="http://coolsoft.altervista.org/en/virtualmidisynth">VirtualMidiSynth</a> and download a good (I liked <a href="https://fatboy.site">Fatboy</a> but some suggest WeedsGM3 or Giant Soundfont).</p>
<p>Sound Effects are typical from the DOS era, satisfactory and they just add to the game's atmosphere.</p>
<p>S.H.O.D.A.N.'s voice is really synthetic and "glitchy", giving even more the impression of a rogue AI. Its speech patterns and words put the player in a continuous state of uneasiness.</p>
<h2>Gameplay</h2>
<p>The original gameplay is tough, hard to understand and frustrating at times; since you don't have any mouse-look (like modern FPS) but you can still aim with your mouse while managing your inventory in real time.</p>
<p>The Enhanced Edition added "the sacred E button", which allows to switch from "FPS mode" (with mouse-look) to "Inventory mode", by pressing the E button. This improves playability a lot.</p>
<p>The game allows to select the difficulty level in any of the 4 main areas: missions, combat, puzzle and cyberspace; guaranteeing a flexibility that is not often seen in games.</p>
<p>Cyberspace missions break the shooting and exploration monotony, allowing you to explore spaces made up from wireframe, using all 6 degrees of freedom, which can result in some confusion.</p>
<h2>Conclusions</h2>
<p>If you want to try a game that made history of the horror and shooting genre, System Shock is surely something you should try, if you play with the comforts offered by the Enhanced Edition.</p>
<p>The final judgement, as usual, goes from 0 (shoot this game into outer space) to 100 (possession of this game should be part of all international conventions since the 1800).</p>
<p>My score is: <strong>90/100</strong></p>
<p>Thanks again for reading and see you in the next post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, DOS",
"applicationCategory": "Shooter",
"name": "System Shock Enhanced Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "90",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Penaz's Area si libera di molti pesi2019-11-18T00:00:00+01:002019-11-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-11-18:/misc/No_Tracking.html<p>Penaz's Area si libera di tracciatori, cookies e banner</p><h1>Penaz's Area si libera di tracciatori, cookies e banner</h1>
<p>Buongiorno a tutti,</p>
<p>A seguito della conferma dell'entrata in vigore della CCPA (nuova legge Californiana sulla protezione della privacy), ho deciso che è arrivato il momento di smetterla di correre dietro a leggi con acronimi poco pronunciabili.</p>
<p>Da oggi Penaz's Area è un sito completamente privo di cookies, analytics, e banner. I social links disponibili sono creati staticamente alla pubblicazione degli articoli e non contengono tracciatori.</p>
<p>L'unico script presente ed attivo è quello che consente alla barra di ricerca di aprire una scheda con DuckDuckGo per cercare nel blog.</p>
<p>Proseguirò nel mio tempo libero a cacciare e sterminare eventuali tracciatori e script che sono sopravvissuti al processo di pulizia.</p>
<p>Grazie per aver letto, alla prossima!</p>
<p>Penaz</p>Penaz's Area gets rid of many burdens2019-11-18T00:00:00+01:002019-11-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2019-11-18:/en/misc/No_Tracking.html<p>Penaz's Area gets rid of trackers, cookies and banners</p><h1>Penaz's Area gets rid of trackers, cookies and banners</h1>
<p>Hello Everyone,</p>
<p>After the confirmation that CCPA (The California consumer privacy act) will come into force, I decided it's time to stop chasing laws that are identified by not-so-pronounceable acronyms.</p>
<p>Starting today, Penaz's Area is a completely cookie, analytics and banner-free website. The available social links are statically created when the articles are created and don't contain trackers.</p>
<p>The only active script is the one that allows the search bar to open a tab with DuckDuckGo so you can search around the blog.</p>
<p>In my free time I will keep hunting and exterminate possible trackers and scripts that survived the cleaning process.</p>
<p>Thank you for reading, see you next time!</p>
<p>Penaz</p>Un nuovo progetto, un esperimento, un'esperienza di insegnamento e di apprendimento2019-07-18T00:00:00+02:002019-07-18T00:00:00+02:00Penaztag:penazarea.altervista.org,2019-07-18:/misc/2DGDF0TH.html<p>Breve presentazione di "2D Game Development: From Zero To Hero": un progetto che mi piacerebbe veder crescere</p><h1>Breve presentazione di "2D Game Development: From Zero To Hero": un progetto che mi piacerebbe veder crescere</h1>
<p>Buongiorno a tutti,</p>
<p>Oggi vorrei parlare di una piccola idea che ho avuto nella testa per diverso tempo e che solo poco tempo fa (insieme ad alcuni amici) ho deciso di mettere in pratica.</p>
<p>Tale idea ha preso forma nel progetto che ho chiamato "2D Game Development: From Zero To Hero": essenzialmente un libro riportante le mie conoscenze (e nel futuro spero quelle di molti altri) nell'ambiente dello sviluppo di videogiochi 2D.</p>
<p>Il libro si articola in diverse sezioni, tra cui:</p>
<ul>
<li>Alcune basi di logica, matematica ed informatica,</li>
<li>Introduzione al "Game Loop",</li>
<li>Rilevamento e reazione alle collisioni,</li>
<li>Bilanciamento dei giochi,</li>
<li>Creazione dei propri assets,</li>
<li>Game Jams,</li>
<li>Generazione procedurale,</li>
<li>Patterns e contenitori,</li>
<li>Motori, frameworks, risorse gratuite di apprendimento,</li>
<li>Marketing del proprio gioco,</li>
<li>Molto altro...</li>
</ul>
<p>L'obiettivo è ottenere una risorsa usabile da chiunque, senza avere conoscenze specifiche riguardanti lo sviluppo di videogiochi, che consenta di imparare i principi base per la creazione di un videogioco.</p>
<h2>Quale linguaggio di programmazione verrà usato?</h2>
<p>Il libro principalmente farà uso di pseudocodice, ma ho deciso di dare la possibilità di "tradurre" il codice in diversi linguaggi, selezionabili modificando il file <code>metadata.yml</code>. Questo consente di ottenere diverse versioni di questo libro, perfettamente adatte alle conoscenze del lettore, a fronte di una maggiore difficoltà (ma neanche troppo alta) nella scrittura dello stesso.</p>
<p>Per ora i linguaggi disponibili sono:</p>
<ul>
<li>Pseudocodice</li>
<li>Python</li>
</ul>
<h2>In che lingua è disponibile il libro?</h2>
<p>Per la massima copertura, il libro sarà scritto in inglese, ma nulla impedisce di effettuare un fork del progetto e scriverne una versione in un'altra lingua.</p>
<h2>Esisterà una versione stampata?</h2>
<p>Oltre alla versione che sarà stampata dal singolo, non esisteranno versioni stampate, soprattutto per una decisione sul fronte della licenza. Inoltre una risorsa che sperabilmente avrà un ciclo di aggiornamenti molto breve (molti cambiamenti in poco tempo), non avrebbe molto senso stampare.</p>
<h2>Quale Licenza è usata?</h2>
<p>Il libro è distribuito con licenza Creative Commons BY-NC (Attribuzione-Non Commerciale), questo permetterà a tutti di contribuire, vedere il proprio contributo elencato nel libro e non ritrovarsi con il proprio lavoro pubblicato da qualche azienda con pochi scrupoli senza autorizzazione.</p>
<p>Questo tipo di licenza non è considerata una licenza "Free Culture" (Cultura libera) a causa della limitazione "non commerciale", ma penso sia un buon compromesso.</p>
<h2>Quanto Lungo sarà il libro?</h2>
<p>Questo non posso dirlo, ma per ora abbiamo già superato le 70 pagine!</p>
<h2>Perchè hai creato questo progetto?</h2>
<p>Perchè no? Ritengo un ottimo modo di imparare qualcosa sia cercare di insegnarlo, ed è quello che sto facendo: sto imparando nuove tecniche, ricerco, cerco di spiegare e riporto nel libro.</p>
<p>In futuro spero che qualcun altro che abbia conoscenze diverse dalle mie contribuisca al libro così che io possa imparare qualcosa in più.</p>
<p>Il libro diverrebbe un'esperienza di insegnamento e di apprendimento allo stesso tempo.</p>
<p>Se volete leggere o contribuire <a href="https://gitlab.com/Penaz/2dgd_f0th">aprite la repo gitlab</a>, il progetto è disponibile anche su <a href="https://github.com/Penaz91/2DGD_F0TH">questa repo github</a>.</p>
<p>Grazie per aver letto, alla prossima!</p>
<p>Penaz</p>A new project, an experiment, a teaching and learning experience2019-07-18T00:00:00+02:002019-07-18T00:00:00+02:00Penaztag:penazarea.altervista.org,2019-07-18:/en/misc/2DGDF0TH.html<p>Short introduction of "2D Game Development: From Zero To Hero": a project I would love to see grow</p><h1>Short introduction of "2D Game Development: From Zero To Hero": a project I would love to see grow</h1>
<p>Hello everyone,</p>
<p>Today I would like to talk about a small idea that has been in my head for a long time and that only a little ago (with the help of a couple friends) I decided to put into practice.</p>
<p>That idea took the form of a project that I called "2D Game Development: From Zero To Hero": which is essentially a book containing my knowledge (and in future many other peoples' hopefully) about 2D game development.</p>
<p>This book is composed of different sections, among them we find:</p>
<ul>
<li>Some basics of Logic, Maths and computer science,</li>
<li>Introducing the "Game Loop",</li>
<li>Detecting and reacting to collisions,</li>
<li>Balancing games,</li>
<li>Creating your own assets,</li>
<li>Game Jams,</li>
<li>Procedural generation,</li>
<li>Patterns and containers,</li>
<li>Engines, Frameworks, free resources to learn,</li>
<li>Marketing your game,</li>
<li>Much More...</li>
</ul>
<p>The objective is obtaining a resource that anyone can use, without specific prior knowledge about game development, that allows to learn the base principles of game development itself.</p>
<h2>Which programming language will be used?</h2>
<p>The book will mainly use pseudocode, but I decided to give the chance to people of "translating" the code in many languages, which can be selected by editing the <code>metadata.yml</code> file. This allows to have different versions of this book, perfectly tailored to the reader's prior knowledge, even though contributing might be a bit harder (but not even that much harder anyway).</p>
<p>For now, the available programming languages are:</p>
<ul>
<li>Pseudocode</li>
<li>Python</li>
</ul>
<h2>Which language is the book written in?</h2>
<p>To have maximum coverage, the book will be written in English, but nothing stops anyone from forking the project and write a version in a different language.</p>
<h2>Will there be a printed version?</h2>
<p>Besides the version the single person will print for themselves, there won't be any printed version of the book, mostly because of license. Also considering this is a resource that will have a really short update cycle (lots of changes in little time), printing wouldn't make sense.</p>
<h2>What's the book license?</h2>
<p>The book is distributed with Creative Commons BY-NC (Attribution-Non Commercial) license, this will let everyone contribute and see their contribution listed in the book, without risking their work getting published by some shady company without any permission.</p>
<p>This license is not considered a "Free Culture" license, because of the "non commercial" limitation, but I think this is a good compromise.</p>
<h2>How long will the book be?</h2>
<p>I can't say, but for now, it's over 70 pages long already!</p>
<h2>Why did you create this project?</h2>
<p>Why not? I think a great way to learn things is to try to teach them, and this is what I'm doing: I'm learning new techniques, I research, I try to explain and then I write them in the book.</p>
<p>In a not-so-distant future I hope someone else will have different knowledge and will contribute to the book, so that I can learn something more.</p>
<p>This book would become a teaching experience as well as a learning one at the same time.</p>
<p>If you want to try and read or contribute <a href="https://gitlab.com/Penaz/2dgd_f0th">open the gitlab repo</a>, the project is also available on <a href="https://github.com/Penaz91/2DGD_F0TH">this github repo</a>.</p>
<p>Thank you for reading, see you next time!</p>
<p>Penaz</p>Riguardo al NON dar credito a creatori, sviluppatori, artisti, ...2019-05-31T00:00:00+02:002019-05-31T00:00:00+02:00Penaztag:penazarea.altervista.org,2019-05-31:/misc/No_credits.html<p>Una lamentela riguardante l'abitudine di certa gente di non dare a Cesare quel che è di Cesare</p><h1>Una lamentela riguardante l'abitudine di certa gente di non dare a Cesare quel che è di Cesare</h1>
<p><strong>Attenzione:</strong> Questa è una lamentela, infarcita di risentimento e mancanza di fiducia in qualunque cosa che circondi l'oggetto di cui si tratta, prendetela per come viene, ho mantenuto il tutto molto fumoso per tutelare me stesso e l'oggetto della mia ira.</p>
<p>Non è nulla di nuovo che su internet esista gente che non riceva riconoscimento per il proprio lavoro, alcuni addirittura <strong>non vengono pagati</strong> per il lavoro fatto.</p>
<p>Questo è qualcosa che personalmente ho odiato abbastanza intensamente, ma mai avrei pensato di esserne personalmente vittima, e non avrei mai pensato potesse ferire la mia fiducia nel genere umano ed il mio orgoglio così pesantemente.</p>
<p>Oggi mi è stato riferito che una compagnia per cui ho lavorato, di cui non farò il nome per ovvie ragioni, si sono vantati di un determinato pezzo di software che ho sviluppato (del quale sono alquanto orgoglioso, anche se non è "l'incarnazione della perfezione"), dicendo che tale pezzo di software era "fantastico perchè fatto da loro".</p>
<p>Quando ho udito tali parole, il mio sangue è istantaneamente sublimato.</p>
<p>Onestamente avrei accettato volentieri che la compagnia avesse detto qualcosa sulla falsa riga di "è stato fatto da un nostro collaboratore nel passato", ma prendersi la proprietà di qualcosa che è dimostrabilmente <em>non</em> loro è una cosa che detesto profondamente.</p>
<p>Sono furioso.</p>
<p>Considerando che tale lavoro <strong>non è stato pagato</strong> e nemmeno <strong>accreditato</strong>, penso di avere tutti i diritti di essere in questo stato mentale chiamato "ira".</p>
<p>Diciamocela tutta, "pagare" qualcuno con "pubblicità" è un po' come dar loro "i soldi del monopoli", non vale molto, ma quando arrivi al punto di non voler nemmeno pagare coi "soldi del monopoli", abbiamo grattato il fondo del barile.</p>
<p>Ho letto articoli di recensori rimossi da un sito di recensioni per poi vedere i propri lavori attribuiti al gestore del sito (<a href="https://www.forbes.com/sites/erikkain/2017/04/17/brash-games-changed-review-scores-scrubbed-bylines/#bcbfa7060072">vedi l'articolo di forbes (in inglese)</a>), artisti a cui è promessa "pubblicità" da gente che vuole solo prodotti gratis, e così via.</p>
<p>Se chiedi ad un professionista qualcosa, <strong>paga per il lavoro fatto</strong> e se essi sono disposti a farsi pagare "in pubblicità", <strong>fate loro pubblicità</strong> e magari date qualche soldo solo per il fatto di aver accettato "pubblicità" come forma di pagamento!</p>
<p>Tristemente, sembra proprio che nel mondo del business, l'etica (leggete "decenza") non si applichi: lavori sodo per mesi e tutto ciò che ti viene promesso è pubblicità, passi ore a fare il pendolare per "soldi del monopoli", lavori mentre altri sono in vacanza e non ottieni <strong>nulla</strong>.</p>
<p>Neanche i soldi del monopoli.</p>
<p>Questo è quanto, buona giornata.</p>
<p>Penaz</p>On NOT crediting creators, developers, artists, ...2019-05-31T00:00:00+02:002019-05-31T00:00:00+02:00Penaztag:penazarea.altervista.org,2019-05-31:/en/misc/No_credits.html<p>A rant on some people's habit of not giving credit where credit is due</p><h1>A rant on some people's habit of not giving credit where credit is due</h1>
<p><strong>Warning:</strong> This is a rant, filled with resentment and lack of faith into whatever is tied to the subject at hand, reader's discretion is advised. I kept everything unclear to protect myself and the target of my wrath.</p>
<p>It isn't a new thing on the internet when people are not credited for their work, some are even go <strong>unpaid</strong> for the work they have done.</p>
<p>This is something I personally always had a good bit of hate for, but I would have never known it would hit me personally, and I would have never known how much it would hurt both my pride and faith in humanity.</p>
<p>Today I received word of a company I worked for, which I won't name for obvious reasons, prided themselves of having a certain piece of software I made (which I'm quite proud of, but is no "perfection incarnated"), saying that said piece of software was "great because they made it".</p>
<p>When I heard such words, my blood instantly sublimated.</p>
<p>Honestly I would have been ok with such company just stating that "it was made by a partner in the past", but taking ownership of something that is demonstrably <em>not</em> theirs is something I loathe.</p>
<p>I am livid.</p>
<p>Considering such work went <strong>unpaid</strong> and <strong>uncredited</strong>, I think I have all the rights to be in such mental state.</p>
<p>Let's face it, "paying" someone with "exposition" is a lot like giving them "monopoly money", it's not worth much, but when you're not even willing to pay "monopoly money" to someone, then we have reached a new low.</p>
<p>I've read articles about reviewers being removed from a review website and their works being attributed to the website owner (<a href="https://www.forbes.com/sites/erikkain/2017/04/17/brash-games-changed-review-scores-scrubbed-bylines/#bcbfa7060072">see the forbes article</a>), artists that have been promised "exposure" from people who just wanted free goods, so on and so forth.</p>
<p>If you ask a professional for something, <strong>pay for their work</strong> and if they are willing to trade for "exposition" <strong>give them exposition</strong> and maybe some money on top too just for the fact that they would accept "exposition" as payment!</p>
<p>Sadly, it really seems that in the world of business, ethics (read "basic human decency") don't apply: you work hard for months and all you get promised is exposure, you spend hours commuting for "monopoly money", you work while everyone else is on vacation and you get <strong>nothing</strong>.</p>
<p>Not even monopoly money.</p>
<p>That is all, have a good one.</p>
<p>Penaz</p>Sul principio di autorità, miti ed informatica2018-10-04T00:00:00+02:002018-10-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-10-04:/misc/Authority.html<p>Parliamo di alcuni miti nell'informatica, internet e del principio di autorità</p><h1>Parliamo di alcuni miti nell'informatica, internet e del principio di autorità</h1>
<p>Salve, dopo un lungo periodo di pausa sono tornato (sembra questi periodi di pausa stiano diventando la norma...)</p>
<p>Ogni giorno siamo sotto assedio da un enorme ammontare di informazioni: notizie, discussioni con gli amici e soprattutto i social media.</p>
<p>Alle volte può risultare difficile distinguere le informazioni reali da quelle fasulle o addirittura dannose, quindi oggi voglio parlare dell'informazione al giorno d'oggi, e magari farvi pensare un po' sull'argomento.</p>
<p>Quante volte avete visto uno show in TV che presenta una "rivoluzione" scientifica, o dove si parla di diete o ancora "rimedi naturali"? Soprattutto, quante volte questi programmi supportano le proprie tesi discutendone con un "esperto"?</p>
<p>Sembra che questi show vogliano consolidare le proprie tesi avendo un esperto nel campo che le supporti, però il cosiddetto "Principio di autorità", dove una tesi è considerata vera perchè qualcuno con autorità (titolo, o autorità politica che sia) ha esposto tale tesi, non vale in campo scientifico. Gli scienziati non si fidano ciecamente delle persone, vogliono essere convinti da prove e dimostrazioni.</p>
<p>Si può dire che la scienza sia una sorta di "scetticismo organizzati". E probabilmente è giusto considerarla tale.</p>
<p>Quante volte abbiamo visto un Premio Nobel venir citato a conferma di una determinata teoria? Facciamo un po' di nomi, così da distruggere questa "aura di autorità" una volta per tutte:</p>
<ul>
<li>James Dewey Watson - Nobel per la scoperta (insieme a Crick) della struttura del DNA - supporta <a href="https://www.sfgate.com/science/article/Nobel-Winner-s-Theories-Raise-Uproar-in-Berkeley-3236584.php">tesi razziste</a>, oltre all'asserire che <a href="https://www.newscientist.com/article/dn3451-stupidity-should-be-cured-says-dna-discoverer/">la stupidità è una malattia e come tale dovrebbe essere curata</a></li>
<li>Kary Mullis - Nobel per aver inventato la <a href="https://simple.wikipedia.org/wiki/Polymerase_chain_reaction">PCR</a> (strumento usato in praticamente tutti i laboratori di biologia al giorno d'oggi) - supporta il negazionismo del collegamento tra il virus dell'HIV e l'AIDS (nel <a href="https://books.google.it/books?id=MCAqomvRYNMC&pg=PA115&redir_esc=y#v=onepage&q&f=false">suo libro</a> pagine da 115 a 118 della versione inglese), anche quanto è stato provato che <a href="https://web.archive.org/web/20091124091249/http://www3.niaid.nih.gov/topics/HIVAIDS/Understanding/howHIVCausesAIDS/HIVcausesAIDS.htm">tale legame esiste</a>. Inoltre nel proprio libro ha ammesso di fare uso di LSD.</li>
<li>Linus Pauling - 2 Nobel (per la Pace e per la Chimica) - Sosteneva che la vitamina C potesse curare qualunque malattia, tesi che ha portato alla cosiddetta <a href="https://web.archive.org/web/20070202102734/http://www.bccancer.bc.ca/PPI/UnconventionalTherapies/VitaminTherapyMegadoseOrthomolecularTherapy.htm">"Medicina Ortomolecolare"</a> che è stata ovviamente confutata.</li>
</ul>
<p>Molte di queste idee sono state ovviamente testate (e confutate) dalla comunità scientifica, oltre semplicemente non potevano essere considerate idee serie.</p>
<p>Allarghiamo un attimo la nostra visione, quante volte la gente dice "[x] è vero" perchè "l'ha detto il presidente"? Scommetto molti, e queste persone saranno ancora più veementi nel supportare la tesi di "[x] è vero" quando tale tesi corrisponde alla visione del mondo di tali persone, come ad esempio il <a href="https://en.wikipedia.org/wiki/Conservatism_(belief_revision)">conservativismo</a>, o quando corrisponde alle visioni dei propri pari. Questo riflette rispettivamente la teoria del <a href="https://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a> e dell'<a href="https://en.wikipedia.org/wiki/Bandwagon_effect">effetto carrozzone</a>.</p>
<p>Questo è ciò che sta influenzando la nostra società: un enorme ammontare di informazioni, così grande che non possiamo (o vogliamo) processare razionalmente, così "regrediamo" al nostro modo di pensare più basilare, continuando a ricadere nei nostri pregiudizi. A volte tali pregiudizi possono essere talmente forti che i nostri cervelli (è una cosa naturale) rifiutino di considerare prove concrete che vadano contro le nostre credenze, non importa quanto solide siano tali prove.</p>
<p>L'opposto sta accadendo allo stesso tempo: qualcuno fa delle affermazioni fuori dell'ordinario, trova supporto da parte di alcune persone, le quali danno supporto alla tesi, e così l'idea sembra auto-validarsi (di nuovo: effetto carrozzone). Alcune istanze dell'effetto carrozzone sono movimenti anti-vaccinazione e terrapiattisti.</p>
<p>Altre fallacie a cui dovremmo fare attenzione sono il <a href="https://en.wikipedia.org/wiki/Begging_the_question">petitio principii</a>, dove le premesse di un argomento assumono che la conclusione sia vera, invece di supportarla; così come l'<a href="https://simple.wikipedia.org/wiki/Argument_from_ignorance">argumentum ad ignorantiam</a> (letteralmente "argomento da ignoranza"), dove la mancanza di prove contro una certa tesi è usata a supporto della veridicità della tesi stessa.</p>
<p>Per ulteriori informazioni, lascio un paio di link riguardanti <a href="https://en.wikipedia.org/wiki/Formal_fallacy">le fallacie formali e logiche</a> altre ad una <a href="https://en.wikipedia.org/wiki/List_of_cognitive_biases">lista dei pregiudizi cognitivi</a></p>
<p>Purtroppo coloro che hanno il compito di fornire alle persone una "dieta informativa" salutare hanno affrontato il problema dal lato sbagliato: hanno usato il loro tempo per confutare una tesi, il che risulta alquanto inutile, grazie ai pregiudizi cognitivi come il "conservativismo" ed il "confirmation bias". Questo ha scaricato l'onere della prova sulle testate giornalistiche, oltre ad altri che fanno informazione.</p>
<p>Ciò che dovrebbe essere fatto è chiedere a chi espone una tesi, di proporre prove a support, con fonti primarie e ricerche alla mano, e se tale persona non è in grado di dare prove empiriche questo dovrebbe automaticamente escludere tale tesi dal venir considerata. È difficile provare un negativo: la gravità è solo una teoria, ma non si vede gente volare in giro solo perchè è una teoria.</p>
<p>Supponiamo che io proponga la seguente tesi:</p>
<blockquote>
<p>Le lumache in realtà sono super veloci, ti giri e "bam": ecco che compare una lumaca! Le lumache vanno lente solo quando le osserviamo.</p>
</blockquote>
<p>Se chiedessi a qualcuno di confutare la mia teoria dovrebbe prima provare che le lumache sono coscienti della nostra presenza, poi che sono coscienti di cos'è la strumentazione scientifica, ecc... Staremmo qui a fare test per sempre, e la mia teoria non verrebbe mai veramente confutata per intero, perchè la gente troverà più e più difetti nel processo che porterebbe a confutare la teoria.</p>
<p>In realtà dovrei essere io a dire "ecco, ho un nastro che mostra una lumaca andare a mach-3 su sterrato" (...come?).</p>
<p>Chiedete sorgenti verificate, o ascoltate entrambe le parti in una discussione, ancora di più in politica. Scoprirete cose che non avreste mai pensato di scoprire. Nel caso politico, sorgenti non di parte come <a href="https://www.politifact.com/">politifact</a> sono uno strumento prezioso.</p>
<p>Per quanto riguarda l'informatica, un mito che detesto è "l'informatica non è roba da donne" - l'informatica non sarebbe la stessa senza le donne:</p>
<ul>
<li>Margareth Hamilton - Capo della squadra che ha sviluppato il software per Apollo, fonte <a href="http://news.mit.edu/2016/scene-at-mit-margaret-hamilton-apollo-code-0817">quest'articolo di MIT news</a></li>
<li>Ada Lovelace - Che ha lavorato al computer meccanico di Babbage, considerato il precursore dei computer moderni, vedi questo <a href="https://ieeexplore.ieee.org/document/1253887">Articolo IEEE</a></li>
<li>The women of ENIAC - che hanno lavorato su uno dei primi computer moderni, vedi <a href="http://eniacprogrammers.org/">eniacprogrammers.org</a></li>
<li>Carol Shaw - Ex designer di Videogiochi, sorgente <a href="http://www.vintagecomputing.com/index.php/archives/800">questo articolo di Vintage Computing and Gaming</a></li>
<li>Grace Hopper - Uno dei primi programmatori del computer Harvard Mark I, fonte <a href="http://content.yudu.com/A2qfj4/201403March/resources/3.htm?skipFlashCheck=true">questo articolo YUDU, a pagina 52</a> (Richiede Adobe Flash)</li>
</ul>
<p>Ecco che se ne va un'altro mito, ma ne esistono molti altri, nell'informatica e fuori da essa: miti sui membri della comunità LGBTQ+, sulle persone al di fuori del nostro paese, sulle malattie, sui computer, tecnologie in generale e gli umani in sè (avete già sentito de "gli umani usano il 10% del proprio cervello", vero?).</p>
<p>Ogni volta che qualcuno vi da una notizia, o dice qualcosa di fuori del seminato - <strong>chiedete delle prove</strong>, non importa quanto importante tale persona sia.</p>
<p>Non lasciate che vi venga scaricato l'onere di confutare tali idee, invece chiedete loro di provare le loro tesi da sé, ed osservate come falliranno.</p>
<p>Grazie mille per aver letto i miei pensieri sull'argomento ed ancora una volta, alla prossima!</p>
<p>Penaz.</p>
<p>Ringraziamento speciale va alla mia amica Sydney Rosen per le modifiche, integrazioni e miglioramenti di questo articolo, nella versione inglese.</p>On the principle of authority, myths and IT2018-10-04T00:00:00+02:002018-10-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-10-04:/en/misc/Authority.html<p>Let's talk about some myths in IT, the Internet, and the principle of authority</p><h1>Let's talk about some myths in IT, the Internet, and the principle of authority</h1>
<p>Hello, after a long hiatus I'm back (long breaks are becoming the norm here...).</p>
<p>Everyday we're under siege by a humongous amount of information: news, discussions with friends, and most of all social media.</p>
<p>Sometimes it can prove difficult to distinguish between real information and that which is untrue or even sometimes harmful, so today I want to talk about information as it is today, and maybe spark some thoughts about it.</p>
<p>How many times have you seen a TV show presenting a "breakthrough" in science, or even just talking about diets, or "natural remedies"? But most of all, how many times are these shows supporting their thesis by discussing it with an "expert"?</p>
<p>It seems that those shows want to make such theses more solid by having an expert in the field support it, however, the "Principle of Authority", where a thesis is considered true because someone important said it, is not valid in scientific fields. Scientists don't trust people at face value, they like to be convinced with proof and demonstrations.</p>
<p>We can say that science is "Organized Skepticism", in a way. And that's probably a correct thing to say.</p>
<p>How many times have we seen a Nobel Prize winner being quoted about something, as to confirm a theory? Let's list a couple here, just to break this "authority aura" once and for all:</p>
<ul>
<li>James Dewey Watson - Nobel Prize for co-discovering the DNA structure - supports <a href="https://www.sfgate.com/science/article/Nobel-Winner-s-Theories-Raise-Uproar-in-Berkeley-3236584.php">racist ideas</a>, as well as saying that <a href="https://www.newscientist.com/article/dn3451-stupidity-should-be-cured-says-dna-discoverer/">stupidity is a disease and it should be cured</a></li>
<li>Kary Mullis - Nobel Prize for inventing the <a href="https://simple.wikipedia.org/wiki/Polymerase_chain_reaction">PCR</a> (an instrument used in practically all biology laboratories today) - Supports denial of the link between the HIV virus and AIDS (in <a href="https://books.google.it/books?id=MCAqomvRYNMC&pg=PA115&redir_esc=y#v=onepage&q&f=false">his book</a> pages 115 to 118), even when it was proven that <a href="https://web.archive.org/web/20091124091249/http://www3.niaid.nih.gov/topics/HIVAIDS/Understanding/howHIVCausesAIDS/HIVcausesAIDS.htm">said link exists</a>. Also he admitted of abusing LSD (in his book).</li>
<li>Linus Pauling - 2 nobel prizes (peace and chemistry) - Advocated that Vitamin C could cure anything, which spawned the so-called <a href="https://web.archive.org/web/20070202102734/http://www.bccancer.bc.ca/PPI/UnconventionalTherapies/VitaminTherapyMegadoseOrthomolecularTherapy.htm">"Orthomolecular Therapy"</a> which is obviously disproven</li>
</ul>
<p>Many of these ideas were tested by the scientific community, others are just out of the range of being considered sensible.</p>
<p>Now let's enlarge our scope a bit, how many times do people say "[x] is true" because "the president said it"? I bet many have, and they're going to be even more vehement about their support when "[x] thing" resonates with their own view of the world , such as <a href="https://en.wikipedia.org/wiki/Conservatism_(belief_revision)">conservativism</a>, or the views their peers have. These reflect the theories of <a href="https://en.wikipedia.org/wiki/Confirmation_bias">confirmation bias</a> and <a href="https://en.wikipedia.org/wiki/Bandwagon_effect">The Bandwagon effect</a>, respectively.</p>
<p>This is what is affecting our society these days: a huge load of information that is so big we can't (or won't) process rationally, so we revert to our basic way of thinking, and continue to fall back on our biases. Sometimes this bias can be so strong that our brains (it's something that happens naturally) refuse concrete proof of something that goes against our beliefs, no matter how solid said proof is.</p>
<p>The opposite is also happening: someone says something outlandish, finds support by some people, who in turn give support to the thesis, and because of this, the idea appears to self-validate (again: bandwagon effect). Some instances of the bandwagon effect are anti-vaxx movements and flat-earthers.</p>
<p>Other fallacies we should look out for are <a href="https://en.wikipedia.org/wiki/Begging_the_question">petitio principii</a> (sometimes called "Begging the question"), where the premises of an argument assume the truth of the conclusion instead of supporting it; as well as <a href="https://simple.wikipedia.org/wiki/Argument_from_ignorance">argumentum ad ignorantiam</a> (literally "argument from ignorance"), where the lack of proof against an argument is used to support the truth of said argument.</p>
<p>For further information, I'm leaving you a couple links about <a href="https://en.wikipedia.org/wiki/Formal_fallacy">formal and logical fallacies</a> as well as a <a href="https://en.wikipedia.org/wiki/List_of_cognitive_biases">list of cognitive biases</a></p>
<p>Sadly those who are in charge of giving a healthy information diet to the people have been tackling the problem from the wrong side: they have been using their time to disprove a thesis, which we have seen is not really useful, thanks to the ideas of "belief revision bias" and "confirmation bias". This has been unloading the burden of proof over the most outlandish theses on the news outlets, and whoever makes information for the people.</p>
<p>What should be done is we ask whoever makes a wild claim to prove it, with primary sources and research, and if the claimant is unable to provide empirical evidence it should automatically disqualify the claim from being even considered at all. It's hard to prove anything negative and even gravity is just a theory, but you don't see people flying because it's just a theory.</p>
<p>Let's suppose I make a claim:</p>
<blockquote>
<p>Snails are actually super-fast, you just turn around and "bam": a wild snail appeared! They just go slow when we look at them.</p>
</blockquote>
<p>If I asked someone to disprove my theory, we would need to prove that snails are conscious of our presence first, then that they're conscious of what scientific tools are, etc... We would be doing tests forever, and the theory will never be disproved, because more faults will come out in the process of disproving my claim.</p>
<p>I should be the one saying "Here, I have a tape of a snail going mach-3 on an unpaved road" (...how?).</p>
<p>Ask for peer-reviewed sources, or check both sides of an argument, even more in politics. You'll find some things you'd never thought of. In this case non-partisan sources like <a href="https://www.politifact.com/">politifact</a> are your best tool.</p>
<p>As for IT, one myth I hate is "the field of IT and computers in general are not for women": information technology wouldn't be the same without women:</p>
<ul>
<li>Margareth Hamilton - Leader of the team which developed the software for Apollo, see this <a href="http://news.mit.edu/2016/scene-at-mit-margaret-hamilton-apollo-code-0817">MIT news article</a></li>
<li>Ada Lovelace - Worked on Babbage's mechanical computer, which is considered the precursor of modern computers, see this <a href="https://ieeexplore.ieee.org/document/1253887">IEEE Article</a></li>
<li>The women of ENIAC - who worked on one of the earliest general-purpose computers, see <a href="http://eniacprogrammers.org/">eniacprogrammers.org</a></li>
<li>Carol Shaw - Former Videogame designer, check this <a href="http://www.vintagecomputing.com/index.php/archives/800">Vintage Computing and Gaming Article</a></li>
<li>Grace Hopper - One of the first programmers of the Harvard Mark I computer, check this <a href="http://content.yudu.com/A2qfj4/201403March/resources/3.htm?skipFlashCheck=true">YUDU article, at page 52</a> (Requires Adobe Flash)</li>
</ul>
<p>There goes another myth, but there are many others, both in IT and out of it: about members of the LGBTQ+ community, about people coming from outside your country, about diseases, about computers, technology in general and humans themselves (using 10% of the brain, anyone?).</p>
<p>Every time someone gives you some news, or says something wild, no matter how important of a role they have in today's society - <strong>ask for sources</strong>.</p>
<p>Don't let them put the burden of disproving outlandish ideas on you, instead ask them to prove their own thesis and watch how they fail to do so.</p>
<p>Thanks for reading my thoughts on this issue, once again and have a good one!</p>
<p>Penaz.</p>
<p>A special thanks goes to my good friend Sydney Rosen for editing, integrating and overall improving this piece.</p>fread.ink - Un nuovo sistema operativo Open Source per E-Reader2018-08-05T00:00:00+02:002018-08-05T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-08-05:/misc/fread.html<p>Andiamo a conoscere fread, un sistema operativo open-source per lettori di ebook in fase di sviluppo</p><h1>Andiamo a conoscere fread, un sistema operativo open-source per lettori di ebook in fase di sviluppo</h1>
<p>Buongiorno a tutti, dopo mesi di inattività riesco a trovare un po' di tempo per scrivere qualcosa su questo blog!</p>
<p>A fine luglio ha avuto luogo "The Circle Of Hope" (Hope = Hackers On Planet Earth), e proprio in questo evento Marc Juul ha parlato di E-Readers.</p>
<p>Qualcuno sicuramente ricorda lo scandalo del 2009 in cui Amazon ha cancellato da remoto (ed in modo molto sommario) alcuni lavori di George Orwell dai Kindle di alcuni utenti, portando anche ad un caso giudiziario. Il caso è stato chiuso con una promessa da parte del colosso statunitense di "limitare" la cancellazione remota di contenuti.</p>
<p>Come si può facilmente evincere, agli hacker non piace che corporazioni mettano il naso nei loro affari e tanto meno che esercitino una vera e propria funzione di controllo sul device che hanno legittimamente acquistato (se pensiamo alla versione "futuro distopico" i giornali elettronici potrebbero benissimo venir modificati da remoto per mostrare, o non mostrare, certe notizie).</p>
<p>Qui entra in gioco il progetto <a href="https://fread.ink">fread.ink</a>, un progetto in fase di attivissimo sviluppo che si propone di portare un sistema operativo completamente aperto su Kindle 4 e successivi.</p>
<p>Di per sé molti produttori usano già distribuzioni personalizzate di Linux ed hanno fatto il (giusto e legalmente imposto) gesto di rilasciare il codice sorgente di tali distribuzioni sotto licenza GPL. Ciò si aggiunge al fatto che la maggior parte dei lettori di E-book sono basati su hardware molto simile, il che facilita di molto la creazione di un sistema "generalizzato" che possa girare sotto tutti gli E-Reader più diffusi.</p>
<p>Lo stato attuale è già buono, ma non utilizzabile: I kindle di quinta generazione funzionano già in gran parte:</p>
<ul>
<li>I Bottoni Hardware funzionano</li>
<li>Networking USB funziona</li>
<li>WiFi ancora in lavorazione</li>
<li>La Grafica funziona</li>
</ul>
<p>Inoltre è previsto un porting di <a href="http://koreader.rocks/">KOreader</a>, che dovrebbe aggiungere alcune funzionalità interessanti alla nostra esperienza di lettura, ad esempio:</p>
<ul>
<li>Reflow di PDF tramite k2pdfopt: permettendo lo zoom dei caratteri con minori problemi dovuti allo zoom dell'intera pagina</li>
<li>Supporto a file Djvu, Epub, txt, zip, chm, doc, ...</li>
<li>Supporto a fonti aggiuntive come GoodReads, Wikipedia e dizionari</li>
<li>Esportazione note su Evernote</li>
<li>Connessione wireless a Calibre</li>
</ul>
<p>Questo progetto è secondo me molto interessante, soprattutto per la possibilità di ricondizionare hardware ormai datato (sono fiero possessore di un Kindle 4 Non-Touch) aggiungendo funzionalità molto interessanti. Altri troveranno interessante la possibilità di "staccarsi" da mamma Amazon ed avere un E-Reader completamente personalizzabile, altri ancora troveranno questo progetto interessante solo per il fattore "curiosità", cioè semplicemente vedere cosa si può fare con l'hardware Kindle/Kobo/Nook/[Altro EReader Qui].</p>
<p>I developer di Fread sperano di pubblicare la versione 1.0 nel terzo trimestre (luglio-settembre) del 2018 con supporto base per i Kindle Non-Touch di quinta generazione, per poi estendere il supporto a quelli di quarta generazione, a seguire tutti gli altri (Paperwhite, Kobo, Nook, ecc...).</p>
<p>Se volete dare un'occhiata al codice, <a href="https://github.com/fread-ink">cliccate qui per vedere il repository di fread</a>.</p>
<hr />
<p>Purtroppo ho già visto in giro per internet commenti "di odio" verso un progetto del genere, con accuse di voler risparmiare sull'hardware (dando dello "spilorcio" a chi supporta il progetto) o di vedere la "separazione da Amazon" come un gesto insensato, in quanto Amazon (ma anche altri marketplace che vendono E-Reader) non farebbero uso delle informazioni raccolte dalle nostre abitudini di lettura.</p>
<p>Sinceramente non vedo il problema di ricondizionare vecchio hardware perfettamente funzionante: si evitano costi di riciclaggio e smaltimento di un prodotto perfettamente funzionante, oltre che possibili danni ambientali da parte di persone che lucrano sui rifiuti per poi abbandonarli in "discariche abusive".</p>
<p>Per quanto riguarda le informazioni date dalle abitudini di lettura, mi sento in dovere di far tornare in mente il caso Cambridge Analytica, dove informazioni personali insospettabili (quale animale saresti in un'altra vita?) sono state usate per profilare persone e manipolare (a volte con successo, a volte no) elezioni in alcuni stati del mondo. Su un piano più terra-terra, volete veramente che una corporazione vi profili in maniera così accurata da far spendere il vostro denaro, guadagnato con tanto sudore e fatica, sui prodotti che tale corporazione vuole che acquistiate?</p>
<p>Così come non dovreste lasciare questo "potere di influenza" a certe persone, così dovrebbe accadere anche per certe aziende; altrimenti arriveremo (o forse siamo già) al punto in cui non avremo più i nostri desideri da soddisfare, perchè saremo troppo occupati a soddisfare quelli che qualcun altro ci ha fatto credere esser nostri.</p>
<p>Saluti a tutti e ci vediamo alla prossima.</p>
<p>Penaz</p>fread.ink - A new Open Source OS for E-Readers2018-08-05T00:00:00+02:002018-08-05T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-08-05:/en/misc/fread.html<p>Meet fread, an in-development open-source operating system for e-readers</p><h1>Meet fread, an in-development open-source operating system for e-readers</h1>
<p>Hello everybody, after months of inactivity I managed to catch a breather and have time to write something on this blog!</p>
<p>Towards the end of last July, "The Circle of Hope" (Hope = Hackers On Planet Earth) took place, and in this event Marc Juul talked about E-Readers.</p>
<p>Someone surely remembers, back in 2009, the scandal where Amazon remotely erased (in a very rough way) some works from George Orwell from some people's Kindles, leading to a court case. Said case was closed with a promise from the US Corporation to "limit" the remote deletion of contents.</p>
<p>As you can imagine, hackers don't like that corporations watch over hacker's business, even less if that turns to be a full control over the device that was legitimately purchased (think about a "distopian future" where electronic newspapers get remotely manipulated to show, or hide, certain news).</p>
<p>Enter <a href="https://fread.ink">fread.ink</a>, a project under very active development that has the objective of porting a fully FOSS (Free Open Source Software) operating system on Kindle 4 and its successors.</p>
<p>Many producers already use custom Linux distros and they made the kind (and legally forced) gesture of releasing said distributions source under the GPL license. Add that to the fact that the majority of E-Readers are based on really similar hardware, which makes the development of a "general" system which runs on all the major readers that much easier.</p>
<p>The current status is good, but not usable: 5th generation Kindle Readers already work for the most part:</p>
<ul>
<li>Hardware Buttons Work</li>
<li>USB Networking Works</li>
<li>WiFi needs some work</li>
<li>Graphics Work</li>
</ul>
<p>Also a porting of <a href="http://koreader.rocks">KOreader</a> is in the works, which would add some really interesting features to our reading experience, such as:</p>
<ul>
<li>PDF Reflow via k2pdfopt: allowing to zoom into characters with less issues given by the full-page PDF zooming</li>
<li>Support for Djvu, EPub, txt, zip, chm, doc... files</li>
<li>Support for additional sources like GoodReads, Wikipedia and more dictionaries</li>
<li>Export your notes on evernote</li>
<li>Calibre Wireless connection support</li>
</ul>
<p>In my humble opinion this project is really interesting, mostly for the possibility of refurbishing old hardware (I'm the proud owner of a Kindle 4 Non-Touch Device) and add some interesting functionality. Some others will find interesting to have a chance to "detach" from Mother Amazon and have a completaly customizable E-Reader, some others will find it interesting only for the "curiosity factor", that means only seeing what you can do with Kindle/Kobo/Nook/[Insert EReader here] hardware.</p>
<p>Fread developers hope to publish version 1.0 in Q3 of 2018 with base support for 5th generation Non-Touch kindle, after that it's foreseen to extend support to 4th generation Kindles and then all the other devices (Paperwhite, Kobo, Nook, etc...)</p>
<p>If you want to take a look at the source code, <a href="https://github.com/fread-ink">click here to see fread's repository</a>.</p>
<hr />
<p>Sadly I've already seen plenty of "hate comments" towards this kind of project, including accusation of wanting to save money on hardware (calling the supporters of this project "cheap") or seeing the "Amazon divorce" as a gesture without any semblance of sense, since Amazon (and other marketplaces) wouldn't be able to make use of our reading habits.</p>
<p>Honestly I don't see a problem about refurbishing old hardware which works perfectly: you avoid recycling and disposal costs of a perfectly working product, as well as possible environment damage given by certain people who earn on electronics disposal but then abandon the waste in "illegal landfills".</p>
<p>About the information extracted from our reading habits, I feel I have to to remind you about Cambridge Analytica, where seemingly innocent personal information (which animal would you be in your next life?) have been used to profile people and manipulate (sometimes with success, sometimes not) elections in some states in the world. On a more down-to-earth plane: do you really want a corporation to profile you so well that it manages to makes you spend your hard-earned money on products that said corporation wants you to purchase?</p>
<p>As you shouldn't let certain people have this "power to influence" you, so should happen to certain companies; or we will get (or we already are) to a point where we won't have any more desires to satisfy, because we will be too busy to satisfy desires that someone else "injected" into our minds, making us believe they're actually our desires.</p>
<p>Have a nice day and see you next time.</p>
<p>Penaz</p>BitPonzi, ovvero la nuova generazione dello schema Ponzi2018-04-02T00:00:00+02:002018-04-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-04-02:/misc/BitPonzi.html<p>Diamo un'occhiata a come certe persone possano cercare di truffarvi con nuove versioni dello schema Ponzi.</p><h2>Diamo un'occhiata a come certe persone possano cercare di truffarvi con nuove versioni dello schema Ponzi.</h2>
<p>Salve a tutti, mi spiace di non aver potuto scrivere, ma la vita funziona così per ora.</p>
<p>Oggi daremo un'occhiata a cos'è uno schema Ponzi, come questo si relazioni al più conosciuto "Schema a Piramide" e come le nuove tecnologie, come BitCoin e Blockchain siano diventate terreno fertile per nuove truffe.</p>
<p>Prima di tutto, vediamo come funziona uno schema a piramide, giusto per ricordarci: ogniqualvolta una persona entra nella piramide, colui che li ha fatti entrare guadagna un certo ammontare di denaro, oltre che una parte del ricavato delle vendite dei "nuovi invitati". Sicuramente avrete sentito parlare di aziende che tentano di convincervi ad unirvi dicendo che avrete dei guadagni "invitando 5 amici ad unirsi". Tale frase è un campanello d'allarme per ciò che è probabilmente uno schema a piramide.</p>
<p>Lo schema a piramide ha un limite matematico, supponiamo che chiunque stia nello schema inviti 5 dei propri amici, dopo 15 cicli avremmo esaurito la popolazione mondiale.</p>
<p>Lo schema Ponzi è un po' più sottile, invece di guadagnare direttamente un certo ammontare per ogni vendita dei tuoi "sottoposti", si va a guadagnare un piccolo ammontare di denaro per ogni nuova persona che si unisce allo schema, sia essa invitata o meno. Questo significa che coloro che si sono uniti allo schema per primi guadagneranno soldi, mentre i più nuovi dovranno accollarsi le spese e potrebbero non vedere un centesimo prima che lo schema collassi.</p>
<p>Attenzione: Sto semplificando enormemente qui, date un'occhiata all'<a href="https://it.wikipedia.org/wiki/Schema_Ponzi">articolo Wikipedia per "Schema Ponzi"</a>.</p>
<p>Negli ultimi 2 anni, abbiamo visto una forte crescita nella compravendita di una moneta digitale ora ben conosciuta: BitCoin.</p>
<p>Ci sono state moltissime ore di notiziario riguardo la sua crescita che sembrava inarrestabile, oltre alla sua caduta in valore, ed alcune persone hanno quindi deciso di salire sul treno della Novità e creare i propri sistemi di compravendita BitCoin, che può risultare estremamente pericolosi e sono conosciuti per aver lasciato sul lastrico numerose persone in Russia e Colombia.</p>
<p>Non escludo la possibilità che esistano altri schemi Ponzi "sotto copertura", e sicuramente altri ne verranno creati, quindi ecco una piccola lista di caratteristiche che ci possono permettere di riconoscere uno schema Ponzi:</p>
<ul>
<li>L'operatore solitamente offre ritorni sugli investimenti stranamente alti e stranamente consistenti</li>
<li>L'operatore mantiene la propria strategia di investimento:<ul>
<li>Segreta</li>
<li>Nascosta dietro a paroloni estremamente specifici ("Investimenti in Hedge Funds", "Trading Binario", "Investimenti Offshore")</li>
</ul>
</li>
<li>L'operatore tende a richiedere agli investitori di investire più denaro (in questo modo lo schema può restare in piedi per più tempo ed avere più liquidità che gira, e quindi più soldi per "i vecchi" da guadagnare)</li>
<li>L'operatore mostra agli investitori quanto sono riusciti a guadagnare, nelle versioni più nuove si vede un "portafoglio virtuale" con un ammontare di denaro che cresce di giorno in giorno. Questo non vuol dire che si stia veramente guadagnando, per quanto ne sappiamo potrebbe essere uno script che aumenta un numero in maniera causale.</li>
<li>L'operatore offre nuovi piani di investimento quando si cerca di ritirare denaro, solitamente tali "nuovi piani" richiedono di vincolare il denaro (impedendone il prelievo) per un certo ammontare di tempo, in cambio di ritorni più alti.</li>
<li>L'operatore tende ad esagerare nel mostrare quanto il fondo sia solido e solvente.</li>
</ul>
<p>Spero che questo piccolo posto sia minimamente utile per evitare che cadiate nelle trappole di truffatori, i quali usato le novità date da BitCoin ed Ethereum (un tipo di Blockchain) per truffarvi.</p>
<p>Buona vita a tutti, e ci si vede la prossima.</p>
<p>Penaz.</p>BitPonzi, aka the new generation of Ponzi Scheme2018-04-02T00:00:00+02:002018-04-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2018-04-02:/en/misc/BitPonzi.html<p>Let's take a look at how people might try to scam you out of your money with a new edition of the Ponzi scheme.</p><h2>Let's take a look at how people might try to scam you out of your money with a new edition of the Ponzi scheme.</h2>
<p>Hello everyone, sorry for not writing for so long, but life happened.</p>
<p>Today we'll take a look at what a Ponzi scheme is and how it relates to the more known Pyramid scheme and how new technologies like Blockchain and BitCoin have become fertile ground for new scams.</p>
<p>First of all, let's take a look at how a Pyramid scheme works, just as a reminder: every time someone enters the scheme, the person who made them enter earns a small amount of money, as well as a cut of the sales those new people make. You probably heard of companies trying to convince you to join telling you that you would earn money by "inviting 5 of your friends to join". That's most probably a pyramid scheme.</p>
<p>The Pyramid scheme has a mathematical limit, let's say that everyone in the scheme brings 5 friends, you would exceed the world's population in 15 cycles.</p>
<p>The Ponzi scheme is a bit more subtle, instead of directly earning a certain amount of money for each sale your "employees" make, you get a small amount of money each time a new person joins the scheme, invited or not. This means that the oldest that joined will earn money while the newest ones will pay the expenses and might not see a penny before the scheme collapses.</p>
<p>Note: I'm massively simplifying here, please check <a href="https://en.wikipedia.org/wiki/Ponzi_scheme">The Wikipedia Article for Ponzi Scheme</a>.</p>
<p>In the last 2 years, we have seen a huge surge in the trading of a now well-known digital currency: BitCoin.</p>
<p>There has been news about its almost endless climb in value, as well as its fall, and some people have decided to jump on the Novelty Wagon and make their own BitCoin trading systems. These systems can be really dangerous and are known to have left many victims in Russia and Colombia.</p>
<p>I'm not excluding the chance that there are other deceptive Ponzi schemes around, and surely new ones will come out, so here I give you a checklist of how to recognize a Ponzi scheme:</p>
<ul>
<li>The operator offers abnormally high and unusually consistent returns</li>
<li>The operator keeps their investment strategy either:<ul>
<li>Secretive</li>
<li>Hidden behind vague words that sound awfully specific ("Hedge funds trading", "Binary Trading", "Offshore Investment")</li>
</ul>
</li>
<li>The operator usually asks current investors to invest more money (this way the scheme keeps standing up and there is more liquidity going around it, and more money for the "old ones" to earn)</li>
<li>The operator shows the investors how much they earned, in the newer versions you see a "virtual wallet" with money growing day by day or month by month. Doesn't mean you're really getting money, could even be a script just increasing the amount randomly for what you know.</li>
<li>The operator offers new plans when you try to withdraw money, usually those "new plans" forbid you to withdraw for a specified amount of time in exchange of higher returns</li>
<li>The operator tends to over-show how financially sound and solvent the fund is.</li>
</ul>
<p>Hopefully this post is at least a bit useful to avoid you falling into scammers' traps, who use the novelty of BitCoin and Ethereum (A type of blockchain) to scam you out of your money.</p>
<p>Take care and see you next time.</p>
<p>Penaz.</p>Voto Elettronico? No grazie.2017-10-15T00:00:00+02:002017-10-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-10-15:/virtually-political/EVote.html<p>Ad una settimana dall'importante voto per dare maggior autonomia alle regioni Veneto e Lombardia, quest'ultima ha optato per il "voto via tablet", avrei qualcosa da dire al riguardo.</p><p>Salve a tutti, da un po' che non mi faccio sentire, ma gli impegni si fanno sentire, così come il mio senso civico nell'avvertire quante più persone possibili di un fatto:</p>
<h1>Il voto elettronico è una pessima idea.</h1>
<p>Ma andiamo con ordine.</p>
<p>Perchè il voto elettronico dovrebbe essere una cattiva idea? Fa risparmiare soldi alla comunità...</p>
<h3>Perchè il voto cartaceo supera il voto elettronico</h3>
<p>Nella storia il voto cartaceo è sempre risultato solido per un motivo molto semplice: gli attacchi verso il voto cartaceo scalano male.</p>
<p>Il voto cartaceo si basa sul (non) fidarsi delle persone, se qualcuno fa qualcosa di sbagliato verrà immediatamente individuato dagli altri membri del sistema, quindi anche se è possibile minacciare, pagare o comunque costringere qualcuno a ritoccare i risultati, ma man mano che si cerca di modificare voti regionali o addirittura nazionali, è necessario pagare/costringere molte più persone, il che diventa molto difficile.</p>
<p>È anche possibile costringere qualcuno a votare in un certo modo, ma il problema della scalabilità si ripresenta; oltretutto non è consentito lasciare alcun segno sulle schede (allo scopo di provare che il voto "forzato" è stato emesso) dato che questo provocherebbe l'annullamento della scheda, in accordo con il principio base dell'anonimità del voto.</p>
<h3>Voto elettronico: Le macchine di voto</h3>
<p>I tablet, o comunque qualunque macchina di voto che sia, ha un software al suo interno: chi ci garantisce che tale software sia lecito?</p>
<p>Il software potrebbe anche essere open source e verificato, ma chi ci garantisce che tale software sia veramente quello inserito nelle macchine?</p>
<p>Checksum? Crypto? Ottimo, ora abbiamo spostato il problema da "fidarci del software" a "fidarci di chi ci dice che il software è affidabile"...</p>
<p>Poi è un altro discorso che non possiamo, noi "comuni mortali" verificare i checksum dei software presenti.</p>
<p>Chi ci garantisce che non sia possibile infilare una chiavetta USB nella macchina in modo da eventualmente modificare il software interno? Tali macchine potrebbero tranquillamente essere configurate una ad una via drive USB, quindi se riusciamo a modificare quello che sta dentro a quella chiavetta...</p>
<p>E non è una cosa troppo distante dalla realtà, considerando che il 50% dei computer al mondo è infettato da qualcosa.</p>
<p>Una ricevuta stampata da dare agli ufficiali da inserire nella scatola di voto? A questo punto tanto valeva usare la matita.</p>
<p>Sigillare la macchina e trasportarla fino al luogo di spoglio? A questo punto tanto valeva usare la scatola.</p>
<p>Inviare il voto via internet?</p>
<h3>Voto Elettronico: trasmissione via internet</h3>
<p>Internet non è un posto sicuro, possiamo avere tutti i protocolli criptati che vogliamo ma ci sarà comunque sempre un attacco in grado di metterci in difficoltà; basta pensare al Man in the Middle.</p>
<p>E non è una cosa troppo lontana dalla realtà, considerando che in ogni elezione ci sono migliaia di miliardi di euro in ballo (in termini di economia nazionale), e tali soldi possono fare molto comodo a corporazioni o stati canaglia interessati a modificare il risultato di elezioni o voti.</p>
<p>Inviare il numero di voti è già pericoloso di suo, se poi dovessimo mandare ogni singolo voto ad un server centrale (mai verificato, mai visto) che conta i voti per noi, abbiamo essenzialmente una scatola nera dove entrano i voti e dove esce un numero. (Chi ci dice che sia giusto poi?)</p>
<p>Stessa cosa se usassimo una macchina per contare le schede, una scatola nera che sputa fuori un numero misterioso che non è garantito riflettere il volere popolare.</p>
<p>Per prevenire gli attacchi MITM in Internet si usano certificati, e qui spostiamo il problema al fidarci di coloro che hanno le chiavi per firmare i certificati, mentre per il "server centrale" si ripropongono gli stessi problemi che con la singola macchina di voto.</p>
<h3>Voto elettronico: la scalabilità degli attacchi</h3>
<p>Se nel voto cartaceo una persona poteva fare danni marginali, nel caso del voto elettronico una sola persona (pensa un po' un gruppo di persone) può cambiare milioni di voti con lo stesso sforzo usato per cambiarne uno solo. Si dice che gli attacchi in questo caso scalano bene, perchè si ha poco sforzo ulteriore per un risultato molto più grande.</p>
<h3>Voto elettronico: conclusione</h3>
<p>Come abbiamo visto, vi sono molti problemi nell'implementazione del voto elettronico, e sono sicuro che ce ne sono altri che non ho citato, ma spero di aver dato abbastanza informazioni per mettere in dubbio la bontà del voto elettronico. Ed ho parlato solo di problemi che esulano dalla qualità dei software coinvolti, e generalmente il software è di qualità estremamente bassa.</p>
<p>Ora voglio lasciarvi con una provocazione: vale veramente la pena risparmiare qualche milione grazie al voto eletrronico al costo di così tante insicurezze che tale modalità di voto lascia?</p>
<p>La mia risposta personale è no, ma vorrei sentire la vostra sulla <a href="https://www.facebook.com/penazarea">pagina facebook</a>.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>
<p>Cospirazionista Improvvisato.</p>Electronic Voting? No Thanks2017-10-15T00:00:00+02:002017-10-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-10-15:/en/virtually-political/EVote.html<p>A week away from an important vote to give two regions more autonomy, Lombardy chose "voting via tablet", I have something to say about it.</p><p>Hello everyone, it's a while I don't write here, but tasks have been making themselves heard, as my sense of right telling me to warn as many people as possible of a fact:</p>
<h1>Electronic voting is a horrible idea.</h1>
<p>But let's break it down.</p>
<p>Why should E-Voting be a bad idea? It saves everyone a lot of money...</p>
<h3>Why ordinary voting is better than E-Voting</h3>
<p>In history, voting via paper has always ben a solid thing for a simple reason: attacks against it do not scale well.</p>
<p>Ordinary voting is base on (not) trusting people, if someone does something wrong they will immediately get caught by other members in the system, so even if it's possible to bribe, menace or anyway force someone to "tweak" the results, as soon as you start trying to tamper with regional or national votes, you need to pay/force a lot more people, which becomes a lot harder.</p>
<p>It's also possible to force voters to vote in a certain way, but the scaling issue is back again; furthermore you can't leave any sign on the voting form (used to prove that the "forced" vote was made) since this would make the vote void immediately, to keep voting anonymous.</p>
<h3>E-Voting: The voting machines</h3>
<p>Tablets, or any voting machine of the kind, has a software inside: who can guarantee us that said software is legit?</p>
<p>The software could be open source and verified too, but who can guarantee us that said software is really inserted in the machines?</p>
<p>Checksum? Crypto? Nice, now we move the problem from "trusting the software" to "trusting the person who tells us the software can be trusted".</p>
<p>Plus as "common mortals", we can't just go and verify the checksums of the software inside a voting machine.</p>
<p>Who can tell us nobody can just stick a USB thumbrive to modify the internal software anyway? Those machines could be even get their software and configuration from an USB drive, so if we get to modify the content of that drive...</p>
<p>This isn't that far from reality either, considering around 50% of the world's computers is infected with something.</p>
<p>A receipt printed by the machine to give to the officials, to put it in the ballot box? At this point the pencil costed less.</p>
<p>Seal the machine and transport it to the counting spot? At this point the box was better.</p>
<p>Send the votes via the Internet?</p>
<h3>E-Voting: Internet transmission</h3>
<p>Internet is not a safe place, we can invent all the Cyphers possible but there will always be an attack that can put us between a rock and a hard place; just think of Man In The Middle attacks.</p>
<p>Again, this isn't too far from reality, considering that in every election/voting there are thousands of billions of euros on stake (in terms of national economy), and that money can be a good reason for corporations or rogue states to be interested in "tweaking" the results of elections or votes.</p>
<p>Sending the number of votes is already a dangerous thing, if we decided to send every single vote to a central server (which has never been seen or verified) that counts the votes for us, we have essentially a black box when votes go in and a number comes out. (Who tells us it's the right number anyway?)</p>
<p>Same would be for a machine used to count the paper votes, it's still a black box where votes go in and a mysterious number comes out, and that number might not reflect the will of the people.</p>
<p>To prevent MITM attacks on the Internet we use certificates, and again we're moving the problem to trust whoever has the keys to sign certificates, while the "central server" method has the same issues we've seen with the single ballot machine.</p>
<h3>E-Voting: scaling the attacks</h3>
<p>If in ordinary voting one person could just make some minor damage, in E-Voting one person (let alone a group of people) can change millions of votes with the same effort used to change one. In this case it's said that the attacks "scale well", since with minimal extra effort you obtain a much bigger result.</p>
<h3>E-Voting: Conclusion</h3>
<p>As we've seen, there are many issues in implementing Electronic Voting, and I'm sure that there are more that I didn't mention here, but I hope I gave enough information to make you doubt the reliability of E-Voting. And I talked only of issues that are not related with the quality of the software involved, and that is generally really low.</p>
<p>Now I want to leave you with a provocation: is it really worth saving some millions thanks to E-voting but at the same time have so many doubts about the safety of the vote system itself?</p>
<p>I don't think so, but I would like to hear your opinion on <a href="https://www.facebook.com/penazarea">my facebook page</a></p>
<p>Have a good one and see you in the next post!</p>
<p>Penaz.</p>
<p>Impromptu Cospirationist.</p>Doom 3 BFG Edition - The Lost Mission2017-09-07T00:00:00+02:002017-09-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-07:/game-bytes/Doom3BFG_LoM.html<p>Vediamo la seconda espansione di Doom 3, The Lost Mission, e valutiamola.</p><h1>Vediamo la seconda espansione di Doom 3, The Lost Mission, e valutiamola.</h1>
<h2>Grafica</h2>
<p>Ci sono alcune novità, date più che altro dalla presenza di un paio di mappe completamente nuove. La grafica, così come in Resurrection Of Evil, continua a far sentire i segni del tempo</p>
<h2>Storia</h2>
<p>Se la storia di Resurrection of Evil era lineare, questa è una retta. La storia ha alcuni collegamenti con la storia principale, ed usa il costrittore e la Super Shotgun da Resurrection Of Evil.</p>
<p>L'espansione comprende 8 mappe e dall'inizio alla fine sono riuscito a completare la campagna in 112 minuti (meno di due ore), compresi menu, scene di intermezzo, l'ascolto di un lunghissimo nastro prima di arrivare al finale e diverse pause.</p>
<p>Imperdonabile.</p>
<h2>Sonoro</h2>
<p>Anche qui si sentono i problemi di volume, i diari sono difficili da udire tanto che si sente meglio un personaggio non giocante dietro ad un vetro che non i diari audio nel nostro auricolare.</p>
<h2>Gameplay</h2>
<p>Quanto ci vuole per uccidere un Wraith? Due colpi di pistola nel petto appena iniziato il gioco, 2 colpi di fucile in testa dopo 2 minuti dall'inizio dello stesso.</p>
<p>Questo ci fa capire quanto il bilanciamento dell'energia dei nemici e dei danni sia ancora da rivedere, per l'ennesima volta.</p>
<p>Anche qui si trovano bachi, come pezzi di poligono invisibile che impediscono ai nemici di colpire il giocatore in maniera abbastanza palese.</p>
<p>A quanto pare questo è proprio lo standard di Doom 3 BFG.</p>
<p>La battaglia finale è anticlimatica con un boss che è già stato visto nella campagna principale, solo molto più semplice. Non ci siamo.</p>
<h2>Conclusione</h2>
<p>Onestamente non mi aspettavo molto da questa espansione, dati i risultati di Resurrection of Evil; e comunque sono rimasto deluso.</p>
<p>The Lost Mission lascia al giocatore ancora meno di ciò che è stato lasciato da Resurrection of Evil, se questa espansione fosse venduta separatamente dovrebbero pagarmi per doverla giocare, perchè questa espansione è più un "dovere" che un divertimento.</p>
<p><strong>30/100</strong></p>
<p>Se questa espansione non fosse mai stata creata, forse sarebbe stato meglio.</p>
<h2>Conclusione della Serie</h2>
<p>Arriviamo quindi alla conclusione della serie di post dedicata a Doom 3 BFG Edition, il gioco non presenta orrori tali da meritare punteggi sotto terra, ma considerando le differenze con la versione Classica, come il mancato supporto per le Mods, la mancanza di impostazioni che considererei vitali, i contenuti mancanti, il gioco non è buono, è a malapena decente.</p>
<p>Come nell'ultimo post, diamo un'occhiata alla media ponderata: <strong>48/100</strong></p>
<p>Grazie a tutti per aver letto questo post e ci si vede alla prossima!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Expansion Pack",
"name": "Doom 3 - BFG Edition - The Lost Mission DLC"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "30",
"worstRating": "0",
"bestRating": "100"
}
}
</script>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition (With Resurrection Of Evil and The Lost Mission)"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "48",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Doom 3 BFG Edition - The Lost Mission2017-09-07T00:00:00+02:002017-09-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-07:/en/game-bytes/Doom3BFG_LoM.html<p>Let's take a look at the second DLC for Doom 3, The Lost mission, and let's give it a score.</p><h1>Let's take a look at the second DLC for Doom 3, The Lost mission, and let's give it a score.</h1>
<h2>Graphics</h2>
<p>There's some new stuff here, mostly because there a couple of maps that are completely new. Graphics, like in Resurrection of Evil, keep looking a bit old.</p>
<h2>Story</h2>
<p>If the story in Resurrection of Evil was linear, this is a straight line. The Story has some links with the main campaign, and uses the Grabber and Super Shotgun from Resurrection of Evil.</p>
<p>The expansion includes 8 maps, and beginning-to-end it took me 112 minutes to complete the whole thing (less that 2 hours), including menus, intermissions, listening to a really long tape before the finale and many breaks.</p>
<p>Unforgivable.</p>
<h2>Sound</h2>
<p>Even here you can have issues with volume levels, diaries are hard to hear so much that you hear an NPC behind a glass better than your own diaries in an earpiece.</p>
<h2>Gameplay</h2>
<p>How much does it take to kill a Wraith? Two gun shots in the chest just after starting the game, or two shotgun shells in the head just two minutes later.</p>
<p>This lets us see how the enemy health and damage balancing needs a review, another time.</p>
<p>You can find bugs here too, like pieces of an invisible polygon that stop the enemies to hit you where they should obviously have.</p>
<p>It seems to be the standard of Doom 3 BFG.</p>
<p>The final battle is anticlimactic, with a boss that was already seen in the main campaign, just a lot simpler. Not quite right.</p>
<h2>Conclusion</h2>
<p>Honestly I wasn't expecting much from this expansion, given the results of Resurrection of Evil; and yet I'm still disappointed.</p>
<p>The Lost Mission leaves less to the player than what Resurrection of Evil did, if this DLC was sold separatedly someone would need to pay me money to play it, because this expansion is more of a "chore" than fun.</p>
<p><strong>30/100</strong></p>
<p>Maybe it would have been better if this expansion never existed.</p>
<h2>End of the Series</h2>
<p>So we're at the end of the series dedicated to Doom 3 BFG Edition, the game doesn't have such horrific errors to deserve under-the-ground score, but considering the differences with the Classic edition, like the lack of Mod support, lack of what I consider vital settings, missing content, the game is not good. It's barely decent.</p>
<p>Like in the last post, let's take a look at the weighted average: <strong>48/100</strong></p>
<p>Thank you everybody for reading this post and see you in the next one!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Expansion Pack",
"name": "Doom 3 - BFG Edition - The Lost Mission DLC"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "30",
"worstRating": "0",
"bestRating": "100"
}
}
</script>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition (With Resurrection Of Evil and The Lost Mission)"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "48",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Doom 3 BFG Edition - Resurrection Of Evil2017-09-06T00:00:00+02:002017-09-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-06:/game-bytes/Doom3BFG_RoE.html<p>Dopo aver giocato la campagna principale, diamo un'occhiata alla prima delle due espansioni ufficiali di Doom 3 BFG</p><h1>Dopo aver giocato la campagna principale, diamo un'occhiata alla prima delle due espansioni ufficiali di Doom 3 BFG</h1>
<p>Questa recensione è un' "espansione" della <a href="https://penazarea.altervista.org/game-bytes/Doom3BFG_Main.html">precedente recensione su Doom 3</a>, dove esporrò solo le differenze tecniche con la campagna principale, oltre a dettagli inerenti la campagna extra in sè.</p>
<h2>Grafica</h2>
<p>La grafica resta nello stile di Doom 3, comunque molto carina ma per essere un "secondo episodio" è molto meno ispirata, dato che le texture sono quasi le stesse e ci sono addirittura pezzi di mappa copiati dalla campagna principale, che dona consistenza al tutto, ma allo stesso tempo sa di pigro.</p>
<h2>Storia</h2>
<p>Al posto della sezione "Installazione e Prestazioni" voglio fare un piccolo punto sulla storia; che è lineare da far terrore. Il colpo di scena più sconvolgente era talmente ignobile che non me lo ricordo più.</p>
<p>La battaglia col boss finale si svolge in un'arena microscopica, in due fasi, con pattern del boss prevedibilissimi. Se si sa quello che si fa, è possibile battere il boss in meno di 120 secondi (a difficoltà normale).</p>
<p>Il finale dovrebbe essere epico, ma non lo è. Non è nemmeno fatto così male da far ridere; è solo... un finale che esiste, non lascia nulla al giocatore.</p>
<h2>Suoni</h2>
<p>Le traduzioni sono buone, i suoni sono quelli della campagna principale, persiste il problema dei volumi mal regolati, ma su questa espansione si nota meno.</p>
<h2>Gameplay</h2>
<p>Il gioco introduce alcuni nuovi nemici e due nuove armi:</p>
<ul>
<li>Super ShotGun, Una doppietta</li>
<li>Il costrittore, che ha il sapore di una Pistola Gravitazionale (Da Half Life 2) sottomarca</li>
</ul>
<p>e propone "l'artefatto" al post del "Cubo delle anime". Verso la fine del gioco, l'artefatto è talmente sovrapotenziato che offrirà:</p>
<ul>
<li>Velocità Maggiorata (Vedrete tutto al rallentatore)</li>
<li>Potenza Maggiorata di qualunque arma</li>
<li>Invulnerabilità</li>
</ul>
<p>Persiste la difficoltà "a picchi", anche se la piattezza di questa campagna rende tutto estremamente semplice.</p>
<p>Ho trovato vari bachi, inclusi muri e pavimenti invisibili (dove c'è chiaramente un buco, non si cade), nemici che appaiono dal nulla (no, non sono i demoni che si teletrasportano) ed alcuni poligoni male allineati che mi hanno fatto dannare su una salita.</p>
<p>A questo si aggiunge una fisica che alle volte è letteralmente "volante" e decisi problemi di bilanciamento del gioco e delle armi.</p>
<p>Il tema passa più verso il vecchio stile "spara spara" di Doom e Doom II, ma non siamo ancora ai giusti livelli.</p>
<h2>Conclusione</h2>
<p>Nonostante l'idea di un'espansione fosse già stata lanciata dal finale della serie principale, questo seguito è abbastanza insipido da dissalare il Mar Morto; la storia è lineare ed a tratti noiosa, il bilanciamento da rivedere, bachi da correggere.</p>
<p>Questa espansione non lascia nulla, esiste solo per esistere.</p>
<p>Il punteggio dato a questa campagna di espansione è <strong>35/100</strong></p>
<p>Considerando la dimensione di campagna principale ed espansione, abbiamo una media ponderata per Doom 3 + RoE di <strong>52/100</strong></p>
<p>Ancora una volta, grazie per aver letto questo post, ci si vede al prossimo post oltre che all'ultima parte di questa serie di 3 post su Doom 3!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Expansion Pack",
"name": "Doom 3 - BFG Edition - Resurrection of Evil DLC"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "35",
"worstRating": "0",
"bestRating": "100"
}
}
</script>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition + Resurrection Of Evil"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "52",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Doom 3 BFG Edition - Resurrection Of Evil2017-09-06T00:00:00+02:002017-09-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-06:/en/game-bytes/Doom3BFG_RoE.html<p>After playing the main campagin, let's take a look at the first of two official expansions in Doom 3 BFG Edition</p><h1>After playing the main campagin, let's take a look at the first of two official expansions in Doom 3 BFG Edition</h1>
<p>This review is an "expansion" of the <a href="https://penazarea.altervista.org/en/game-bytes/Doom3BFG_Main.html">previous one on Doom 3</a> where I'll only view the technical differences with the main campaign, as well as the details around the extra campaign itself.</p>
<h2>Graphics</h2>
<p>The graphics stay in the style of Doom 3, still quite nice, but for being a "second episode" it's a lot less inspired since the textures are practically the same and there also copied bits of maps from the main campaign, which gives everything a bit more consistency but at the same time it has a "lazy" taste.</p>
<h2>Story</h2>
<p>Instead of the "Setup and Performance" section, I want to talk about the story for a minute. It's so linear it gives horror. The most unexpected twist was so unepic that I can't recall it.</p>
<p>The final battle takes place in a microscopic arena, in two phases, with boss patterns really easy to foresee. If you know what you're doing, you can beat the boss in less than 120 seconds (at normal skill level).</p>
<p>The finale should be epic, but it isn't. It's not even so badly made that it makes you laugh; it just... is. Doesn't leave anything to the player.</p>
<h2>Sounds</h2>
<p>Translations are good, sounds are directly from the main campaign, the problem of the volume levels stays, but you notice it less in this expansion.</p>
<h2>Gameplay</h2>
<p>The expansion introduces some new enemies and two new weapons:</p>
<ul>
<li>Super ShotGun, a double-barreled shotgun</li>
<li>The grabber, which tastes like a sub-brand Gravity Gun (From Half Life 2)</li>
</ul>
<p>and also gives you "The artifact" instead of the "soul cube". Towards the end of the game, the artifact is so overpowered that it will offer you:</p>
<ul>
<li>Higher Speed (Everything will be seen in slow motion)</li>
<li>Higher Weapon power</li>
<li>Invulnerability</li>
</ul>
<p>The "Spikey" challenge level stays, even though the flatness of this campaign makes everything extremely simple.</p>
<p>I found quite many bugs, including invisible walls and invisible floors (you can clearly see a hole, but you can't fall), enemies that pop out of nowhere (no, it's not the demons teleporting) and some misaligned polygons that made me scream bloody murder on a small climb.</p>
<p>Add this to the physics that at times are literally "flying" and real problems with game and weapon balancement.</p>
<p>The game goes more towards the old "shooty shooty" style of Doom and Doom II, but we're still not quite there.</p>
<h2>Conclusion</h2>
<p>Even though the idea of an expansion was already launched in the main campaign's finale, this "successor" is so insipid it could desalinate the Dead Sea; the story is linear and at times boring, the balancement needs a review, bugs need to be squashed.</p>
<p>This expansion doesn't leave you with anything, exists only for the sake of existing.</p>
<p>The score of this expansion campaign is <strong>35/100</strong></p>
<p>Considering the size of both the main campagin and the expansion, we have a weighted average for Doom 3 + RoE of <strong>52/100</strong></p>
<p>Again, thank you for reading this and see you in the next post, as well as in the last part of this 3-post series about Doom 3.</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Expansion Pack",
"name": "Doom 3 - BFG Edition - Resurrection of Evil DLC"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "35",
"worstRating": "0",
"bestRating": "100"
}
}
</script>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition + Resurrection Of Evil"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "52",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Doom 3 BFG Edition - Campagna Principale2017-09-02T00:00:00+02:002017-09-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-02:/game-bytes/Doom3BFG_Main.html<p>Il terzo episodio della saga di Id Software riceve un secondo rilascio, vediamo rapidamente come si comporta</p><h1>Il terzo episodio della saga di Id Software riceve un secondo rilascio, vediamo rapidamente come si comporta</h1>
<p>A 10 anni dal rilascio di Doom 2, Id Software presenta Doom 3, un survival horror/shooter che porta con sè un nome molto pesante. Oggi vedremo come si comporta la sua ri-edizione: Doom 3 BFG Edition.</p>
<h2>Grafica</h2>
<p>La grafica è ottima, ma per essere una ri-edizione non si notano miglioramenti di sorta, quindi gli anni si fanno vedere. Un paio di glitch qui e li sono visibili, ma niente che rovini il gioco.</p>
<p>Le opzioni per la personalizzazione della grafica sono molto poche.</p>
<h2>Installazione e Prestazioni</h2>
<p>L'installazione tramite steam è abbastanza semplice anche se può prendere un po' di tempo data la necessità di installare alcune componenti aggiuntive (DirectX e Visual C Redist).</p>
<p>Il gioco non ha problemi di lag, anche se ad ogni avvio sembra che steam abbia bisogno di fare alcune configurazioni, richiedendo i diritti di amministratore.</p>
<h2>Suoni</h2>
<p>I suoni sono ottimi, ma purtroppo i livelli audio sono molto problematici; la maggior parte delle volte non è possibile udire i personaggi non giocanti o addirittura i diari audio (che dovremmo avere nel nostro orecchio, come se avessimo un auricolare).</p>
<p>La totale mancanza di opzioni per regolare i livelli audio e di sottotitoli è onestamente vergognosa.</p>
<p>Inoltre ho notato la presenza di contenuti non tradotti dall'inglese, per esempio il cubo delle anime che dice "Use Us", invece di "Usaci".</p>
<h2>Gameplay</h2>
<p>La BFG Edition è un port della versione per console, e risente di tale eredità.</p>
<p>Il gameplay sta esattamente a metà tra il survival horror e l'action in stile "spara spara", ed è proprio quella metà che lo rende un po' insapore, non andando nè da una parte, nè dall'altra.</p>
<p>Ci sono jumpscare in stile horror, ma i medikit e le munizioni sono presenti in quantità, togliendo gran parte del fattore "survival".</p>
<p>L'atmosfera è in stile horror, ma i nemici non sono un pericolo vero e proprio, a meno che non siano in gran quantità.</p>
<p>Il boss finale è estremamente semplice, direi deludente.</p>
<p>Ho trovato più di una volta alcuni glitch che mi hanno portato a morti vergognose, ad esempio un enorme muro invisibile su un salto fattibilissimo.</p>
<p>Sono morto più volte nel tentativo di scendere delle scale che non sparando a demoni vari.</p>
<p>Oltretutto la difficoltà da più volte la parvenza di non essere una vera e propria curva ascendente, ma invece sembra avere dei picchi improvvisi, soprattutto in prossimità dell'arrivo di nuove armi. Di punto in bianco ci si ritrova ad avere la sensazione che le armi non facciano più danno, fino a quando non ti trova un nuovo giocattolino; dopodichè sembra di essere ritornati all'inizio del gioco, dove qualunque mostro può essere ucciso con la pistola base.</p>
<h2>Extra: La BFG Edition</h2>
<p>La BFG Edition si differenzia dalla versione originale, soprattutto per la mancanza di alcuni contenuti, l'abbondanza di pickups e la torcia integrata nella tuta.</p>
<p>Sinceramente penso che questo abbia trascinato il gioco da un "survival horror con elementi di shooting" (uno stacco totale dallo "spara spara" dei predecessori) a quello che secondo me è un survival horror tra il mediocre ed il sufficiente ed uno shooter decente, ma comunque godibile.</p>
<h2>Conclusione</h2>
<p>Avendo avuto la possibilità di giocare all'originale Doom 3, posso dire che di per sè il gioco è un degno successore di Doom e Doom II, ma questo port è insoddisfacente così com'è.</p>
<p>Come al solito il punteggio va da 0 (questo gioco doveva restare all'inferno) a 100 (se non ce l'hai, il diavolo prenderà la tua anima).</p>
<p>Considerando la qualità del porting, la mancata possibilità di modding, la mancata possibilità di opzioni per l'audio, i livelli dell'audio stesso che rovinano l'esperienza, ma anche la presenza dei primi 2 capitoli (oltre che le espansioni del terzo) in un solo pacchetto; darei un <strong>60/100</strong> a questa edizione.</p>
<p>Presto tornerò con le espansioni "Resurrection of Evil" e "The Lost Mission".</p>
<p>La speranza è che queste espansioni aggiungano valore alla BFG edition.</p>
<p>Grazie a tutti per aver letto e ci si vede al prossimo post!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "60",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Doom 3 BFG Edition - Main Campaign2017-09-02T00:00:00+02:002017-09-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-09-02:/en/game-bytes/Doom3BFG_Main.html<p>The third episode of Id Software's Saga receives a second release, let's have a quick look at how it behaves</p><h1>The third episode of Id Software's Saga receives a second release, let's have a quick look at how it behaves</h1>
<p>10 years after releasing Doom 2, ID Software presents Doom 3, a survival horror/shooter that has a very heavy heritage. Today we'll see how its re-edition behaves: Doom 3 BFG Edition.</p>
<h2>Graphics</h2>
<p>Graphics are great, but for being a re-edition there is no real improvement, so you can see that the product has aged. A couple glitches here and there can be seen, but nothing that ruins the game.</p>
<p>Graphic options are really few.</p>
<h2>Setup and Performance</h2>
<p>The installation via steam is quite simple even though it could take a bit of time, since some additional software is needed (DirectX and Visual C Redist)</p>
<p>The game has no issues with lag, even though each boot it requires admin privileges to make some kind of configuration.</p>
<h2>Sound</h2>
<p>Sounds are great, but sadly the audio levels are a real problem; most of the times you can't hear the NPCs or even the audio logs (which should be shoved right in your ear, like we had an earpiece).</p>
<p>The total absence of volume settings for the various audio or even for subutitles is honestly something shameful.</p>
<p>Moreover I found that there is some untranslated content in the italian version, like the soul cube saying "Use Us" instead of "Usaci".</p>
<h2>Gameplay</h2>
<p>The BFG Edition is a port of the console version, and that kind of heritage is felt a lot.</p>
<p>The gameplay is exactly in the middle of survival horror and "shooty shooty" style action, and that's that "being in the middle" that makes it a bit tasteless, not really inching towards one side or the other.</p>
<p>There are horror-style jumpscared, but medikits and ammo are plentiful, taking away great part of the "survival" factor.</p>
<p>The atmosphere is in the horror style, but enemies don't pose a real threat, unless there's a lot of them.</p>
<p>The final boss is extremely simple, I'd say disappointing.</p>
<p>I found more than once glitch that brought me towards some shameful deaths, including a huge invisible wall in between a completely doable jump.</p>
<p>I died more in the trial of going down a ladder than shooting demons.</p>
<p>Moreover, the challenge level is floaty, with sudden spikes, usually near the time you find new weapons. Out of the blue, you have the sensation that your weapons don't do any damage, until you find a new toy; after that it feels like you're at the beginning of the game, where any monster can be killed with a base pistol.</p>
<h2>Extra: The BFG Edition</h2>
<p>The BFG Edition shows some differences in comparison to the original version, mostly for the lack of some content, the abundance of pickups and the integrated torch on the suit.</p>
<p>I honestly think that this has brought the game from a "survival horror with some shooting elements" (a completely different thing from the "shooty shooty" of its predecessors) to something that is more like a survival horror that could be evaluated as between mediocre and sufficient as well as a decent shooter, but still pretty enjoyable.</p>
<h2>Conclusion</h2>
<p>Since I had the chance of playing the original Doom 3, I can say that the game itself is a worthy successor of Doom and Doom II, but this port in particular, as it is, is unsatisfactory.</p>
<p>As usual the score goes from 0 (this game needed to stay in hell) to 100 (if you don't have it, the Devil will take your soul).</p>
<p>Considering the porting quality, lack of moddability, lack of audio options, the audio levels themselves that ruin the experience, but also the presence of the first 2 chapters (as well as the expansions of the third) all in one package; I'd give a <strong>60/100</strong> to this edition.</p>
<p>Soon I'll be back with the "Resurrection of Evil" and "The Lost Mission" expansion packs reviews.</p>
<p>My hope is that these expansion packs will add some value to the BFG edition.</p>
<p>Thank you everybody for reading this post, and see you in the next one!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Doom 3 - BFG Edition"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "60",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Altri ebook gratuiti sulla pagina GitHub di EbookFoundation2017-08-25T00:00:00+02:002017-08-25T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-25:/gratis-sul-web/EbookFoundation.html<p>Diamo un'occhiata alle liste riguardanti scienze e programmazione da parte di EbookFoundation</p><h1>Diamo un'occhiata alle liste riguardanti scienze e programmazione da parte di EbookFoundation</h1>
<p>Buongiorno a tutti,</p>
<p>Oggi voglio proporvi un paio liste pubblicate in maniera un po' inconsueta, infatti daremo un'occhiata alle liste di "EbookFoundation", che raccolgono libri completamente gratuiti riguardanti materie scientifiche e di programmazione informatica, in molte lingue, il tutto raccolto in un repository di GitHub.</p>
<p>Iniziamo con la più breve: la <a href="https://github.com/EbookFoundation/free-science-books">categoria scienze</a>, che purtroppo contiene pochi libri non in lingua italiana. Qui possiamo trovare alcuni libri su:</p>
<ul>
<li>Matematica</li>
<li>Astronomia</li>
<li>Fisica</li>
<li>Chimica</li>
<li>Tecnologia</li>
</ul>
<p>Per un totale di una quindicina di libri, tutti da scaricare gratuitamente.</p>
<p>Ora passiamo alla parte un po' più succosa del post: la <a href="https://github.com/EbookFoundation/free-programming-books">sezione programmazione</a>, che comprende libri, corsi online, anche interattivi, risorse, podcast e screencast, anche in Italiano e fra i linguaggi disponibili abbiamo:</p>
<ul>
<li>Ada</li>
<li>Assembly</li>
<li>C, C#, C++</li>
<li>Haskell</li>
<li>HTML/CSS</li>
<li>Java</li>
<li>TeX</li>
<li>Lisp</li>
<li>Lua</li>
<li>Perl</li>
<li>Php</li>
<li>Python</li>
<li>R</li>
<li>Ruby</li>
<li>Molti, molti, molti, molti altri...</li>
</ul>
<p>Oltre ad avere risorse che non dipendono da alcun linguaggio di programmazione, di carattere più generale.
Questo repository github è un'autentica miniera d'oro per coloro che vogliono migliorare le proprie capacità informatiche anche con argomenti meno classici e più rivolti al futuro, come Machine Learning.</p>
<p>Ed ora arriviamo alla particolarità di entrambi questi repository: essendo ospitati su GitHub, chiunque può contribuire con le proprie scoperte tramite il classico sistema basato su Forking e Pull Requests, con preferenza per molteplici pull request piccole, piuttosto di una sola molto grossa.</p>
<p>Vi lascio con un ulteriore link alla pagina principale GitHub di EbookFoundation: <a href="https://github.com/EbookFoundation">link</a>.</p>
<p>Il nostro viaggio nel mondo dell'apprendimento gratuito non è ancora finito, continuerò a cercare ulteriori risorse da portarvi.</p>
<p>Saluti e ci si vede al prossimo post!</p>
<p>Penaz.</p>More free ebooks on EbookFoundation's GitHub Repository2017-08-25T00:00:00+02:002017-08-25T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-25:/en/gratis-sul-web/EbookFoundation.html<p>Let's take a look at the lists on science and programming from EbookFoundation</p><h1>Let's take a look at the lists on science and programming from EbookFoundation</h1>
<p>Hello everybody,</p>
<p>Today I want to bring you a couple of lists that are published in an uncommon way, we'll take a look at the "EbookFoundation"'s Lists, that gather together completely free ebooks about science and programming, in many languages, all in a GitHub repository.</p>
<p>Let's start with the shortest: the <a href="https://github.com/EbookFoundation/free-science-books">science section</a>, which sadly has few books, not in Italian. Here we can find some books about:</p>
<ul>
<li>Math</li>
<li>Astronomy</li>
<li>Physics</li>
<li>Chemistry</li>
<li>Technology</li>
</ul>
<p>For a grand total of about fifteen books, all ready to download for free.</p>
<p>Now let's switch to the juicy part of this post: the <a href="https://github.com/EbookFoundation/free-programming-books">programming section</a>, that includes books, online courses, even interactive, resources, podcasts and screencasts, in Italian too and among the available languages we can find, there are:</p>
<ul>
<li>Ada</li>
<li>Assembly</li>
<li>C, C#, C++</li>
<li>Haskell</li>
<li>HTML/CSS</li>
<li>Java</li>
<li>TeX</li>
<li>Lisp</li>
<li>Lua</li>
<li>Perl</li>
<li>Php</li>
<li>Python</li>
<li>R</li>
<li>Ruby</li>
<li>Many, many, many, many others...</li>
</ul>
<p>There are also language-agnostic resources, which are a bit more general.
This GitHub is a real goldmine for the people who want to sharpen their computer knowledge also with less-classic subjects, like Machine Learning.</p>
<p>And now we're at the unique perk of both these repositories: being hosted on GitHub, anybody can give their own contribution with their own findings, with the classic Forking/Pull Request system, with preference to multiple small pull requests, instead of a big one.</p>
<p>I'm leaving you with another link to the main GitHub page of EbookFoundation: <a href="https://github.com/EbookFoundation">link</a>.</p>
<p>Our trip in the world of free learning is not over yet, I'll keep on looking around for more resources to give you.</p>
<p>Have a good one and see you in the next post!</p>
<p>Penaz.</p>Vc.py - Una GUI decisamente troppo semplice per SoX e PulseAudio2017-08-16T00:00:00+02:002017-08-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-16:/coding/VoiceChanger.html<p>Dopo una richiesta da parte di un amico, ho deciso di create questa piccola GUI per aiutarlo ad usare SoX per la modifica della propria voce in tempo reale.</p><h1>Dopo una richiesta da parte di un amico, ho deciso di create questa piccola GUI per aiutarlo ad usare SoX per la modifica della propria voce in tempo reale.</h1>
<p>Salve a tutti,</p>
<p>Alcuni giorni fa, un amico mi chiese se esistesse qualche tipo di software per cambiare/cammuffare la propria voce su Linux, e dopo aver visto che non esistono propriamente scelte per programmi Grafici; quindi ho deciso di dare un'occhiata alle alternative da linea di comando.</p>
<p>È così che ho incontrato SoX, un piccolo coltellino svizzero per il filtraggio e la modifica di flussi audio, e dopo alcune ricerche ho scoperto che è possibile usare questo software per modificare la propria voce in tempo reale.</p>
<p>Ed è così che nasce Vc.py, una semplice GUI in Tk che crea automaticamente un sink Voice_Changer all'interno di pulseaudio, avvia SoX con i parametri giusti, permettendo la registrazione della voce modificata in tempo reale.</p>
<p>3 Effetti sono disponibili:</p>
<ul>
<li><strong>Pitch Shift</strong>: Cambia il tono di voce</li>
<li><strong>Flanger</strong>: Aggiunge una linea in ritardo, miscelandola con l'audio originale, dando un effetto simile ad un aereo a reazione di passaggio.</li>
<li><strong>Gain</strong>: Permette di variare il volume</li>
</ul>
<p>All'uscita, il programma consente di chiudere direttamente pulseaudio (che dovrebbe riaprirsi da solo), per cancellare il sink creato.</p>
<p>Se siete curiosi e volete dare un'occhiata, potete guardare la <a href="https://github.com/Penaz91/VoiceChanger">Pagina su Github</a></p>
<p>Ancora una volta, grazie per aver letto e ci si vede al prossimo post.</p>
<p>Penaz.</p>Vc.py - An overly simplistic GUI for SoX and PulseAudio2017-08-16T00:00:00+02:002017-08-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-16:/en/coding/VoiceChanger.html<p>After a request of help from a friend, I decided to create this GUI to allow him to use SoX for real time voice changing under linux.</p><h1>After a request of help from a friend, I decided to create this GUI to allow him to use SoX for real time voice changing under linux.</h1>
<p>Greetings Everybody,</p>
<p>Some days ago, a friend asked me if there was any kind of voice changing software under Linux, and after seeing that there were no really easy choices I decided to take a look at the command line alternatives.</p>
<p>That's how I found SoX, a small swiss knife for audio editing and filtering, and after some search I learned that it's possible to use this software to have some real-time voice changing.</p>
<p>That's how Vc.py came to exist, it's a simple Tk GUI that automatically creates a Voice_Changer sink inside pulseaudio, runs the SoX command with the right parameters, allowing to record your edited voice in real time.</p>
<p>There are 3 effects available:</p>
<ul>
<li><strong>Pitch Shift</strong>: Allows to change the pitch of your voice</li>
<li><strong>Flanger</strong>: Adds a delayed line of audio, mixing it with the original audio, giving an effect similar to a Jet Plane passing by</li>
<li><strong>Gain</strong>: Allows to change the volume</li>
</ul>
<p>On exit, the program allows to directly kill pulseaudio (which should re-open automatically) so to delete the added sink.</p>
<p>If you are curious and want to take a look, you can check the <a href="https://github.com/Penaz91/VoiceChanger">Github Page</a></p>
<p>Again, thank you everybody for reading, and see you in the next post.</p>
<p>Penaz.</p>4 Siti dedicati all'apprendimento gratuito2017-08-09T00:00:00+02:002017-08-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-09:/gratis-sul-web/Courses-4Sites.html<p>Diamo un'occhiata a 4 nuovi siti da cui poter imparare nuove tecniche e migliorare le nostre capacità lavorative</p><h1>Diamo un'occhiata a 4 nuovi siti da cui poter imparare nuove tecniche e migliorare le nostre capacità lavorative</h1>
<p>Buongiorno a tutti,</p>
<p>Oggi voglio proporvi, per prima cosa, il nuovo tag <a href="https://penazarea.altervista.org/tag/learning.html">learning</a>, specificamente dedicato a tutto ciò che può aiutarci ad imparare nuove tecniche e migliorare il nostro bagaglio di conoscenze nell'ambito lavorativo e personale.</p>
<p>Inoltre voglio introdurvi a non uno, non due, ma ben quattro siti dedicati all'apprendimento gratuito, quindi ci conviene tuffarci immediatamente in questo mega-post!</p>
<p>Il primo sito è <a href="https://www.coursera.org">coursera.org</a>, che offre corsi di ogni tipo, con un comodissimo box di ricerca. Le categorie spaziano dalle scienze alle lingue oltre che arte e materie umanitarie.</p>
<p>Una cosa notevole di questo sito è la collaborazione con oltre 100 partners sparsi in tutto il mondo, tra cui università Americane come Stanford e Rutgers, oltre che università Italiane come il Politecnico di Milano, Bocconi e La Sapienza.</p>
<p>Il sito richiede una registrazione gratuita, ed alcuni suoi corsi mettono a disposizione una certificazione.</p>
<p>Passiamo all'area un po' più specifica con un nome che è un'istituzione mondiale: MIT.</p>
<p>Infatti Il Massachussets Institute of Technology ci mette a disposizione "OpenCourseware", che ci mette a disposizione videolezioni, appunti e corsi completi gratuitamente e <strong>senza bisogno di registrazione</strong>.</p>
<p>Fra i corsi a disposizione abbiamo i fondamenti del Fotovoltaico, sicurezza dei sistemi informatici, meccanica classica, teoria dei numeri e molto altro che sicuramente stuzzicherà la vostra curiosità, oltre a mettere a disposizione un bagaglio di conoscenze non indifferente.</p>
<p>Se volete dare un'occhiata, basta fare un giro sulla <a href="https://ocw.mit.edu/index.htm">pagina di OpenCourseware</a>.</p>
<p>Passiamo al terzo sito: Yale University mette a disposizione <a href="http://oyc.yale.edu">Open Yale Courses</a>, dove abbiamo a disposizione lezioni complete in video, audio e trascrizione testuale, ancora una volta <strong>senza registrazione</strong>.</p>
<p>Il sito mette a disposizione moltissimi corsi che includono materie come Ingegneria Biomedica, chimica, economia, inglese, storia, Musica e filosofia, oltre a molto altro.</p>
<p>Inoltre Yale Online è in collaborazione con Coursera, di cui ho parlato poco fa.</p>
<p>Ed ora l'ultimo sito di oggi: Johns Hopkins ci mette a disposizione <a href="http://ocw.jhsph.edu">JHSPH OpenCourseware</a>, che in modo molto simile ad OpenCourseware del MIT, mette a disposizione materiale riguardante specificamente la ricerca e l'educazione in materie di salute pubblica.</p>
<p>È una pagina estremamente specifica, ma vale comunque la pena di includerla in questo elenco.</p>
<p>La pagina dei corsi è estremamente ricca di contenuti ed è utile per coloro che vogliono avere più informazioni concernenti la salute pubblica e la prevenzione delle malattie nel mondo.</p>
<p>Con questo il nostro piccolo viaggio in questi quattro siti finisce qui, ma il nostro viaggio nel mondo dell'apprendimento non finisce mai.</p>
<p>Grazie a tutti per aver letto questo post, vi auguro un buon proseguimento.</p>
<p>Ci si vede al prossimo post!</p>
<p>Penaz.</p>4 websites dedicated to free learning2017-08-09T00:00:00+02:002017-08-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-09:/en/gratis-sul-web/Courses-4Sites.html<p>Let's take a look at 4 new websites we can use to learn new things, as well as boost our skills</p><h1>Let's take a look at 4 new websites we can use to learn new things, as well as boost our skills</h1>
<p>Hello everybody,</p>
<p>Today I want to first introduce you to the new <a href="https://penazarea.altervista.org/tag/learning.html">learning</a> tag, specifically dedicated to everything that can help us learning new stuff as well as boost our knowledge and skills for working and to make ourselves better as people.</p>
<p>I want to introduce you as well to four websites dedicated to free learning, so we better dive into this mega-post!</p>
<p>The first website is <a href="https://www.coursera.org">coursera.org</a>, which offers courses of any kind, with a very nice search box. Categories go from science to Language learning, as well as art and personal development.</p>
<p>Notable thing is that Coursera has partnerships with over 100 entities scattered all over the world, among them we can find American Universities like Stanford and Rutgers, as well as Italian Universities like Politecnico di Milano, Bocconi e La Sapienza.</p>
<p>The website needs a free registration, and some of its courses have a certification.</p>
<p>Now let's go into something a bit more specific, with a name that itself is a world-wide institution: the MIT.</p>
<p>The Massachussets Institute of Technology gives us "OpenCourseware", which allows us to access video-lectures, notes and full courses for free and <strong>with no registration required</strong></p>
<p>Among the courses we find Fundamental of Photovoltaics, Computer Systems Security, Classic Mechanics, Number Theory and many other things that will surely poke your curiosity, as well as giving you a huge amount of knowledge.</p>
<p>If you want to take a look, you just need to open the <a href="https://ocw.mit.edu/index.htm">OpenCourseware website</a>.</p>
<p>Now for the third website: Yale University gives us <a href="http://oyc.yale.edu">Open Yale Courses</a>, where we find full video-lectures, as well as audio-lectures and text transcripts, again <strong>without any registration</strong>.</p>
<p>The website puts out a lot of courses that include subjects like Biomedical Engineering, Chemistry, Economy, English, History, Music and Phylosophy, as well as lots of other subjects.</p>
<p>Yale Online has also a partnership with Coursera, which I mentioned earlier.</p>
<p>And now for the last website: Johns Hopkins gives us <a href="http://ocw.jhsph.edu">JHSPH OpenCourseware</a> which, in a similar fashion to MIT's OpenCourseware, gives us material that is specifically oriented to research and education in the subject of public health.</p>
<p>It's a very specific page, but it's still worth including in this list I'm making.</p>
<p>The courses page is extremely rich in content and is useful for the ones who want to have more information about public health and prevention of diseases in the world.</p>
<p>With this, we finished out small trip around these four websites, but our voyage in the world of Free Learning is endless!</p>
<p>Thank you everybody for reading, have a good one.</p>
<p>See you in the next post!</p>
<p>Penaz.</p>Ancora corsi gratuiti con EdX2017-08-01T00:00:00+02:002017-08-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-01:/gratis-sul-web/EdX.html<p>Presentazione di EdX, una piattaforma dove troveremo corsi gratuiti per tutti i gusti, ed altre sorprese.</p><h1>Presentazione di EdX, una piattaforma dove troveremo corsi gratuiti per tutti i gusti, ed altre sorprese.</h1>
<p>Buongiorno a tutti, sulla falsa riga di <a href="https://penazarea.altervista.org/gratis-sul-web/Class_Central.html">Class Central</a>, oggi vi voglio proporre EdX, un sito da cui potremo seguire un sacco di corsi gratuiti proposti anche da Università famose quali MIT, Harvard, Berkeley ed altri.</p>
<p>Questo sito mi è stato suggerito da un'amica che ringrazio profondamente.</p>
<p>Come in Class Central, possiamo scegliere corsi da seguire col nostro ritmo, oppure a ritmo predefinito, con argomenti che spaziano dalla A alla Z, con corsi di Arte e Architettura, passando per Informatica, arrivando a materie umanistiche e scienze sociali.</p>
<p>Fra i partners di EdX troviamo aziende come Microsoft, W3C e Red Hat; inoltre molti corsi (dietro pagamento, purtroppo) possono emettere una certificazione riconosciuta da tutte le aziende ed istituzioni coinvolte.</p>
<p>Purtroppo I corsi sono in Inglese, ma non è semplice trovare corsi gratuiti in lingua Italiana.</p>
<p>Se volete dare un'occhiata all'offerta di corsi a disposizione, potete visitare la <a href="https://www.edx.org">pagina ufficiale di EdX</a>.</p>
<p>Grazie ancora per aver letto questo post, vi auguro un buon proseguimento e noi ci vediamo al prossimo post!</p>
<p>Penaz</p>More free courses with EdX2017-08-01T00:00:00+02:002017-08-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-08-01:/en/gratis-sul-web/EdX.html<p>Introducing EdX, a platform where we'll find free courses for everyone, and some surprises too.</p><h1>Introducing EdX, a platform where we'll find free courses for everyone, and some surprises too.</h1>
<p>Hello everybody, similarly to <a href="https://penazarea.altervista.org/en/gratis-sul-web/Class_Central.html">Class Central</a>, today I want to suggest EdX, a website where you can choose a whole lot of free courses, many of them offered by famous Universities like MIT, Harvard, Berkeley and more.</p>
<p>This website was suggested by a dear friend of mine, who I thank deeply.</p>
<p>Like in Class Central, we can choose among self-paced courses, or with a pre-defined pace, about any kind of subject, like Art and Architecture, going through Computer Science and landing on Human Science and Social Science.</p>
<p>Among EdX's partners we can find companies like Microsoft, W3C and Red Hat; also many courses (sadly, after payment) can emit a certification that is recognized among all the involved companies.</p>
<p>If you want to take a look at the offer, you can visit <a href="https://www.edx.org">EdX's official Page</a>.</p>
<p>Thank you again for reading this post, I wish you a good day and see you in the next post!</p>
<p>Penaz</p>Ancora Game Development con SFML e C++2017-07-23T00:00:00+02:002017-07-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-23:/gratis-sul-web/SFML.html<p>Diamo un'occhiata ad SFML, una leggerissima libreria per costruire applicazioni multimediali</p><h1>Diamo un'occhiata ad SFML, una leggerissima libreria per costruire applicazioni multimediali</h1>
<p>Buongiorno a tutti, tempo addietro un'amica mi ha fatto scoprire SFML (Simple and Fast Multimedia Library), che mi ha incuriosito molto per le similarità con <a href="https://penazarea.altervista.org/misc/Pygame.html">PyGame</a> nel modo che viene usato nei prodotti, ma fa uso di rendering hardware e mette a disposizione un sistema di finestre minimale per usare OpenGL.</p>
<p>Una limitazione rispetto a PyGame è che SFML può solo gestire (e gestirà solamente anche in futuro) grafica 2D, per scelta dei programmatori.</p>
<p>La struttura della libreria è chiarissima, ben divisa ed è possibile importare solo le componenti necessarie al funzionamento; la libreria ha al suo interno</p>
<ul>
<li>Componenti per la Grafica</li>
<li>Componenti per l'audio</li>
<li>Componenti per Networking (Multiplayer)</li>
<li>Componenti per la creazione di finestre</li>
<li>Componenti per la gestione delle componenti di sistema</li>
</ul>
<p>sono veramente curioso di provarlo, personalmente. Ora infatti sto studiando un po' le API per riprodurre qualche esempio che ho creato in passato.</p>
<p>Se volete dare un'occhiata ad SFML, non vi resta che dare un'occhiata al <a href="http://sfml-dev.org">sito ufficiale di SFML</a>.</p>
<p>Ancora una volta vi ringrazio per aver letto questo articolo e vi auguro buon divertimento. Il nostro viaggio nel mondo degli strumenti dedicati al Game Development non è terminato!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>More Game Development with SFML and C++2017-07-23T00:00:00+02:002017-07-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-23:/en/gratis-sul-web/SFML.html<p>Let's take a look at SFML, an extremely lightweight library to build multimedia applications.</p><h1>Let's take a look at SFML, an extremely lightweight library to build multimedia applications.</h1>
<p>Hello everybody, back in the old times, a good friend of mine made me discover SFML (Simple and Fast Multimedia Library), which made me curious a lot, for its similarities with <a href="https://penazarea.altervista.org/en/misc/Pygame.html">PyGame</a> in the way that you can use it in your programs, but makes use of Hardware rendering and gives you a minimal window system to use OpenGL.</p>
<p>A limitation compared to PyGame is that SFML can manage (and will only manage) 2D graphics, as a choice from the developers.</p>
<p>The library structure is really clear, well-split in modules and you can import only the components you need to make something work; the library contains:</p>
<ul>
<li>Graphics Components</li>
<li>Sound Components</li>
<li>Networking Components (For Multiplayer)</li>
<li>Window creation and management components</li>
<li>Components to manage system functions</li>
</ul>
<p>I'm really curious to try it, personally. Now I'm studying the APIs a bit so I can remake some examples I made in the past.</p>
<p>If you want to take a look at SFML, you just need to take a look at <a href="http://sfml-dev.org">The official SFML website</a>.</p>
<p>I thank you again for reading this post and have lots of fun. Our voyage in the world of Game Development-dedicated tools is not over!</p>
<p>See you in the next post!</p>
<p>Penaz</p>Game Bytes: One Finger Death Punch2017-07-20T00:00:00+02:002017-07-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-20:/game-bytes/Game-bytes-OFDP.html<p>Diamo un'occhiata a questo piccolo gioco di Silver Dollar</p><h1>Diamo un'occhiata a questo piccolo gioco di Silver Dollar</h1>
<p>Due pulsanti, un solo obiettivo: mettere KO tutti i cattivoni del livello. Vediamo come si comporta questo piccolo grande gioco sotto esame.</p>
<h2>Grafica</h2>
<p>La grafica è brillante e molto ben definita, anche se molte volte si rasenta il ridicolo a causa dell'enorme caos che ci ritroveremo a schermo. Gran parte del gioco sembra un set teatrale dove vengono calati vari oggetti di scena da distruggere, facendo capire che il gioco non si prende troppo seriamente.</p>
<h2>Installazione e Prestazioni</h2>
<p>L'installazione è completamente indolore, il gioco carica solo all'avvio, dopodichè è un combattimento dopo l'altro. Nessun caricamento, nessuna attesa, solo azione.
Non vi sono rallentamenti durante il gameplay, anche dopo vari minuti di gioco ininterrotto.</p>
<h2>Comparto sonoro</h2>
<p>Le botte, i grugniti ed il resto degli effetti sonori contornano bene l'attività rilassante di picchiare cattivoni come se non ci fosse un domani, e le musiche (tra cui anche brani di Chinese Dance Machine) contornano molto bene i vari combattimenti.</p>
<h2>Gameplay</h2>
<p>Nel gioco non ci si può muovere, bisogna aspettare che i nemici si avvicinino abbastanza per poterli picchiare a dovere, click sinistro per un pugno a sinistra e click destro per un pugno a destra.
Il concetto è semplice da capire ma molto complesso da padroneggiare, inoltre vi sono armi che estendono il nostro raggio d'azione, varie modalità di gioco tra cui sopravvivenza, round a tempo, round con spada laser o nunchucks e boss.
Vi sono poi skills da sbloccare ed un sistema di adattamento automatico della difficoltà.
Tutto qui.</p>
<h2>Conclusione</h2>
<p>Il gioco come gameplay sembra a prima vista povero ma offre abbastanza varietà da intrattenere per ore. Diversamente da altri giochi che si basano sulla propria storia da raccontare, questo esiste per il gusto di esistere.
Il gioco è divertente così com'è, ed aggiungere altri elementi finirebbe per rovinare l'esperienza. Il sistema di adattamento della difficoltà ci riserva sempre una sfida adatta alle nostre capacità ed allo stesso tempo, per quanto possiamo far schifo nel gioco, avremo sempre la sensazione di fare dei combattimenti fantastici.</p>
<p>Come al solito, è arrivato il momento di votare, da 0 a 100 e penso che un voto giusto possa essere: <strong>83/100</strong></p>
<p>Con a margine un consiglio di provarlo se vi piace il genere.</p>
<p>Grazie a tutti per aver letto questa piccola recensione, vi saluto e ci si vede al prossimo post!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Beat'em up",
"name": "One Finger Death Punch"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "83",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: One Finger Death Punch2017-07-20T00:00:00+02:002017-07-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-20:/en/game-bytes/Game-bytes-OFDP.html<p>Let's take a look at this little game from Silver Dollar</p><h1>Let's take a look at this little game from Silver Dollar</h1>
<p>Two buttons, one objective: put down all the baddies in the level. Let's see how this little big game behaves when under closer inspection.</p>
<h2>Graphics</h2>
<p>Graphics is bright and crisp, even though at times it gets ridiculous with all the huge chaos that we'll find on our monitors. The majority of the game looks like a theatre set where stage props come down from the sky so they can get destroyed, this makes us understand that the game doesn't take itself too seriously.</p>
<h2>Setup and performance</h2>
<p>Setup is completely painless, the game loads only at startup, after that it's a level after the other. No loading screens, no waiting, only action.
There are no slowdowns during the gameplay, even after a good amount of time we're playing nonstop.</p>
<h2>Sounds</h2>
<p>The hits, grunts and the rest of the SFX relate well to the relaxing activity of beating bad dudes like there's no tomorrow, and the music (including some tracks from Chinese Dange Machine) are a good complement to the fights.</p>
<h2>Gameplay</h2>
<p>You can't move in this game, you have to wait that the enemies get close enough so you can beat them properly, left click for a left punch and right click for a right punch.
The concept is simple to understand but very complex to master, plus there are weapons that extend your fighting radius, many modes including survival, time trials, laser sword and nunchuck rounds as well as boss fights.
There are also skills to unlock and automatic difficulty adjustment.
That's all.</p>
<h2>Conclusion</h2>
<p>Gameplay-wise the game seems to be poor, but offers enough variety to entertain the player for hours. Differently from other games that are story-based, this one exists for the sake of existing.
The game is pure fun as it is, and adding other elements will end up spoiling the experience. The automatic difficulty adjustment allows us to always have a good challenge that is up to our skill level but at the same time, no matter how much we end up sucking, we'll always have that sensation of kicking it and making some awesome fights.</p>
<p>As usual, it's score time, from 0 to 100 and I think a fair score for this game could be: <strong>83/100</strong></p>
<p>With a side note to try this game if you like the genre.</p>
<p>Thank you everybody for reading this small review, have a nice one and see you in the next post!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Beat'em up",
"name": "One Finger Death Punch"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "83",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Creiamo le nostre visual novels con Ren'Py2017-07-17T00:00:00+02:002017-07-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-17:/gratis-sul-web/Renpy.html<p>Conosciamo Ren'Py, un motore per creare visual novels basato su Python</p><h1>Conosciamo Ren'Py, un motore per creare visual novels basato su Python</h1>
<p>Buongiorno a tutti,</p>
<p>In passato vi ho già proposto alcuni strumenti per creare le vostre personalissime avventure videoludiche che usano Python, per esempio:</p>
<ul>
<li><a href="https://penazarea.altervista.org/gratis-sul-web/Blender_GameDev.html">Il motore di Blender</a></li>
<li><a href="https://penazarea.altervista.org/misc/Pygame.html">Pygame</a></li>
</ul>
<p>Oggi vi voglio proporre qualcosa di un po' più particolare: Ren'Py.</p>
<p>Ren'Py è un motore per la creazione di visual novels e tutti quei videogiochi basati sul racconto di storie in generale, in maniera semplice e veloce per i giochi più basilari, fino ad arrivare a livelli di videogiochi commerciali.</p>
<p>Questo motore fa uso di un proprio linguaggio di scripting, che è tanto semplice quanto leggere un racconto in inglese. Provate a leggere questo pezzo di codice, ricavato direttamente dal sito:</p>
<div class="codehilite"><pre><span></span><code><span class="n">label</span> <span class="n">family</span><span class="p">:</span>
<span class="n">scene</span> <span class="n">bg</span> <span class="n">beach2</span>
<span class="k">with</span> <span class="n">dissolve</span>
<span class="ss">"It wasn't long before Mary broke the silence, by asking me a question."</span>
<span class="k">show</span> <span class="n">mary</span> <span class="n">dark</span> <span class="n">smiling</span>
<span class="k">with</span> <span class="n">dissolve</span>
<span class="n">m</span> <span class="ss">"I told you a little about my family... but I haven't asked you about yours yet. What's your family like?"</span>
<span class="n">p</span> <span class="ss">"When I'm on the island here, I live with my aunt and uncle, but back home, I live with my mother, father, and sister."</span>
<span class="n">m</span> <span class="ss">"A sister? Is she older or younger?"</span>
</code></pre></div>
<p>Sono abbastanza pronto a scommettere che usando questo linguaggio, sareste in grado di creare da voi una storia.</p>
<p>Ma il motore non si ferma qui e propone funzionalità come:</p>
<ul>
<li>Menu</li>
<li>Salvataggio (anche automatico) e Caricamento di partite</li>
<li>Caricamento di immagini predittivo</li>
<li>Supporto tastiera, mouse e gamepad</li>
<li>Supporto schermo intero</li>
<li>Possibilità di saltare testo, oppure auto-avanzamento del testo senza dover toccare la tastiera</li>
<li>Supporto traduzioni</li>
<li>Molto altro</li>
</ul>
<p>Ma non è ancora finita, perchè Python non è solo al cuore di Ren'Py, ma può essere usato per creare meccaniche di gioco più complesse, così da soddisfare tutte le esigenze, anche di persone che vogliono qualcosa in più dalla propria creazione.</p>
<p>Se volete dare un'occhiata a Ren'Py, non dovete fare altro che cliccare sul <a href="https://www.renpy.org">link alla pagina ufficiale</a>.</p>
<p>Come sempre, grazie per aver letto questo articolo, vi saluto e ci si vede alla prossima!</p>
<p>Penaz.</p>Let's create our own Visual Novels with Ren'Py2017-07-17T00:00:00+02:002017-07-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-17:/en/gratis-sul-web/Renpy.html<p>Introducing Ren'Py, a Python-based Visual Novel engine</p><h1>Introducing Ren'Py, a Python-based Visual Novel engine</h1>
<p>Hello everybody,</p>
<p>In the past, I already suggested some tools to create your own videogame adventures, and those tools use Python, for instance</p>
<ul>
<li><a href="https://penazarea.altervista.org/en/gratis-sul-web/Blender_GameDev.html">Blender's Game Engine</a></li>
<li><a href="https://penazarea.altervista.org/en/misc/Pygame.html">Pygame</a></li>
</ul>
<p>Today I want to give you something a bit more specific: Ren'Py.</p>
<p>Ren'Py is an engine aimed to create Visual Novels and all those videogames that are based on digital storytelling in a fast and quick way if you want a basic product, but can also produce commercial-quality videogames.</p>
<p>This engine uses its own scripting language, which is as simple as reading an english story. Try to read this piece of code, directly from Ren'Py's website:</p>
<div class="codehilite"><pre><span></span><code><span class="n">label</span> <span class="n">family</span><span class="p">:</span>
<span class="n">scene</span> <span class="n">bg</span> <span class="n">beach2</span>
<span class="k">with</span> <span class="n">dissolve</span>
<span class="ss">"It wasn't long before Mary broke the silence, by asking me a question."</span>
<span class="k">show</span> <span class="n">mary</span> <span class="n">dark</span> <span class="n">smiling</span>
<span class="k">with</span> <span class="n">dissolve</span>
<span class="n">m</span> <span class="ss">"I told you a little about my family... but I haven't asked you about yours yet. What's your family like?"</span>
<span class="n">p</span> <span class="ss">"When I'm on the island here, I live with my aunt and uncle, but back home, I live with my mother, father, and sister."</span>
<span class="n">m</span> <span class="ss">"A sister? Is she older or younger?"</span>
</code></pre></div>
<p>I'm quite willing to bet that using this language, you would be able to create your own story.</p>
<p>But the engine doesn't stop here, and features:</p>
<ul>
<li>Menus</li>
<li>Saving (automatically if you want) and loading Games</li>
<li>Predictive image loading</li>
<li>Keyboard, mouse and gamepad support</li>
<li>Fullscreen Support</li>
<li>Skip text or auto-advance it without having to press any key</li>
<li>Translations support</li>
<li>Much more</li>
</ul>
<p>This is not over, because Python is not only Ren'Py's heart, but can also be used to create more complex game mechanics, so to satisfy all needs, even those of people who want more from their own creation.</p>
<p>If you want to take a look at Ren'Py, you just need to click on this <a href="https://www.renpy.org">link to Ren'Py's page</a>.</p>
<p>Again, thanks for reading this post, goodbye and see you next time!</p>
<p>Penaz.</p>Apprendimento Gratuito con Class Central2017-07-15T00:00:00+02:002017-07-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-15:/gratis-sul-web/Class_Central.html<p>Scopriamo Class Central, un motore di ricerca per corsi gratuiti.</p><h1>Scopriamo Class Central, un motore di ricerca per corsi gratuiti.</h1>
<p>Buongiorno a tutti,</p>
<p>Oggi vi voglio presentare un motore di ricerca per corsi gratuiti (anche universitari) che potete seguire secondo una tabella prestabilita oppure decidendo voi quando e come seguire.</p>
<p>Gli argomenti spaziano dal miglioramento personale, passando per salute e medicina, informatica, programmazione fino a deep learning.</p>
<p>È possibile cercare per parole chiave, oltre che per categoria; ogni corso è completo di data d'inizio, link per iniziare subito, una comodissima valutazione del corso (da 0 a 5 stelle) oltre che link per le varie recensioni sul corso stesso.</p>
<p>Ad occhio e croce vi sono oltre 6000 corsi indicizzati, direttamente accessibili dal link "subjects", i corsi sono sia in inglese che in altre lingue (anche se l'inglese è la lingua principe di questo sito).</p>
<p>Vi lascio col <a href="https://www.class-central.com">link diretto alla pagina di Class Central</a> e con un saluto.</p>
<p>Grazie ancora per aver letto questo articolo, e ci vediamo alla prossima!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>Free learning with Class Central2017-07-15T00:00:00+02:002017-07-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-15:/en/gratis-sul-web/Class_Central.html<p>Let's take a look at Class Central, a search engine for free courses.</p><h1>Let's take a look at Class Central, a search engine for free courses.</h1>
<p>Hello everybody,</p>
<p>Today I want to introduce you to a search engine for free courses (including some college ones) that you can take by following a pre-estabilished time table, or self-paced.</p>
<p>Subjects go from self-improvement, going through medicine and health, computer science, programming and even deep learning.</p>
<p>You can search by keywords, as well as by category; every course includes start date, link to start, a very useful course evaluation (from 0 to 5 stars) as well as the link to check out reviews on the course itself.</p>
<p>There are about 6000 indexed courses, directly accessible from the "subjects" link, the courses are in english (mostly) but also other languages.</p>
<p>I'm leaving you with the <a href="https://www.class-central.com">direct link to Class Central's page</a> as well as with a warm goodbye.</p>
<p>Thanks again for reading this post and see you next time!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>Game Bytes: Fight Knight Kickstarter Demo 112017-07-10T00:00:00+02:002017-07-10T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-10:/game-bytes/Game_Bytes_FightKnight.html<p>Diamo un'occhiata alla demo di un progetto interessante: Fight Knight</p><h1>Diamo un'occhiata alla demo di un progetto interessante: Fight Knight</h1>
<p>Previsto per il 2018, Fight Knight è un progetto interessante: un dungeon crawler misto ad un fighting game in prima persona. Vediamo come si comporta sotto torchio.</p>
<h2>Grafica</h2>
<p>La grafica è in pixel-art, ma in alcuni casi (come nella cutscene iniziale) sembra più a bassa risoluzione che pixel-art. Il tutto ricorda abbastanza da vicino alcuni vecchi giochi a 256 colori.</p>
<p>Carini alcuni dettagli dei menu dell'inventario, in cui si vede il braccio del protagonista far da puntatore nel menu.</p>
<h2>Installazione e performace</h2>
<p>Non ci sono rallentamenti e l'installazione di questa demo è semplice quanto estrarre un archivio. Tutto qui.</p>
<h2>Comparto Sonoro</h2>
<p>I suoni sono carini ma non veramente speciali, le tracce sonore sono nella media, godibili ed accompagnano bene le nostre avventure</p>
<h2>Gameplay</h2>
<p>Il gameplay è duplice: durante i combattimenti possiamo tirare pugni a raffica come pazzi usando la barra spaziatrice, parare con shift e selezionare mosse speciali con ctrl; mentre il dungeon crawling è affidato completamente alla tastiera, possiamo avanzare ed indietreggiare con "w" e "s", ruotiamo a sinistra e destra con "a" e "d", muovendoci lateralmente con "q" e "e", muovendosi come su una scacchiera, a passi discreti.</p>
<p>Il gioco prevede alcuni puzzle, molti piani da esplorare (4 sono presenti nella demo), incontri casuali e boss.</p>
<p>Divertente il fatto che per parlare con i personaggi non giocanti, è necessario dare loro un pugno.</p>
<h2>Extra: Il team di sviluppo</h2>
<p>Notevole la scelta dello sviluppatore di non includere "traguardi aggiuntivi" nel caso si superasse la cifra minima richiesta di 13000 dollari canadesi, comprensibile dato che solitamente si dovrebbe promettere meno e dare di più, lo sviluppatore preferisce concentrarsi sul gioco in sè, piuttosto di promettere caratteristiche che non è detto sia fattibile implementare nel tempo dato dai soldi raccolti. Ricordiamo che 13000 dollari non sono molti, meno di un anno di sviluppo intensivo senza lavorare su altro.</p>
<h2>Conclusione</h2>
<p>Il gioco così com'è è... nella media. Non è un capolavoro ma non è nemmeno orribile. Il concetto è interessante e si gioca abbastanza bene, la grafica complementa bene il gioco, così come la musica. Sicuramente da provare in ogni caso.</p>
<p>Come al solito, è arrivato il momento del giudizio, da 0 (divertente come una suite da ufficio) a 100 (come puoi vivere senza?).</p>
<p>Direi che il gioco comunque è sufficiente, con un piccolo bonus per la creatività e l'integrità dello sviluppatore; penso un punteggio giusto sia <strong>65/100</strong></p>
<p>Come al solito grazie per aver letto, e ci si vede al prossimo post!</p>
<p>Penaz.</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Dungeon Crawler",
"name": "Fight Knight KS11"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "65",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Fight Knight Kickstarter Demo 112017-07-10T00:00:00+02:002017-07-10T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-10:/en/game-bytes/Game_Bytes_FightKnight.html<p>Diamo un'occhiata alla demo di un progetto interessante: Fight Knight</p><h1>Let's take a look at an interesting project: Fight Knight</h1>
<p>Coming out in 2018, Fight Knight is an interesting project: a mix of dungeon crawler and first person fighting game. Let's see how it behaves under pressure.</p>
<h2>Graphics</h2>
<p>The graphics are made in pixel-art, but in some cases (like the first cutscene) it looks more low-resolution than pixel-art. Everything reminds much of some old 256 color videogames.</p>
<p>Some details in the inventory menu are nice, where you can see the protagonist's arm that is used as cursor in the menu.</p>
<h2>Setup and performace</h2>
<p>No slowdowns and the setup of this demo is as simple as extracting an archive. That's all.</p>
<h2>Sound</h2>
<p>Sounds are nice but not really anything special, the music are average, enjoyable and complement well our adventures.</p>
<h2>Gameplay</h2>
<p>Here we have a double gameplay: while fighting we can punch like madmen using the space bar, parry with shift and select special moves with ctrl; while we're crawling the dungeon we're going to use only our keyboard, we can go forward and back with "w" and "s", rotate left and right with "a" and "d", move sideways with "q" and "e", the movement is tile-based.</p>
<p>The game has some puzzles, lots of floors (4 available in the demo), random encounters and boss fights</p>
<p>Funny that to talk to NPCs you have to punch them.</p>
<h2>Extra: The developer team</h2>
<p>Needs notice the choice of the developer to not include "stretch goals" over the 13000 Canadian Dollars, understandable given that you should under-promise and eventually over-deliver. The developers prefer to focus on the game itself, instead of promising features that might not be included within the time given by the money raised. Let's remember that 13000 dollare are not much, less than an year of development without working on anything else.</p>
<h2>Conclusion</h2>
<p>The game like this is... average. It's no masterpiece or horrible thing. The concept is interesting and can be played pretty well, the graphics are good complement to the game, so is the music. Surely a good game to try anyway.</p>
<p>As usual, it's time for the score, from 0 (as fun as an office suite) to 100 (how can you live without this?).</p>
<p>I'd say the same is okay, with a small bonus for creativity and moral integrity of the devs; I think a fair score is <strong>65/100</strong>.</p>
<p>As usual, thanks for reading and see you in the next post!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "Dungeon Crawler",
"name": "Fight Knight KS11"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "65",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Crypt of the Necrodancer2017-07-04T00:00:00+02:002017-07-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-04:/game-bytes/Game_Bytes_Crypt.html<p>Combattiamo a tempo di musica con Crypt Of The Necrodancer!</p><h1>Combattiamo a tempo di musica con Crypt Of The Necrodancer!</h1>
<p>Due generi apparentemente inconciliabili, Rhythm Game e Dungeon Crawler, si fondono in un unico fantastico videogame, vediamo un po' come se la cava.</p>
<h2>Grafica</h2>
<p>La grafica è in gradevolissima pixel-art ma non disdegna alcuni effetti molto gradevoli che comunque non inficiano l'esperienza di gioco, le zone sono ben differenziate così da invogliare il giocatore a continuare. Le cutscene usano immagini semi-animate sempre in pixel-art molto carine.</p>
<h2>Installazione e Prestazioni</h2>
<p>L'installazione da steam è indolore, ma un errore nella traduzione in Italiano ha reso la calibrazione audio/video impossibile, ma dopo aver controllato le discussioni e cambiato la lingua del gioco in Inglese, quest'ultima è stata completata in circa 2 minuti.</p>
<p>Il gioco non ha rallentamenti di sorta, il caricamento delle varie zone è praticamente istantaneo, ma questo ha un peso: il caricamento iniziale.</p>
<p>Il caricamento iniziale è decisamente troppo lento, e non sembra che la schermata di caricamento sia dotata di qualche sorta di MultiThreading, quindi il gioco sembrerà bloccato per un buon paio di minuti, se non fosse per la musica di sottofondo che funziona a dovere.</p>
<h2>Comparto sonoro</h2>
<p>Gli effetti sonori sono buoni ed adatti alle varie situazioni, ma il punto forte di Crypt of the Necrodancer è la musica.</p>
<p>Fantastica.</p>
<p>Danny Baranowsky (Super Meat Boy, The Binding of Isaac) colpisce ancora con musiche molto coinvolgenti sin dal primo livello. Una musica che non è solamente di contorno al gameplay, ma è parte centrale di esso.</p>
<h2>Gameplay</h2>
<p>Il gameplay è quello di un normale dungeon crawler con zone generate casualmente, con una limitazione: ci si può muovere solo quando c'è un beat della musica, che verrà segnalato dal cuore nella parte bassa dello schermo (Beat - Battito). Il gameplay è tanto semplice da capire quanto difficile da padroneggiare, e molte volte finiremo per richiamare qualche entità celeste quando un "miss" ci farà ammazzare.</p>
<p>Il tutto è estremamente coinvolgente, e ci si ritrova ad aver speso ore sul gioco senza neanche rendersene conto.</p>
<h2>Conclusione</h2>
<p>Se vi piacciono i rhythm game, o volete una sfida e vi piacciono tracce musicali coinvolgenti che potreste ascoltare anche fuori dal gioco; Crypt of the Necrodancer fa per voi.</p>
<p>Il giudizio finale, come al solito, va da 0 (date fuoco a questo gioco) a 100 (il possesso di questo gioco dovrebbe essere parte dei diritti umani).</p>
<p>Un giudizio giusto potrebbe essere: <strong>91/100</strong></p>
<p>Grazie ancora a tutti per aver letto, e ci vediamo al prossimo post!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, Linux",
"applicationCategory": "Dungeon Crawler",
"name": "Crypt of the Necrodancer"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "91",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Crypt of the Necrodancer2017-07-04T00:00:00+02:002017-07-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-07-04:/en/game-bytes/Game_Bytes_Crypt.html<p>Deliver Beatdowns to the beat with Crypt Of The Necrodancer!</p><h1>Deliver Beatdowns to the beat with Crypt Of The Necrodancer!</h1>
<p>Two genres that are apparently impossible to merge, Rhythm Game and Dungeon Crawler, get fused in a unique and fantastic videogame, let's see how well it delivers.</p>
<h2>Graphics</h2>
<p>Graphics are made in a very pleasing pixel-art, but doesn't turn down some very nice effects that don't hinder the game experience in any way, the zones are well differenciated so to make the player more eager to continue playing. Cutscenes use some kind of semi-animated images, still made with pixel-art, that are really nice.</p>
<h2>Setup and Performance</h2>
<p>Installing the game from steam is completely painless, but a mistake in the Italian translation made the audio/video calibration impossible to complete. After checking the discussions page for the issue and changing the game language to English, the calibration was successfully completed in about 2 minutes.</p>
<p>The game has no slowdowns, loading the zones is almost instant, but this has a setback: the loading at the beginning of the game, just after opening the executable.</p>
<p>The initial loading is definitely too slow, and it doesn't seem that the loading screen has any kind of MultiThreading coded into it, so the game will look like frozen for a good couple of minutes, if it wasn't for the background music still working properly (not looping).</p>
<h2>Sounds</h2>
<p>The sound effects are good and spot-on, but the strength of Crypt of the Necrodancer is the music.</p>
<p>Amazing.</p>
<p>Danny Baranowsky (Super Meat Boy, The Binding of Isaac) hits the mark again with tracks that involve you right off the bat, from the first level. Songs that are not only complementary to the gameplay but the gameplay itself focuses on those songs.</p>
<h2>Gameplay</h2>
<p>The gameplay is the one of a normal dungeon crawler with randomly generated zones, with a limitation: you can move only when the music beats, that is highlighted by the beating heart in the lower side of the screen. Gameplay is simple to understand but hard to master, and many times you'll end up calling down some heavenly entities when a "miss" will get you killed.</p>
<p>Everything is extremely involving and you'll find yourself spending hours on the game without even realizing.</p>
<h2>Conclusion</h2>
<p>If you like rhythm games, or you want a challenge and you like involving music tracks that you would listen to even out of the game; Crypt of the Necrodancer is the game for you.</p>
<p>The final judgement, as usual, goes from 0 (kill it with fire) to 100 (owning this game should be a human right).</p>
<p>I think a fair score could be: <strong>91/100</strong></p>
<p>Thank you everybody again for reading, and see you on the next post!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, Linux",
"applicationCategory": "Dungeon Crawler",
"name": "Crypt of the Necrodancer"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "91",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Bioshock Infinity2017-06-27T00:00:00+02:002017-06-27T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-27:/game-bytes/GameBytes_BioshockInfinity.html<p>Preparate il vostro skyhook, perchè qui si vola alla grande con Bioshock Infinity!</p><h1>Preparate il vostro skyhook, perchè qui si vola alla grande con Bioshock Infinity!</h1>
<p>Buongiorno a tutti, oggi diamo un'occhiata a Bioshock Infinity, il terzo capitolo della saga di Bioshock. Ci sarebbero una marea di cose da dire, ma voglio essere il più ristretto possibile, quindi iniziamo subito!</p>
<h2>Grafica</h2>
<p>La grafica è stupenda, nonostante il mio computer mi abbia costretto a limitare la risoluzione a valori inferiori ad 800x600 (si, possiedo una macchinetta del caffè come PC). Le luci sono veramente ben fatte, le superfici hanno un'ottima qualità e l'impatto d'insieme è azzeccatissimo.</p>
<h2>Installazione E Prestazioni</h2>
<p>Nonostante l'enorme qualità delle texture e del filtraggio applicabili, gradisco infinitamente la presenza di opzioni più orientate verso quelli che potrebbero essere considerati dei tostapane più che dei PC. Le schermate di caricamento non durano troppo, ed i caricamenti in-mappa sono estremamente rari (si possono contare sulle dita di una mano in tutto il gioco).
Con le impostazioni a livelli medio-bassi il gioco gira fluido, nessuno scatto nemmeno nelle situazioni più concitate.</p>
<h2>Comparto Sonoro</h2>
<p>Effetti di alta qualità, ottima musica. Purtroppo il doppiaggio italiano suona un po' strano, ma non va ad inficiare troppo la godibilità dell'insieme.</p>
<h2>Il Gameplay</h2>
<p>Qui ci sarebbero da spendere libri sopra libri, il gameplay è solido, con un mix giusto di strategia ed azione. La maggior parte del tempo saremo accompagnati da Elizabeth, e la sua IA è tutto un programma: è in grado di mettersi al riparo da sola, vi rifornisce di munizioni nei momenti più critici, procura denaro e kit medici, fa notare alcuni accessori utili che il giocatore può mancare ed è stata applicata una forte dose di emozione al personaggio, così tanto che è possibile vedere quando Elizabeth è impensierita o impaurita, sembra una persona vera.</p>
<h2>Extra - La storia</h2>
<p>La storia inizia in maniera molto blanda, tende a farsi confusa avanzando nel gioco, spiegando non più dello stretto necessario fino alla fine, dove ci si aspetta un finale che lascia la bocca talmente aperta che ci potrebbe passare una nave da carico attraverso.</p>
<h2>Conclusione</h2>
<p>Anche se non avete giocato i primi due capitoli della serie, vi consiglio di provare questo gioco. Anzi, se avete la collezione completa, vi consiglio di giocare tutta la serie in ordine, finire Bioshock Infinite e poi ricominciare dall'inizio. Questo gioco vi rimarrà impresso così tanto che arriverete a notare particolari negli altri giochi che non avreste mai pensato di notare prima. Garantito.</p>
<p>Il giudizio finale, come nella precedente recensione, va da 0 (perchè questo gioco esiste?) a 100 (come puoi vivere senza?).</p>
<p>Penso un giudizio giusto, considerando l'impressione data ed i piccoli difetti qui e lì, sia <strong>98/100</strong></p>
<p>Grazie a tutti per aver letto, e ci vediamo al prossimo post!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Bioshock Infinity"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "98",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Game Bytes: Bioshock Infinity2017-06-27T00:00:00+02:002017-06-27T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-27:/en/game-bytes/GameBytes_BioshockInfinity.html<p>Get your SkyHook ready, because we're about to fly inside of Bioshock Infinity!</p><h1>Get your SkyHook ready, because we're about to fly inside of Bioshock Infinity!</h1>
<p>Greetings everybody, today we'll take a look at Bioshock Infinity, the third installment of the Bioshock saga. There are lots of things to say, but I want to be as short as possible, so let's dive into it!</p>
<h2>Graphics</h2>
<p>Graphics are marvelous, even though my PC forced me to limit the resolution to values lower than 800x600 (yeah, I own something more similar to a coffeemaker than a PC). Lights are really well-made, surfaces are really high quality and the overall looks are spot-on.</p>
<h2>Setup and Performance</h2>
<p>Even though the textures are really high-quality and you can apply lots of filtering, I infinitely appreciate the presence of settings that are more oriented towards toasters than PCs. Loading screens don't last too long, and the in-map loads are extremely rare (you can count them on the fingers of your hand in the whole game).
With my settings, which can be classified as medium-low, the game runs smooth, without any freeze or hiccup, even in the most chaotic situations.</p>
<h2>Sounds</h2>
<p>High quality effects, great music. Sadly the italian dubbing sounds a bit off, but that doesn't influence the enjoyment of the game.</p>
<h2>Gameplay</h2>
<p>I could write books about this, the gameplay is solid, the right mix of strategy and action. Most of the time we will travel with Elizabeth, and her AI is amazing: finds cover by herself during a fight, in the most critical moments she will find ammunition for you, finds cash and medkits, makes you notice some useful tools that you might miss and also there has been a huge dose of emotion injected into the character. So much you can see when Elizabeth is scared or Thoughtful, she looks just like a real person.</p>
<h2>Extras - The Story</h2>
<p>The story starts pretty slowly, and tends to become confused the more you go on with the game, explaining not much more than what's strictly necessary. Until the end, where a huge mind-bending jaw-dropping finale is waiting for you. So much that a full cargo ship will be able to go through your mouth.</p>
<h2>Conclusion</h2>
<p>Even if you didn't play the first two chapters of the series, I strongly suggest to try this game. Actually, if you have the complete collection, I suggest to play the series in its natural order, and after finishing Bioshock Infinite, start over from the first game. This game will stick into your mind so much that you'll notice details in the other games that you would never thought you would notice before. Guaranteed.</p>
<p>The final score, as in the previous review, goes from 0 (why does this game even exist?) to 100 (how can you live without it?).</p>
<p>I think a fair score, considering the impression it has given to me and the small flaws here and there, would be <strong>98/100</strong></p>
<p>Thank you everybody for reading, see you in the next post!</p>
<p>Penaz.</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows",
"applicationCategory": "First Person Shooter",
"name": "Bioshock Infinity"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "98",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Nuova sezione - Game Bytes2017-06-26T00:00:00+02:002017-06-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-26:/misc/GameBytes.html<p>Apertura di una nuova sezione del Sito: Game Bytes, recensioni brevissime di videogiochi che ho provato.</p><h1>Apertura di una nuova sezione del Sito: Game Bytes, recensioni brevissime di videogiochi che ho provato.</h1>
<p>Buongiorno a tutti,</p>
<p>oramai questo blog è diventato più una valvola di sfogo personale che non un sito "quasi-professionale" di consigli sul mondo dell'informatica, quindi ho deciso di aprire una nuova sezione allo scopo di espandere ulteriormente questo "deposito di pensieri": <strong>Game Bytes</strong>.</p>
<p>L'idea è di avere una piccola sezione dedicata ai giochi che ho acquistato (se non sono free-to-play o freeware), ricevuto in regalo, provato e valutato, in maniera estremamente concisa e, se necessario, incisiva.</p>
<p>L'obiettivo principale è dare un'idea generale di come un gioco si è presentato, mi ha impressionato (o meno) ed alla fine di tutto dare un punteggio in centesimi in base a come ho trovato personalmente l'esperienza di gioco.</p>
<p>Molto probabilmente osannerò eccessivamente giochi che mi sono piaciuti molto, mentre arriverò a lavare il pavimento con quelli che mi hanno fatto ribrezzo, ma una cosa è certa, eviterò di farmi influenzare da altri punteggi come Metacritic o IGN. Il tutto sarà frutto della mia personale esperienza col gioco.</p>
<p>Il termine "Game Bytes" è un qualcosa che ho pensato come gioco di parole tra "byte" inteso come "unità di misura", nell'informatica, rappresentante i videogiochi, e "byte" pronunciato similmente a "bite" inteso come "morso, boccone", un qualcosa di molto piccolo che può essere assunto tutto in una volta, rinforzando la brevità degli articoli, che solitamente saranno leggibili in meno di 2 minuti.</p>
<p>Insieme a questo annuncio, o perlomeno nello stesso giorno, dovrebbe uscire il primo post.</p>
<p>Saluti a tutti e grazie per la lettura!</p>
<p>Penaz.</p>Game Bytes: Hacknet + Labyrinths DLC2017-06-26T00:00:00+02:002017-06-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-26:/game-bytes/GameBytes_Hacknet.html<p>Diamo un'occhiata ad Hacknet, il simulatore di Hacking che ha appassionato molti videogiocatori.</p><h1>Diamo un'occhiata ad Hacknet, il simulatore di Hacking che ha appassionato molti videogiocatori.</h1>
<p>[TOC]</p>
<p>Oggi parliamo di Hacknet (e dell'annesso DLC Labyrinths). Quindi dividerò la recensione in due parti: il gioco principale ed il DLC.</p>
<h2>Il Gioco principale</h2>
<p>Il gioco inizia in maniera abbastanza misteriosa, e guida il giocatore nei primi passi con un tutorial abbastanza ben fatto. Il giocatore dovrà farsi strada tra molte missioni fino a scoprire cos'è successo a Bit, l'Hacker che ha contattato e guidato il giocatore all'inizio.</p>
<h3>La grafica</h3>
<p>La grafica è piacevole e ben ordinata, gli effetti grafici (quando ce ne sono) non distolgono troppo l'attenzione dal succo del gioco. Fa il suo lavoro egregiamente.</p>
<h3>Il comparto sonoro</h3>
<p>Le musiche sono fantastiche ed aiutano molto l'immersione nel gioco, soprattutto contribuiranno alla tachicardia della missione finale. Ottimo.
Non ho gradito molto alcuni jumpscare dati da "Incoming Connection", ma sono solo io che sono sempre nervoso.</p>
<h3>L'installazione e le prestazioni</h3>
<p>Il gioco gira abbastanza bene sul mio vecchio Core2Quad con una economica ASUS/NVidia EN9500GT, anche se per avere una grafica abbastanza semplice tutto sommato, il gioco tende a cadere sotto i 60 frame al secondo. Non vi sono stati blocchi di sorta in ogni caso.</p>
<p>L'installazione è stata dolorosa, dato che la nuova versione non voleva saperne di funzionare, ho dovuto utilizzare la versione del branch XNA, che di conseguenza mi ha fatto installare (l'odiatissimo) Windows Media Player per potermi godere le musiche di sottofondo</p>
<h3>Il Gameplay</h3>
<p>Il gameplay richiede molta concentrazione in alcuni punti, mentre risulta essere molto più simile ad "una routine" in altri. Il gioco tende a tenere per mano forse un po' più di quanto strettamente necessario; ma alla fine piuttosto di finire frustrati e bloccati, è meglio così.</p>
<h2>Il DLC: Hacknet Labyrinths</h2>
<p>Nuove musiche, nuove missioni, nuovi strumenti. Vediamo cosa offre il DLC.</p>
<h3>Grafica</h3>
<p>Non molto cambia da questo punto di vista, vi sono nuovi temi ed alcuni nuovi strumenti e sistemi di protezione da scassinare (con annesse animazioni).</p>
<h3>Il Comparto sonoro</h3>
<p>Nuove canzoni sono disponibili in questo DLC, e sono tutte di buona qualità, anche se sono oggettivamente un po' poche, e quindi tendono a ripetersi molto nel corso dell'espansione</p>
<h3>L'installazione e le prestazioni</h3>
<p>Nessun problema nell'installare l'espansione, e le performance non soffrono in alcun modo</p>
<h3>Il Gameplay</h3>
<p>E qui casca l'asino, nonostante il numero di nuovi (o rinnovati) strumenti, sistemi di protezione, eccetera; l'espansione risulta un po' poverina di contenuti.</p>
<p>La prima missione inizia col botto, con una musica di sottofondo che contribuisce molto ad intensificare le sensazioni derivanti da ciò che accade sullo schermo, sembra che si sia davanti ad una missione molto difficile già da subito. Ma alla fine sono solo due "sfide" (ed uso il termine alla leggera) molto sottotono. Avrei preferito un livello di sfida maggiore.</p>
<p>Il finale è buono, ponendo il giocatore davanti ad una decisione molto difficile con pochissimo tempo a disposizione.</p>
<p>L'espansione "contagia" anche altri contenuti già visitati precedentemente, aumentando la longevità del gioco, se si è disposti a scavare abbastanza a fondo.</p>
<h2>Extra</h2>
<p>L'espansione permette di accedere ai contenuti della comunità, allungando ulteriormente la vita del gioco. Purtroppo questi contenuti extra richiedono salvataggi ad-hoc, senza integrarsi col gioco principale.</p>
<h2>Conclusione</h2>
<p>Il gioco è veramente buono, e se volete un buon livello di sfida, che vi faccia provare anche qualche emozione forte, questo gioco fa per voi. Soprattutto se avete voglia di sentirvi hacker, anche se solo per finta.</p>
<p>Il sistema di punteggio va da 0 (questo gioco non avrebbe mai dovuto esistere) a 100 (siete moralmente obbligati a provare questo gioco).</p>
<p>Penso che un voto giusto possa essere <strong>87/100</strong></p>
<p>Grazie a tutti per aver letto, saluti a tutti!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, Linux",
"applicationCategory": "Hacking Simulation",
"name": "Hacknet"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "87",
"worstRating": "0",
"bestRating": "100"
}
}
</script>New Category - Game Bytes2017-06-26T00:00:00+02:002017-06-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-26:/en/misc/GameBytes.html<p>A new category in the website is being opened: Game Bytes, extremely short reviews of the games i tried.</p><h1>A new category in the website is being opened: Game Bytes, extremely short reviews of the games i tried.</h1>
<p>Greetings everybody,</p>
<p>this blog has become more and more a way to throw my thoughts somewhere instead of being an "almost-professional" website about information technology tips and tricks, so I decided to open a new section to further expand this "thought dump": <strong>Game Bytes</strong>.</p>
<p>The idea is to have a small section dedicated to videogames that I purchased (if not free-to play or freeware), got as gifts, tried and evaluated, in an extremely brief and, if necessary, incisive way.</p>
<p>The main objective is giving a general idea of how a game has introduced itself to me, if it has impressed me (or not) and at the end of everything give a score, out of 100, based on how I enjoyed the game experience.</p>
<p>It's a possibility that I'll praise way too much games that I liked a lot, while I'll mop the floor with games that I didn't enjoy, but one thing is sure, I'll avoid to get influenced by other scores like Metacritic or IGN. Everything will be based only from my gaming experience.</p>
<p>The term "Game Bytes" is a well-thought word play (in my humble opinion) between "byte" as "IT size unit", basics of the information technology, so to represent the videogames, and "byte" as it has a similar pronunciation as "bite", "chunk", something very small that can be consumed all at once, reinforcing the concept that the posts will be brief and usually can be read in less than 2 minutes.</p>
<p>Along with this announcement, or at least in the same day, the first post should come out.</p>
<p>Take care everybody and thank you for reading!</p>
<p>Penaz.</p>Game Bytes: Hacknet + Labyrinths DLC2017-06-26T00:00:00+02:002017-06-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-26:/en/game-bytes/GameBytes_Hacknet.html<p>Let's take a look at Hacknet, the hacking simulator that attracted a lot of players worldwide.</p><h1>Let's take a look at Hacknet, the hacking simulator that attracted a lot of players worldwide.</h1>
<p>Today we're talking about Hacknet (and the Labyrinths DLC). So I'll have to split the review into two parts: the Main Game and the DLC.</p>
<h2>The Main Game</h2>
<p>The game starts in a pretty mysterious way, and walks the player through the first steps, with a pretty well-made tutorial. The player will have to find their own way among lots of missions until they find out what happened to Bit, the hacker that contacted and guided the player in the beginning.</p>
<h3>Graphics</h3>
<p>Graphics are pleasing and well sorted, the effects (when there are any) don't distract too much from the game. Does the job nicely.</p>
<h3>Sounds</h3>
<p>The Music Tracks are fantastic and help a lot in involving the player, and most of all they'll contribute to the final-mission tachycardia. Amazing.
I didn't really appreciate some "Incoming Connection" jumpscares, but that's just me being nervous all the time.</p>
<h3>Setup and performance</h3>
<p>The game runs well enough on my old Core2Quad with a cheap ASUS/Nvidia EN9500GT, even though it has some pretty simple and clean graphics, the game tends to run under 60fps. Anyway there haven't been any lockups.</p>
<p>The Setup was painful, since the new version didn't want to work at all, I had to use the XNA branch version, which forced me to install (the hated) Windows Media Player so I could enjoy the background music.</p>
<h3>Gameplay</h3>
<p>The gameplayer requires a lot of concentration in some points, while it ends up being pretty much "a chore/a routine" in some others. The game tends to guide the player a bit more than what's strictly necessary; but it's better like this instead of ending up frustrated and swamped at a point of the story.</p>
<h2>The DLC: Hacknet Labyrinths</h2>
<p>New music, new missions, new tools. Let's see what the DLC has to offer.</p>
<h3>Graphics</h3>
<p>Not much changed here, there are some new themes, some new tools and protection systems to break (with their own animations and all).</p>
<h3>Sounds</h3>
<p>Some new music is available in this DLC, and they're all pretty good, even though the tracks are objectively a bit too few, so they tend to repeat a lot during the DLC playthrough.</p>
<h3>Setup and Performance</h3>
<p>No problem in installing this expansion pack, and the performance are not suffering in any way.</p>
<h3>Gameplay</h3>
<p>And here's the rub, even though there's a decent number of new (or renewed) tools, protection systems, etc... the expansion is kinda poor in content.</p>
<p>The first mission starts with fireworks and all, with a background music that contributes a lot in intensifying the sensations that you get from looking at what's happening on the screen, it looks like you're about to start up with a very difficult mission right away. Instead we're facing a couple of undertone "challenges" (and I use the word loosely here). I would have preferred a higher level of dare.</p>
<p>The ending is good, forcing the player to take a very hard decision with very little time available.</p>
<p>The expansion "spreads" to other contents of the main game that we visited earlier, enhancing the game's longevity, if you're up to dig deep enough.</p>
<h2>Extras</h2>
<p>The DLC allows to access community-made contents, giving even more life to the game. Sadly these extra contents require ad-hoc savefiles, so they don't "become one" with the main game.</p>
<h2>Conclusion</h2>
<p>The game is very good, and if you want a good challenge, that makes you feel some strong emotions, this game is for you. Even more if you want to feel like a hacker, even though you're just pretending.</p>
<p>The score goes from 0 (this game should have never existed in the first place) to 100 (you are morally forced to try this game).</p>
<p>I think a suitable score for this game could be <strong>87/100</strong></p>
<p>Thanks for reading, see you next time!</p>
<p>Penaz</p>
<p>{% from 'ad.html' import ad %}
{{ ad() }}</p>
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Review",
"author": "Penaz",
"itemReviewed": {
"@type": "VideoGame",
"operatingSystem": "Windows, Linux",
"applicationCategory": "Hacking Simulation",
"name": "Hacknet"
},
"reviewRating": {
"@type": "Rating",
"ratingValue": "87",
"worstRating": "0",
"bestRating": "100"
}
}
</script>Greenlight is dead, long live greenlight! (English Only post)2017-06-10T00:00:00+02:002017-06-10T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-10:/misc/GreenLight_Is_Dead.html<p>As many of you know, Steam Greenlight is on its way out, let's analyze my point of view on this matter</p><h1>As many of you know, Steam Greenlight is on its way out, let's analyze my point of view on this matter</h1>
<p>Greetings everybody,</p>
<p>As many of you know, these days Valve is working hard on phasing out the system that we all have known as Steam Greenlight, a community-based voting system that allowed game developers to present their games to a huge public and eventually get them sold for a 100$ one-time fee.</p>
<p>A system that we all loved, or hated. Or Both.</p>
<p>Sadly, as all systems that require or allow uncontrolled public intervention and decision, exploits are bound to happen, and that's what happened with our beloved Greenlight. Some time after the launch, some shady people saw an easy-ish way to get money out of making videogames, and (again) sadly looked for all the easiest ways to spend the least amount of time possible coding/working on the project and just push out as many videogames as possible for a one-time 100$ fee.</p>
<p>This is how (in very few words) the marketplace has been literally littered with what today we know as "asset flips", which means buying some premade assets from online stores (like the Unity asset store), putting them together and selling the final product.</p>
<p>Are asset stores bad? Never said so, asset stores are meant to be a cost-effective way to give some developers a basis for their projects upon where they get to build their own ideas.</p>
<p>But some people thought that taking a pre-made game structure (See UnitZ on Unity Asset Store) and re-selling it as it is was a nice idea for making a quick buck.</p>
<p>This is asset flip in a few words for you.</p>
<p>Then there is the developer community, and I don't like bashing my own category, but sometimes a spank is needed by a colleague (if I'm allowed to consider myself as such).</p>
<p>Sadly many developers are really deaf to suggestions, thinking they know better, or even worse, banning whoever has the nerve to call them out on something (like asset flipping). This toxicity in the community didn't bring anything good to the storefront. Digital Homicide, anybody remember?</p>
<p>Don't get me wrong, I've done that myself, out of pride for my own project, or sheer frustration over something I can't control that could hinder or potentially kill my project, but I'm working hard on changing my behaviour towards critics and take in the fact that I should put my pride aside and listen to who will have to deal with the product I'm making.</p>
<p>The final user, the customer, but most of all <strong>the player</strong> are not a body with a dollar (or Euro in my case) sign in place of their face, they're real people, who probably care about a project as much as the developer does him/herself. If a user has a suggestion, it's probably something well thought.</p>
<p>Players are as much of customer as they are a resource, and they should be treated respectfully as such. Besides one case that I'm going to talk about now.</p>
<p>Trolls.</p>
<p>Trolls, trolls, trolls. People who find it funny and satisfying to ruin other people's day by making nasty comments, finding a way to make people's life miserable and other despicable things.</p>
<p>It is not just the small commenter that leaves an offensive/frustrating comment under your project, the trolls sadly are inside the developer side of Steam too.</p>
<p>Greenlight used to have two sections:</p>
<ul>
<li>The official Greenlight: where you can put your project up for voting and having a chance to get on the storefront</li>
<li>The Draft Section: where, for free, you can "feel the ground", and see the reaction of the community to your project</li>
</ul>
<p>The free Drafts section was littered with Meme-filled, troll projects that took away visibility to many better-deserving drafts that couldn't even gather enough data to see if it was worth going on coding.</p>
<p>I myself had a project in the Draft section, and got about 30 votes in total, in over 1 year, with a ratio of about 75% yes and 25% no. Obviously my perfectionism told me to stop coding because one out of 4 people wouldn't like the project, but a sample of 30 people is way too little to get any final judgement.</p>
<p>It's pretty bitter when your project gets ignored, but it's even worse when you know the project is ignored in big part because people can't see it, under the pile of, let me say that please, meme-filled garbage.</p>
<p>As a small side note, many of the products that came from Greenlight were plagued by repetition, and stealing ideas from one another. Try to look hard and you'll notice that there are tens of project that are based (or literally rip off) the concept of games that had success, like Five Nights At Freddy's or Slender.</p>
<p>Then there's the voting system, a simple yes/no question: "Would you buy this game if it was on the Steam Storefront?". Simple in theory, hard in practice. Many people seemed to vote "yes" out of sheer curiosity of what the product would be, many times bringing just another ripoff.</p>
<p>This ties directly to another matter that I would take away from Steam almost immediately: Early Access.</p>
<p>It's true, not everybody can afford a beta testing team, but at the same time selling a product as "early access" most of the time is going to prove just another ripoff for the player's pockets, as the product won't ever get updates and will never ever ever come out of the "early access status".</p>
<p>Don't get me wrong, there are awesome early access games, like CrossCode (Just look at the trailer) or Crypt Of The Necrodancer Amplified DLC, an awesome DLC for an awesome game. But sadly these seem to be the exceptions to the rule.</p>
<p>Greenlight brought to us not only bad things, but also some awesome games that would have never made it to players through normal means, without a publisher that would have taken great amounts of money from the developers.</p>
<p>Was Steam Greenlight all bad in the end? No, not at all. It needed some serious revision though, and now with Steam Direct, we might be on the right path, but it's too early to say anything. As we say here in Italy (rough translation):</p>
<blockquote>
<p>Make the law and you've found the loophole.</p>
</blockquote>
<p>It's almost sure that someone will find a way to get around the new system and sell their items just like before. And if Steam Direct will manage to put a cork on all the issues that Greenlight had, people that want to rip off other people will probably just move to other platforms, like Itch.io.</p>
<p>As a closing note, I would like to thank all the people that supported my project through Greenlight, and even the ones that didn't, since your amazing words kept and still keep me going, and the criticism pushes me to not only do better, but to take my time to do the best possible. All your comments have been saved in my Big PC and kept close as a treasure.</p>
<p>Again, thank you for reading this post, have a great day.</p>
<p>Penaz.</p>Altri libri gratis con ApressOpen2017-06-06T00:00:00+02:002017-06-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-06:/gratis-sul-web/ApressOpen.html<p>Vediamo l'offerta di libri gratis di APress, un sacco di libri sulla programmazione pronti da scaricare</p><h1>Vediamo l'offerta di libri gratis di APress, un sacco di libri sulla programmazione pronti da scaricare</h1>
<p>Buongiorno a tutti,</p>
<p>Come ho fatto già con <a href="https://penazarea.altervista.org/gratis-sul-web/FreeLearning.html">Packt</a> ed <a href="https://penazarea.altervista.org/gratis-sul-web/OReilly_Ebook.html">O'Reilly</a>, oggi voglio proporvi un'altra collezione di libri di qualità da parte di APress Publishing, qui troviamo una collezione di circa 25 libri su vari argomenti, tra cui:</p>
<ul>
<li>Machine Learning</li>
<li>Infosec</li>
<li>Programmazione di GUI per Android</li>
<li>Computer Vision</li>
<li>Internet delle Cose</li>
</ul>
<p>La lista contiene libri abbastanza recenti e (purtroppo) sono tutti in inglese, ma ancora una volta, se siete programmatori molto probabilmente conoscerete la lingua come le vostre tasche.</p>
<p>Potete esplorare i titoli ApressOpen tramite <a href="http://www.apress.com/it/apress-open/apressopen-titles">questo link</a>.</p>
<p>Grazie ancora per aver letto questo articolo, e buona lettura a tutti!</p>
<p>Penaz</p>More Free Ebooks with ApressOpen2017-06-06T00:00:00+02:002017-06-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-06-06:/en/gratis-sul-web/ApressOpen.html<p>Let's see what Apress has to offer, a lot of development-oriented ebooks ready to download on your PC.</p><h1>Let's see what Apress has to offer, a lot of development-oriented ebooks ready to download on your PC.</h1>
<p>Hello everybody,</p>
<p>As I've already done in the past with <a href="https://penazarea.altervista.org/en/gratis-sul-web/FreeLearning.html">Packt</a> and <a href="https://penazarea.altervista.org/en/gratis-sul-web/OReilly_Ebook.html">O'Reilly</a>, today I want to suggest another collection of quality ebooks from APress Publishing, in the page we can find a collection of about 25 books on various subjects, including:</p>
<ul>
<li>Machine Learning</li>
<li>Infosec</li>
<li>Android GUI Programming</li>
<li>Computer Vision</li>
<li>Internet of Things</li>
</ul>
<p>The list contains a lot of pretty recent books, all in english.</p>
<p>You can explore the ApressOpen list with <a href="http://www.apress.com/it/apress-open/apressopen-titles">this link</a>.</p>
<p>Thanks again for reading this post, and have a nice read!</p>
<p>Penaz</p>Libri gratis da O'Reilly Media2017-05-23T00:00:00+02:002017-05-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-05-23:/gratis-sul-web/OReilly_Ebook.html<p>Anche O'Reilly salta sul treno dell'apprendimento gratuito, vediamo la loro offerta!</p><p>Buongiorno a tutti,</p>
<p>Come seguito spirituale dell' <a href="https://penazarea.altervista.org/gratis-sul-web/FreeLearning.html">articolo su PacktPub</a>, oggi vi propongo una offerta di libri gratis da parte di O'Reilly Publishing, tutti con argomento principale l'informatica, con una nutrita sezione dedicata alla programmazione. Possiamo vedere, tra i tanti:</p>
<ul>
<li><a href="http://www.oreilly.com/programming/free/">Programmazione</a><ul>
<li>Ingegneria del software</li>
<li>Open Source</li>
<li>Architettura del software e pattern di design</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/business/free/">Aziende e leadership</a></li>
<li><a href="http://www.oreilly.com/data/free/">Data Science e Big Data</a><ul>
<li>Aziende ed industria</li>
<li>Data Science</li>
<li>Libri sull'intelligenza artificiale</li>
<li>Architetture Big Data</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/iot/free/">Hardware ed Internet Delle Cose (IoT)</a><ul>
<li>Libri introduttivi</li>
<li>Design</li>
<li>IoT industriale e manifatturiero</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/security/free/">Sicurezza</a></li>
<li><a href="http://www.oreilly.com/web-platform/free/">Sviluppo Web</a><ul>
<li>Sviluppo</li>
<li>Miglioramento delle prestazioni</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/webops/free/">DevOps e WebOps</a></li>
</ul>
<p>Il tutto è scaricabile gratis previa registrazione gratuita.</p>
<p>Purtroppo tutti i libri sono in lingua inglese, ma ciò non dovrebbe essere un problema insormontabile.</p>
<p>Sembra che l'editore abbia intenzione di rilasciare nuovi libri ogni tanto. Quindi vale la pena tenere d'occhio il sito.</p>
<p>Grazie per aver letto questo articolo e buona lettura a tutti!</p>
<p>Penaz.</p>O'Reilly Media giving out free ebooks2017-05-23T00:00:00+02:002017-05-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-05-23:/en/gratis-sul-web/OReilly_Ebook.html<p>O'Reilly jumps on the free learning train too, let's check out their offers!</p><p>Hello everybody,</p>
<p>As a spiritual successor of <a href="https://penazarea.altervista.org/en/gratis-sul-web/FreeLearning.html">this article</a>, today I want to show you an offer for free ebooks from O'Reilly Publishing, all with main subject computer science, with a well made section about programming. We can see, among the many others:</p>
<ul>
<li><a href="http://www.oreilly.com/programming/free/">Programming</a><ul>
<li>Software Engineering</li>
<li>Open Source</li>
<li>Software Architecture and Design patterns</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/business/free/">Businesses and Leadership</a></li>
<li><a href="http://www.oreilly.com/data/free/">Data Science and Big Data</a><ul>
<li>Businesses and Industry</li>
<li>Data Science</li>
<li>AI-related Ebooks</li>
<li>Big Data Architecture</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/iot/free/">Hardware and Internet of Things (IoT)</a><ul>
<li>Introductory books</li>
<li>Design</li>
<li>Industrial and Manifacturer-related IoT</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/security/free/">Security</a></li>
<li><a href="http://www.oreilly.com/web-platform/free/">Web Development</a><ul>
<li>Development</li>
<li>Performance Improvement</li>
</ul>
</li>
<li><a href="http://www.oreilly.com/webops/free/">DevOps and WebOps</a></li>
</ul>
<p>Everything can be downloaded with a free registration.</p>
<p>Also it looks like the publisher is going to release new ebooks once in a while, so it's worth to keep an eye on the website.</p>
<p>Thank you everybody for reading this article, happy reading!</p>
<p>Penaz.</p>Un libro al giorno, gratis, da PacktPub2017-04-22T00:00:00+02:002017-04-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-04-22:/gratis-sul-web/FreeLearning.html<p>Approfittiamo dell'offerta 'Free Learning' di PacktPub per avere un libro al giorno gratis!</p><h1>Approfittiamo dell'offerta 'Free Learning' di PacktPub per avere un libro al giorno gratis!</h1>
<p>Buongiorno a tutti,</p>
<p>Se siete programmatori, o aspiranti tali, ed avete una buona conoscenza della lingua inglese, allora non potete perdervi l'offerta "Free Learning" di Packt Publishing; se siete registrati al sito (la registrazione di per sè è gratis) potete avere accesso ad un libro gratis al giorno.</p>
<p>Il meccanismo funziona tramite "claiming", cioè se vedete un libro che vi piace cliccate sul tasto "claim", come se voleste dire "ne voglio una copia" e questa verrà automaticamente trasferita sul vostro account, senza alcun pagamento da fare o complessi passaggi.</p>
<p>I libri spaziano dalla programmazione base in Python, passando per Node.js ed i suoi design patterns, concorrenza fino ad arrivare addirittura alla generazione procedurale di contenuti per la creazione di videogiochi, oltre all'uso di framework per creare tali videogiochi.</p>
<p>Se volete vedere il libro a disposizione di oggi, vi basta seguire <a href="https://www.packtpub.com/packt/offers/free-learning">questo link</a></p>
<p>Per oggi è tutto, grazie per aver letto questo articolo e ci si vede alla prossima!</p>
<p>Penaz.</p>A free book everyday, from PacktPub2017-04-22T00:00:00+02:002017-04-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2017-04-22:/en/gratis-sul-web/FreeLearning.html<p>Let's take a look at the 'Free Learning' offer from PacktPub and get a free ebook every day!</p><h1>Let's take a look at the 'Free Learning' offer from PacktPub and get a free ebook every day!</h1>
<p>Greetings everybody,</p>
<p>If you're programmers, or aspire to be one, you have a good knowledge of the english language, then you cannot miss the "Free Learning" offers from Pack Publishing; if you're registered to the website (it's free) you can access a free ebook a day.</p>
<p>Everything works via a "claiming" mechanic, if you see a book that you like, you click the "claim" button, like you would say "I want a copy of that" and that book will be automatically transferred to your account, without any payment to do, or complex stuff to take care of.</p>
<p>The book subjects go from basic programming in Python, up to Node.js and its design patterns, then through concurrency and you can even get to procedural content generation for videogame development, and the usage of frameworks to create such videogames.</p>
<p>If you want to see the book available today, just follow <a href="https://www.packtpub.com/packt/offers/free-learning">this link</a></p>
<p>That's all for today, thanks for reading this post and see you next time!</p>
<p>Penaz.</p>Glitch_Heaven DevLog: January & February 2017 - GH is dead (for now)2017-02-25T00:00:00+01:002017-02-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-25:/glitch_heaven/GH_DevLog_2017_01_02.html<p>Probably the hardest post I had to write in 5 years of blogging.</p><h1>Probably the hardest post I had to write in 5 years of blogging.</h1>
<p>Hello Everybody,</p>
<p>for the few fans and supporters of the Glitch_Heaven project, I find myself forced to give a bad news, which is also a good one, if looked from a certain perspective, I guess...</p>
<p>Glitch_Heaven is dead, it has been for quite a while, the project kind of outgrew its own platform.</p>
<p>Let me explain. For sake of code readability, which would be good on my side, I decided to use Python 3 as programming language for the game.</p>
<p>Now, now, before you go pry out your eyes with a blunt knife because I'm using an interpreted language, let me explain.</p>
<p>Python gives me the huge advantage of making an edit and seeing it in action practically real time, which makes tinkering with parameters exponentially faster than any compiled language out there, like editing physics. All of this at the cost of a bit of raw performance on the logic code, since the whole graphics/audio/controls part is done in C language (or C++, I can't really recall).</p>
<p>The problem lies on another piece of the game: PyGame. Sadly pygame's support for hardware rendering is just not worth it, aka brings a lot more trouble than benefits. So Glitch_Heaven, and this is the part I kind of find amazing, is done completely via software rendering. All the particles (which aren't really that great), the character, ground, they're all SDL software surfaces.</p>
<p>And this is where I hit a wall about 3 months ago, right when University activity started to get really "hardcore", if I used any kind of resolution higher than its standard 800x600, the game would start having frame dips that went from the normal 60fps to as low as 20fps.</p>
<p>I thought the main problem lied in some flaw in my logic code, or in a mix of said flaws, but no matter how many flaws I saw, no mix of them could justify such poor performance. Then I began thinking of all the things that I wanted to add: visual effects, new modes, better graphics, simple obstacle AI and who knows what else. And I realized a thing.</p>
<p>I took the wrong way.</p>
<p>I already thought that using "dirty rect updates" was useless, since the game requires to update the whole screen surface every frame, so no performance could get squeezed from there, particles couldn't be even more microscopic SDL surfaces that get created and deleted every second.</p>
<p>I realized that I needed the help of GPUs.</p>
<p>And this is where things get bad, I have absolutely zero knowledge of any non-software rendering, nor I think I'll ever have the time to take and study Unreal Engine or Unity, also because:</p>
<ol>
<li>It would be overkill to use a 3d Engine for a 2d game</li>
<li>I want to keep the advantage of almost-realtime edits given by Python</li>
<li>I want to keep the code readability that Python gives me</li>
</ol>
<p>Also now there are JIT solutions like PyPy, which allow to get even closer to compiled language performance. So why not use them?</p>
<p>I would lean towards a PyGLet-based engine specifically made for 2D games: cocos2d.</p>
<p>Though, this would require a complete re-writing of the game itself, which I have no idea if I can do, considered University and the time it would still take to learn the engine.</p>
<p>Lots of miscalculation was involved in this project, never I would have thought I would have had so much material to just shove into this piece of software, nor I would have thought that a simple software-based rendering would one day be simply "not enough".</p>
<p>Another reason I'm taking down this project is due to another recent happening in the indipendent and the videogaming industry as a whole: Steam Greenlight is getting taken down.</p>
<p>As you might have seen in the <a href="https://penazarea.altervista.org/en/glitch_heaven-official-page.html">Official Page</a>, Glitch_Heaven has a concept greenlight page which sadly never had much success, on one side because there are projects that are just better: better ideas, better graphics, better sound. On the other side, which is why Greenlight is getting taken down, it's because Glitch_Heaven itself was completely submerged by the humongous load of garbage that people post on the platform just because it's free, so it's such a great idea to post meme-filled projects, or projects that are just memes without a different finality of annoy the users as much as humanly possible.</p>
<p>The project never really caught on, with only 392 views in 390 days on greenlight, 28 "Yes" votes and 6 "no" votes, 90% of them received within the first week from the publication on the platform.</p>
<p>I didn't want this project to become the n-th "brownlight product", I wanted to do something that players could enjoy, something that was done with care and not just to get a quick buck.</p>
<p>The idea was to spend those 100$ on the Greenlight program and put the game up at 99¢, just so I could see that my work was appreciated, kind of like a "token of appreciation" so to say. Now there are rumors about "Steam Direct", and how it could ask from 500$ to even 50k\$, I barely had the money to enter Greenlight, let alone now have the money to enter Direct.</p>
<p>The alternative would be Itch.io, which offers free submission of the projects, but not nearly as much visibility as Steam.</p>
<p>Given this, the main issue stays: I took the wrong path in coding the game.</p>
<p>Another small issue, very minor, is the "Rage game" matter. So many people call this a "rage game", and honestly I'm kind of tired of fighting this "rage game" battle. I kind of consider Glitch_Heaven to be on the level (please, please pardon me the comparison) of Ghosts'n'Goblins for the NES (besides the whole "do all the levels twice" thing), and to my knowledge that isn't considered a rage game.</p>
<p>Glitch_Heaven is glitchy, yes, but that's the name of the game, each level is consistent with its glitchiness, and in the stock levels you'll never find things that will trick you more than once, or hidden death traps that pop out of nowhere or anything else purposedly made to make you scream.</p>
<p>Will the whole thing die horribly?</p>
<p>I don't really know, I have part of the story laid out, and I still want to get back to it, revise it and make it more entertaining, kind of like writing a book; and maybe one day, hopefully not too far in the future we'll see a "Glitch_Heaven Rebirth", made in cocos2d, with OpenGL support and loads of other things I really can't wait to see.</p>
<p>But that's another story to be written another day.</p>
<p>There we go, thank you everybody for reading this <strong>really long</strong> rant of mine.</p>
<p>I wish you the best things possible.</p>
<p>Penaz.</p>Stato della migrazione degli articoli - 25/02/20172017-02-25T00:00:00+01:002017-02-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-25:/misc/PostMigration.html<p>Notizie sullo stato di migrazione del sito, varie ed eventuali</p><h1>Notizie sullo stato di migrazione del sito, varie ed eventuali</h1>
<p>Salve a tutti!</p>
<p>La migrazione di tutti gli articoli del vecchio sito (creato ai tempi con Wordpress, gusti discutibili e poca esperienza) verso il nuovo, più veloce, leggero e malleabile sito statico sta procedendo bene, anche se un po' più lentamente di quanto vorrei.</p>
<p>Il fatto principale è che devo migrare tutti gli articoli a mano, estraendoli direttamente dall'XML di backup che ho creato con Wordpress, dato che lo script di migrazione automatica non funziona, in più questo mi dà una possibilità di scremare gli articoli oramai non più utili/validi o comunque con standard qualitativi abbastanza "sotto terra".</p>
<p>Finora sono stati migrati quasi 90 articoli e 15 "pagine statiche" (ora è tutto generato e staticizzato), arrivando ad una percentuale di circa il 30% del sito totale (per fortuna che mi considero un tipo di poche parole).</p>
<p>A tutto questo si aggiunge poi la gestione delle immagini necessarie in alcuni post per poter essere comprensibili, oltre a voler convertire tutti gli articoli in puro MarkDown, invece di lasciare pezzi di HTML che girano.</p>
<p>Sperabilmente riuscirò a finire tutto questo al più presto, in modo da potermi dedicare ad altri progetti, nuovi articoli, storie di vita vera (iniziato con <a href="https://penazarea.altervista.org/misc/the_db_project.html">il progetto di basi</a>) ed altro.</p>
<p>Grazie per aver letto questi aggiornamenti e buon proseguimento a tutti!</p>
<p>Penaz</p>Post Migration Status 02/25/20172017-02-25T00:00:00+01:002017-02-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-25:/en/misc/PostMigration.html<p>News on the migration of the website, includes misc stuff</p><h1>News on the migration of the website, includes misc stuff</h1>
<p>Greetings everybody!</p>
<p>The migration of all the posts of the old website (back the it was made with Wordpress, little experience and a dash of questionable tase) towards the newer, faster, leaner and flexible static website is going well, even though it's a bit slower than what I wanted it to be.</p>
<p>The main fact is that I need to migrate all the posts by hand, extracting them by the backup XML i made with Wordpress, since the automatic migration script crashes on me, also this gives me the change to skim the posts that are outdated/invalid or anyway with "under the ground" quality standards.</p>
<p>Until now almost 90 posts and 15 "static pages" (well, now everything is generated and static) have been migrated successfully, so we're about 30% done (luckily I consider myself a person of few words).</p>
<p>Add to all this that I need to manage all the images that are necessary to make some posts understandable, as well as convert the articles in pure MarkDown, instead of just leaving pieces of HTML laying around.</p>
<p>Hopefully I'll manage to finish all this as soon as possible, so I will be able to dedicate myself to other projects, new articles, real life stories (started with <a href="https://penazarea.altervista.org/en/misc/the_db_project.html">the Databases Project</a>) and more.</p>
<p>Thank you all for reading this update and have a nice one!</p>
<p>Penaz</p>Skype Alpha per Linux - Seconde Impressioni2017-02-11T00:00:00+01:002017-02-11T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-11:/misc/skype-alpha-per-linux-seconde-impressioni.html<p>Pensieri, giudizi, altri cambi di direzione sulla nuova versione per Linux di uno dei più famosi client VoIP e chat al mondo</p><h1>Pensieri, giudizi, altri cambi di direzione sulla nuova versione per Linux di uno dei più famosi client VoIP e chat al mondo</h1>
<p>Buongiorno a tutti,</p>
<p>Oggi ho deciso, dopo mesi dalle mie <a href="https://penazarea.altervista.org/misc/Skype_PrimeImpressioni.html">Prime impressioni</a>, di cambiare, rinfrescare e rivedere il mio giudizio sul nuovo client Skype per linux.</p>
<p>Iniziamo prima di tutto con una notizia arrivatami proprio oggi: Il vecchio client 4.3 cesserà di essere supportato dal 1° Marzo 2017.</p>
<p>La mia risposta di base è: <strong>no</strong>.</p>
<p>Non va bene, ed ora vi spiegherò il mio punto di vista.</p>
<h2>L'avvio</h2>
<p>Come prima, meglio di prima, circa.</p>
<p>L'avvio è ancora più veloce, direi quasi istantaneo, ed è fantastico, se non fosse (confermando quanto detto prima) che il sistema di conservazione delle login si basa esclusivamente su Gnome-Keyring. Soprattutto quando la parte del leone nei desktop environments la fa KDE, seguita da XFCE e solo dopo abbiamo GnomeShell, al pari con Cinnamon Desktop. Ancora una volta, il supporto a diversi password manager sarebbe gradito e giusto, dato che non di solo Gnome vive l'utente Linux, anzi... (Io uso OpenBox per esempio)</p>
<h2>L'esecuzione e glitch</h2>
<p>E qui iniziano un po' I dolori, Skype Alpha è una versione (de)glorificata di Chromium, con tutte le cose che ne conseguono. Da "top" posso vedere che vi sono mediamente due processi "skypeforlinux" in esecuzione, che consumano tra il 6 ed il 12% del processore (pidgin ne consuma mediamente il 7% con Skypeweb, Steam, Telegram e Facebook attivi), un po' tantino per un programma che non sta facendo nulla, è in "idle".</p>
<p>Proseguiamo con un glitch che ho rilevato praticamente subito:</p>
<p><img alt="Glitch Menu Skype" src="https://penazarea.altervista.org/images/2017/02/SkypeGlitch.png" /></p>
<p>Il menu volante è di classe devo dire.</p>
<p>Inoltre, nonostante questa sia la versione più aggiornata disponibile (1.17.0.1), ancora alcune funzionalità non sono disponibili o funzionano <strong>veramente</strong> male.</p>
<p>Iniziamo con il trasferimento di files, che funziona una volta si e 3 no, con un carinissimo messaggio "Questa versione di skype non supporta il trasferimento di file tramite P2P".</p>
<p>Continuiamo con l'uso della webcam, ancora non ci sono le impostazioni della webcam per poter settare la nostra webcam al meglio, anche perchè se clicchi su quella piccola telecamerina la tua webcam non si attiverà. Carino.</p>
<p>Le chiamate cadono a caso, circa dopo un'ora di conversazione, almeno per me e se si tenta di richiamare, l'altro capo non squilla.</p>
<p>Il pulsante di chiusura resta ancora un maledettissimo "riduci ad icona" di default, non voglio avere un'altra finestra nella mia taskbar! Fortuna vuole che posso configurare openbox per ignorare alcune finestre dai tasks, ma è comunque estremamente irritante che il mio window manager si debba adattare ad un pezzo di software quando dovrebbe essere il contrario. Irritante a dir poco.</p>
<p>A meno che non si vada ad esplorare tra le opzioni e si scelga l'opzione "Close to tray", aggiunta da poco. Almeno quello.</p>
<p>Ovviamente questa opzione non sta tra le opzioni, ma nel menu "Tools" (Strumenti). Sensato.</p>
<h2>Cose di troppo, cose che mancano</h2>
<p>I bots: Inutili a mia opinione, rendono solo più caotica l'esperienza, inoltre non funzionano poi così bene.</p>
<p>I mojis sono carini e divertenti, ma non sono così fondamentali per una buona esperienza, io mi concentrerei di più sulla qualità del servizio in sè.</p>
<p>Mi manca tantissimo la possibilità di fare CTRL+Tab tra la conversazioni come facevo con Skype 4.3 + SkypeTab oppure come faccio ora con <a href="https://penazarea.altervista.org/misc/Pidgin.html">Pidgin</a> unito al plugin Purple-Skypeweb. Skype Alpha mi costringe ad usare il mouse (o touchpad che sia) anche quando non sarebbe strettamente necessario.</p>
<p>Il tema dark permette al software di adattarsi ad ambienti grafici più scuri, come il mio, ma ancora una volta, veramente era necessario metterlo subito invece di concentrarsi sul far funzionare il servizio al meglio?</p>
<h2>Conclusioni</h2>
<p>Secondo me il nuovo Skype per Linux non è pronto: lo scarsissimo supporto all'alta variabilità degli ambienti Linux, unito a funzionalità che non funzionano propriamente rendono questo prodotto decisamente poco appetibile a questa utenza, che probabilmente migreranno ad altri sistemi concorrenti come Telegram o <a href="https://penazarea.altervista.org/misc/tox-una-nuova-alternativa-che-potrebbe-soppiantare-skype.html">Tox</a>.</p>
<p>E coloro che invece hanno troppi contatti che usano questo software dovranno semplicemente sopportare il dolore di un software che non è eccelso, basato sul web e funzionante a singhiozzo. In alternativa, come me, si può scendere ad un compromesso tramite Pidgin e Purple-SkypeWeb, rinunciando a chiamate (per ora) e possibilità di modificare i messaggi, mojis ed altro per una esperienza di messaggistica più leggera ed integrata.</p>
<p>Se Microsoft vuole veramente dismettere Skype 4.3 entro Marzo, farebbe meglio a muoversi molto in fretta, perchè a quanto vedo, il software è ancora, come dice il nome, una Alpha. E si vede.</p>
<p>Grazie a tutti per aver letto questo mio sproloquio infinito e ci vediamo al prossimo post!</p>
<p>Penaz</p>Il nuovo PenazArea è online!2017-02-08T00:00:00+01:002017-02-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-08:/misc/New_WebSite_Pelican.html<p>Un nuovo sito web è apparso!</p><h1>Un nuovo sito web è apparso!</h1>
<p>Salve a tutti, sono lieto di annunciare che il nuovo Penaz's Area è disponibile!</p>
<p>Devo dire che non ero propriamente pronto a mandare il tutto online, ma dopo aver visto che nessuno dei miei post era visibile a causa di un problema di wordpress era l'ultima goccia.</p>
<p>Il sito è stato creato per essere veloce, leggero e non-invasivo.</p>
<p>Tutti i vecchi post verrano migrati uno alla volta, appena ho del tempo libero.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>The new PenazArea is now online!2017-02-08T00:00:00+01:002017-02-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-08:/en/misc/New_WebSite_Pelican.html<p>A wild new website appears!</p><h1>A wild new website appears!</h1>
<p>Hello everybody, I'm proud to announce that the new Penaz's Area is now online.</p>
<p>I have to say I wasn't really ready to deploy the website yet, but finding out that none of the posts I made were visible anymore due to Wordpress breaking on me was the last straw.</p>
<p>The website is meant to be light, fast and non-invasive.</p>
<p>The posts will be migrated one at a time, when I have free time.</p>
<p>Enjoy!</p>
<p>Penaz.</p>Storie di Vita vissuta: Il progetto di basi2017-02-06T00:00:00+01:002017-02-06T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-06:/misc/the_db_project.html<p>Una storia fatta di deadline, disperazione ed un pizzico di SQL. Con un' amara lezione alla fine.</p><h1>Una storia fatta di deadline, disperazione ed un pizzico di SQL. Con un' amara lezione alla fine.</h1>
<p>Questa è una piccola storia ed una lezione che dovrò ricordare per il resto della mia vita. Situazione: sto lavorando ad un database per un mio esame universitario, sia a circa un giorno dalla data di consegna, tutto è perfetto, il database funziona senza alcun errore, tutti i trigger funzionano e le funzioni sono perfette, considerando i dati di prova (circa 3 record per tabella) che avevo fatto a mano, ricevo dalla mia compagna i dati da dare in pasto al database, tutto sembra andare alla grande</p>
<p>Apro il mio browser ed apro Google Fogli (di per sè una buona web app) e scarico il file TSV (Valori separati da tabulazioni) generato. Faccio un source del file sql e non sembrano esserci errori, do un bel "SELECT * FROM Sede;", tutto funziona. Faccio una seconda prova con "SELECT * From Dipendente;" e questo accade:</p>
<p><img alt="SQL Horror" src="https://penazarea.altervista.org/images/2017/02/SQLError.jpeg" /></p>
<p>Un pochino sorpreso decido di dare un'occhiata ai dati generati, tutto sembra in ordine.</p>
<p>Mezz'ora se ne va senza alcun progresso, quindi decido di mostrare solo alcune colonne dei dati tramite il comando "SELECT Matricola FROM dipendente;" e la colonna si mostra tranquillamente. Ancora più stupito, continuo le mie ricerche, e dopo un'ora dall'inizio di questo incubo riesco ad isolare il problema: è l'ultima colonna della tabella; ma non sembra che mi stia avvicinando alla soluzione. Un po' di sudore si può intravedere sulla mia fronte.</p>
<p>Avvio nuovamente il mio fidato editor di testo (NeoVIM) ed uso ":set list" per vedere se vi sono caratteri (non visibili) estranei all'interno del file. Niente.</p>
<p>Arrivo ad un'ora e mezza, ed inizio ad arrabbiarmi. Provo soluzioni come aggiungere "FIELDS ENCLOSED BY " ' "; " ma ciò non fa altro che rendere la situazione peggiore, con MariaDB che mi tira addosso 400 warnings, tutti che mi dicono che i dati erano stati tagliati perchè troppo grandi, oppure che vi erano troppe colonne nel file, rispetto al numero di colonne della tabella nel database.</p>
<p>Si arriva a 2 ore, e sono completamente spiazzato, non faccio nemmeno ulteriori ricerche su questo problema. Mi sono arreso al pensiero che non sarei stato in grado di consegnare il progetto e che mesi di lavoro, più altri mesi per attendere la prossima sessione d'esame, fossero persi. Ero disperato, colpendo il mio tabvlo dalla frustrazione ogni qualvolta una soluzione che provavo non funzionava.</p>
<p>Poi per qualche ragione, senza nemmeno rendermene conto, ho cercato su Google "Line Terminators" (Terminatori di Riga) e noto una cosa:</p>
<ul>
<li>Linux/Unix usano un carattere (conosciuto come "\n") per dire che una linea è terminata e di andare a nuova riga</li>
<li>Windows usa una serie di due caratteri ("\r\n") come terminatori di linea</li>
</ul>
<p>Arrivato a 2 ore e mezza, in uno stato semi-catatonico stile zombie, aggiungo le parole magiche:
LINES STARTING BY ''' TERMINATED BY '\r\n';</p>
<p>Faccio il source del database per (penso) la 50esima volta, ed impaurito inserisco la query: "SELECT * FROM Dipendente;"</p>
<p>Tutto funziona. Sono in lacrime, nessun warning per quella tabella, ho vinto.</p>
<p>Decido di prendere tutti i dati e passarli attraverso dos2unix, così da cambiare i terminatori di linea.</p>
<p>Non so come, ma sono riuscito a risolvere un problema disastroso, dato dal fatto che alla fine di una riga vi erano due caratteri invisibili invece di uno.</p>
<p>Sia stato intervento divino, qualche "cassetto della memoria", ma questo mi ha risparmiato con molta probabilità, mesi di università.</p>
<p>Cosa da notare è che, usando Google Fogli per scaricare un file TSV da una macchina Linux, ricevo un file con terminatori di linea di Windows.</p>
<p>Anche se assumessimo che i file TSV fossero originariamente concepiti per il solo uso su Windows, perchè MariaDB su Linux perde la testa per caricare tali files senza un'impostazione specifica?</p>
<p>Questo è qualcosa che onestamente non capisco.</p>
<p>Grazie a tutti per aver letto, i migliori auguri a tutti. Buona giornata.</p>Story Time With Penaz: The Database Project2017-02-06T00:00:00+01:002017-02-06T00:00:00+01:00Penaztag:penazarea.altervista.org,2017-02-06:/en/misc/the_db_project.html<p>A story of deadlines, despair and a dash of SQL. With a bitter lesson at the end.</p><h1>A story of deadlines, despair and a dash of SQL. With a bitter lesson at the end.</h1>
<p>This is a small story and a lesson I'll need to remember for the days to come. The situation: I'm doing a database for my University exam, it's about the day before the day you have to turn in the project, everything's perfect, the database works without errors, all the triggers work and functions are perfect, given the test data (about 3 rows per table) I made by hand, I receive the data to fill into the database from my project mate, everything looks great.</p>
<p>I open my browser and start Google SpreadSheet (an overall nice web app) and download the TSV (Tab Separated Values) file generated. I source the sql file and there seem to be no errors, I do "SELECT * FROM Sede;", everything works fine. I do a second trial with "SELECT * FROM Dipendente;" and this happens:</p>
<p><img alt="SQL Horror" src="https://penazarea.altervista.org/images/2017/02/SQLError.jpeg" /></p>
<p>A bit surprised I decide to take a look at the generated data, everything seems fine.</p>
<p>Half an hour passes without any progress, I decide to show only part of the data with "SELECT Matricola FROM Dipendente;" and the column shows fine, even more baffled I keep on going with my research and at the 60 minute mark from the beginning of this nightmare I manage to isolate the issue to the last column of the table, but it doesn't look like I'm getting closer to the solution. A bit of sweat comes out of my forehead.</p>
<p>I take out my trusty editor (NeoVIM) again and use ":set list" to see if there are any weird (non visibile) characters inside the file. Nothing.</p>
<p>I hit the 90 minute mark, I start getting angry. I try solutions like adding "FIELDS ENCLOSED BY " ' "; " But this makes the situation even worse, making the MariaDB engine throw me 400 warnings, all telling me that data was cropped or that there were too many columns on the file, compared to the table inside the database.</p>
<p>The two hour mark is hit, and I am completely clueless, I don't even do any more research on the issue, I gave up and thought that I wouldn't be able to turn in the project and miss months of work, plus months of waiting for the next exam session to come. I was in despair, hitting my desk in frustration every time a solution I tried didn't work.</p>
<p>Then for some reason, without even realizing, I searched on Google "Line terminators" and notice a thing:
- Linux/Unix use one character (known as "\n") to tell a line is terminated and go to new line
- Windows uses a series of two characters ("\r\n") as line terminators
-
At the 2.5 hour mark, almost in a zombie-like state I add the magic words:
LINES STARTING BY ''' TERMINATED BY '\r\n';</p>
<p>And source the database for I think the 50th time, and scared I do the query: "SELECT * FROM Dipendente;"</p>
<p>Everything works. I'm in tears, no warnings for that table, I won.</p>
<p>I decide to take all the data and pass it through dos2unix, so to change all the line terminators.</p>
<p>I don't know how, but I managed to solve a crippling issue given by the fact that at the end of a line there were two invisible characters instead of one.</p>
<p>Was it divine intervention, something coming from the back of my memory, this probably saved me months of university.</p>
<p>Something to notice is, using Google SpreadSheets to download a TSV from a Linux machine, I get a file with Windows-style line terminators.</p>
<p>And if we assume that TSV files were originally made only for Windows, why does MariaDB on Linux lose its mind when loading them without a specific setting?</p>
<p>Something I won't understand honestly.</p>
<p>Thank you everybody for reading this, and I wish you the best. Have a good one.</p>GH Monthly DevLog 12/2016 - End of the Year2016-12-02T00:00:00+01:002016-12-02T00:00:00+01:00Penaztag:penazarea.altervista.org,2016-12-02:/glitch_heaven/GH_DevLog_2016_12.html<p>Let's see this month's updates for Glitch_Heaven and some thanks that I feel I really need to give out.</p><h1>Let's see this month's updates for Glitch_Heaven and some thanks that I feel I really need to give out.</h1>
<p>Hello everybody, I'm really sorry for being this late in this devlog, but University has been keeping me busy for a lot, and now it's a quarter to midnight and I'm typing out this article... Oh boy.</p>
<p>Glitch_Heaven this month had some updates, not too many, not too few, I tried to dedicate myself as much as I was allowed to, so let's dive in and see what changed this month:</p>
<ul>
<li>Pre-Alpha 4 was released (and it's buggy too!), but by the time of Pre-Alpha 5 it should be a lot more stable. I really need to learn some way to do testing.</li>
<li>DeadBodies now have an option of aging and dying to save memory/CPU power. After 300 seconds they will disappear.</li>
<li>Merged the "messages" branch, which should allow for more in-game messages to happen</li>
<li>Added more messages for buttons and glitch orbs</li>
<li>Fixed some bugs with loading savegames, which funnily enough were given by the logging system and not the loading system itself</li>
<li>Fixed more bugs with loading levels, which lead the game to crash.</li>
</ul>
<p>Ok maybe the updates weren't that many, but considering the situation I'm in, I don't think it's too bad of a job. It's not my main thing, so time is not a great constraint.</p>
<p>Next up: a lighter version of The Rant Corner™, since it's almost Xmas and we're all nicer in this month of the year.</p>
<p>This month is the Christmas month! Or if you live in Italy one of the <strong>four</strong> Christmas months, because in a twist of madness, you can see Christmas cakes sold in Semptember! And decorations start to pop out mid-november or even earlier.</p>
<p>But this is not what I want to talk about, this isn't the usual bitter/caustic vision of the world of the Rant Corner™, today I want to give out some thanks.</p>
<p>Let's start from the more general ones, but still not "generic". I want to thank all of my friends who supported me over this experience that lasted over an year (it has been 1 year in september/october) and that will probably keep on going as an infinitely improving project over a weird concept that came out from a weird discussion, being built by a weird nerd. All the people who support me deserve a thank you for sure and it's really hard to find words to properly express this kind of sensation.</p>
<p>I open a parenthesis that I'll quickly close, on a personal level many see me as some kind of special being or "master" or someone to have high consideration for. It's not like I did anything special in my life, as many other people, I have done good and bad things, and past events shaped me like this, and still keep influencing my behaviour. Sometimes for the better, too many times for the worse.</p>
<p>Parenthesis closed, let's get to the juice of this. There are two people who I want to thank in particular.</p>
<p>First of the two, goes on the internet by the nickname of Zyradyl, a great developer and an even better person who I lost contact with and I deeply miss. Zyradyl praised my will to continuously refactor the game's code as well as having the patience to help me in the (so far vain) search for some cool additions to the game's code, whilst giving me hints here and there that helped expanding my knowledge. Non-judgemental, kind and knowledgeable, Zyradyl has been kind of a mentor for me, if words can't explain the general thanks of earlier, I have no idea about now.</p>
<p>The other one, used to go on the internet as EyeNeedMore, is most probably the smartest and most creative person I've ever had the pleasure, NO, <strong>the honour</strong> of knowing. With an insane amount of knowledge and, most of all, wisdom for their age. EyeNeedMore has been a life guide to me, and left a permanent mark on how I am now as a person and, even though I didn't change much on that side, how I look at the world and myself. If it wasn't for them, I wouldn't have the slightest crumble of self-esteem and the project would have been abandoned on day 2. Sadly life events told us apart and I miss them a whole lot, and sometimes I just want to send a message in the (probably vain) hope of getting an answer, one day. But as usual, I fear of creating disturbance. They deserve all the good the world has, they're the wisest and most intelligent person I've ever talked to. There is absolutely no way I can express my appreciation, either on this level or on any meta-level over it.</p>
<p>After this long rant, and being genuinely tearing, see you all next year with hopefully some new updates.</p>
<p>Thank you for reading, and if any of my friends reads this, I'd be really happy for you to drop me a message.</p>
<p>Best wishes.</p>
<p>Penaz.</p>GH News: Released the Pre-Alpha 4 - Mac OS Support Dropped2016-11-13T00:00:00+01:002016-11-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2016-11-13:/glitch_heaven/GH_DevLog_2016_11.html<p>Today was released the new somewhat stable Pre-Alpha 4 of Glitch_Heaven: Let's see the news and happenings around this version</p><h1>Today was released the new somewhat stable Pre-Alpha 4 of Glitch_Heaven: Let's see the news and happenings around this version</h1>
<p>Today I decided Glitch_Heaven was stable enough to be released to the public in its fourth stable release, last time I made a stable release was <strong>in June</strong>, oh boy that's a lot of time.</p>
<p>Let's start from the one that might be a little strange for many point of views: The Mac OS support was dropped.</p>
<p>This has a reason, in my opinion a good one: time. Releasing a product, written in Python 3 on Mac OS is a pain, plus real life duties don't leave me much time to code the game already, I can't waste more in the trial of releasing for Mac, even worse if it's a pre-release. It takes me about 10 minutes (upload included) to draft a release on Windows, and about 10 to do so on Linux, on Mac it takes more than one. painful. hour.</p>
<p>There is always something that doesn't work right, some changes in the code to make, a different configuration to be made, then this doesn't look right, or that is too slow for some reason... It's just too much.</p>
<p>Now, kicked this out of the way, let's see what's new on this Pre-Alpha 4:</p>
<p>The main test campaign has been completely migrated to the new Tileset, even though I feel it feels a bit sterile and poor in general I feel it's a decent job for a Pre-Release. Then there are countless edits under the hood: the refresh rate has been officially switched from 30 to 60 Frames per second, which lead to a huge edit in all the physics compartment of the game, which is thoroughly untested by the way. Another change is the official introduction of lasers, with a very small test in the first level of the test campaign. Lasers will kill the player on touch, but a new glitch will allow to use them as a platform, and probably in the future, as a wall to climb with its own glitch, who knows.</p>
<p>Among the fixes and enhancements, we have less crashes, menu fixes, description that finally change when they should, optimizations and a very basic Full screen 800x600 mode.</p>
<p>If you want to check out the new releases, take a look at the <a href="https://penazarea.altervista.org/en/glitch_heaven-official-page.html">official Glitch_Heaven page</a>.</p>
<p>Take care, thanks for reading, and see you at the next post!</p>
<p>Penaz</p>GH Monthly Devlog 10/2016 - Slow But Steady2016-10-01T00:00:00+02:002016-10-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-10-01:/glitch_heaven/GH_DevLog_2016_10.html<p>After some rest, here we are again with a new DevLog for Glitch_Heaven, small changes that bring some fresh air to the gameplay. Includes rant.</p><h1>After some rest, here we are again with a new DevLog for Glitch_Heaven, small changes that bring some fresh air to the gameplay. Includes rant.</h1>
<p>Greetings Everybody, here we are again with a new DevLog for my game in development, there haven't been huge, but after a good rest I think I'm ready to get back to develop this piece of Software for the next weeks, in the little free time I'll have.</p>
<p>These are the updates that happened since the <a href="https://penazarea.altervista.org/glitch_heaven/GH_DevLog_2016_09.html">last devlog</a></p>
<ul>
<li><strong>Lever Wrapping has kinda been fixed:</strong> All levels that use this technique will need a very careful design to avoid getting warped inside a wall or floor</li>
<li><strong>Started Implementing Vector-based movement:</strong> This should allow for quicker calculations and more readable code</li>
<li><strong>Started implementing new physics:</strong> Now players should be able to steer in air when bounced away by a yellow pad correctly, instead of completely losing control of the character, this opens the door for new platforming mechanics.</li>
<li><strong>New Debug keys:</strong> This is mostly for me, now it's possible to show the collision rectangle on screen and force a checkpoint save.</li>
<li><strong>Fixed some Collision Detection Regressions:</strong> while trying to shorten the code I made some mistakes, in the trial of optimizing. That was a bad idea, as it completely flipped the collision detection on its head.</li>
<li><strong>The Game now runs at 60Fps:</strong> Earlier the game was running at only 30Fps so not to weigh much on the system's performance, but now the code is pretty light on the CPU and the switch to 60Fps makes a difference in handling collision detection too. Plus the whole thing looks a lot smoother now xP</li>
<li><strong>Fixed a library error:</strong> The TMX library has been object of my testing because of jittering at low accelerations and gravity values, this testing has somehow never been stashed and some edits to the library have been committed to the master branch, making collision detection less reliable</li>
<li><strong>Fixed Jittering at low accelerations once and for all:</strong> I finally found the issue that caused the character to jitter at low accelerations/speeds and high FPS count. All because of floating point numbers smaller than 1 in absolute values x-x</li>
<li><strong>Started porting the new tiles in-game:</strong> The new tileset that I'm drawing has been now included in the code and will replace the current tilemap in the included maps, which should give the game a smoother feeling. This is also a great chance for me to check what elements I still have to draw.</li>
<li><strong>Some other minor fixes that I can't really remember:</strong> I made the animations a little slower, made the gravity a little lower and tinkering with some physical parameters.</li>
</ul>
<p>In the next page of this DevLog: <strong>The Rant Corner™</strong> where I analyze and comment some random stuff around the game</p>
<h1>The Rant Corner - Rage Games</h1>
<p>As every recent devlog i wrote, here we are at the rant corner, where I mindlessly complain about stuff going around the videogame world and especially around my game, which is Glitch_Heaven.</p>
<p>Let me be clear on this, I don't like Rage Games. Yet still I've been told by many players that GH <strong>is a rage game.</strong></p>
<p>Objectively, this completely depends on one person's definition of rage game.</p>
<p>My personal definition of rage game is:</p>
<blockquote>
<p>A game that purposedly induces anger in a person, through the usage of objectively unfair means, such as:
- Invisible blocks placed in strategic spots, so to kill the player
- Disguise a threat, for instance having a <a href="https://en.wikipedia.org/wiki/Goomba"">Goomba</a> change into a <a href="https://en.wikipedia.org/wiki/List_of_recurring_Mario_franchise_enemies#Spiny">Spiny</a> as soon as you jump on it. (Talking in a Mario-esque language)
- Changing the mechanics of the game without a reason other than to make the player die.
- No checkpoints, or checkpoints painfully far from one another, right from the first stage.</p>
</blockquote>
<p>This obviously is not a complete definition, and will surely fire some complaints, as Glitch_Heaven is breaking these rules, more or less.</p>
<p>The difference in Glitch_Heaven, compared to all rage games, is consistency. When you found what mechanic was changed, it will be like that for the whole stage (or set of stages) unless you take a "Glitch Orb".</p>
<p>If you died on a Yellow Bounce Pad, you can be sure that you'll die on <strong>all</strong> the bouncepads on that stage (unless you're playing a custom map made by an evil being).</p>
<p>This last example breaks the "Don't Disguise a threat" rule, but it's something that you learn after a couple trials, like in <a href="http://defaultdan.com/">Default Dan</a> where Coins kill you and spikes bounce you upwards.</p>
<p>In the next releases, I'll add a messaging feature that will allow the player to be aware if there is a glitch they never met before, or something that is known.</p>
<p>I'll try to put just the right number of checkpoints so that the game is challenging without being painful or instead just too easy.</p>
<p>I'll never put invisible blocks, but that doesn't take away that I might some day code some megaman-style disappearing blocks, or blocks that disappear after a bit you're touching them.</p>
<p>In conclusion I don't consider Glitch_Heaven a rage game by any means. My objective is creating a very challenging game, with a somewhat interesting storyline and somehow innovative gameplay.</p>
<p>If instead your definition "rage game" is:</p>
<blockquote>
<p>A game that makes you angry, either by being unfair or challenging</p>
</blockquote>
<p>Well... I don't know how to argue against that. And I'm almost a professional in arguing.</p>
<p>Ok people, this more or less wraps up everything of this month's DevLog, thank you everybody for reading.</p>
<p>See you at the next DevLog!</p>
<p>Penaz.</p>Skype Alpha per Linux: Prime Impressioni2016-09-24T00:00:00+02:002016-09-24T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-09-24:/misc/Skype_PrimeImpressioni.html<p>Vediamo cosa ci riservano i primi 5 minuti del nuovissimo client "Skype Alpha" per linux. Esperienze, impressioni e cambi di direzione.</p><h1>Vediamo cosa ci riservano i primi 5 minuti del nuovissimo client "Skype Alpha" per linux. Esperienze, impressioni e cambi di direzione.</h1>
<p>Buongiorno a tutti, oggi nell'elenco dei nuovi pacchetti di Portage (uso Gentoo Linux) è comparso questo curiosissimo pacchetto:</p>
<p><img alt="Immagine Portage" src="https://penazarea.altervista.org/images/2016/09/SkypeAlpha.png" /></p>
<p>Finalmente la versione Alpha del nuovissimo client Skype per Linux (che d'ora in poi chiamerò "Skype Alpha) è disponibile.</p>
<p>Voglio qui riportare le mie primissime impressioni, commenti, critiche, ma anche cambi di direzione del mio pensiero dopo aver dato un'occhiatina a questa novità.</p>
<h2>L'avvio e la login</h2>
<p>L'avvio è fulmineo, e ne sono rimasto piacevolmente sorpreso, date le mie esperienze con il client Skype 7 per Windows, e Skype 4.3 per Linux; precisamente il primo rallentava l'avvio di windows di un buon 2 minuti, mentre il secondo si bloccava alla fase di connessione, o restava inutilizzabile fino a 10 minuti a causa della sincronizzazione dei messaggi.</p>
<p>Ma non tutto è bello ciò che luccica, infatti alla prima login sono stato immediatamente accolto dalla schermata di accesso di Gnome-keyring, che mi richiede la master password per poter memorizzare la login di Skype Alpha in maniera sicura. Sicuramente apprezzo sia lo sforzo per una profonda integrazione tra il sistema operativo e Skype, usando gli strumenti già messi a disposizione, oltre che la cura per l'uso di uno storage sicuro per i dati; tuttavia questo non toglie che non mi va di avere gnome-keyring installato sul mio sistema, in quanto è un pacchetto in più, con le proprie dipendenze che occupa un suo (seppur minimo) spazio. Usare uno storage GPG (come quello usato da Pass) o strizzare l'occhio ad altri password manager come KWalletManager (per i desktop Plasma) sicuramente risolverebbe questa piccola pecca.</p>
<p>Tutto sommato, sono rimasto soddisfatto.</p>
<h2>L'interfaccia</h2>
<p>Addio alle finestre multiple per gli utenti di Linux!! Ora tutto può essere gestito da un'unica finestra in stile Skype 7, i contatti sulla colonna di sinistra e la chat a destra.</p>
<p>L'interfaccia di per sè è pulita e familiare, nulla da eccepire.</p>
<p>Ancora una volta, complimenti a Microsoft per aver deciso di agganciarsi al demone di notifica di sistema (nel mio caso Xfce4-Notifyd) invece di usarne uno proprio, mantenendo consistenza nel sistema.</p>
<h2>Le dipendenze</h2>
<p>L'albero delle dipendenze di Skype Alpha non è lunghissimo, e, piacevolissima sorpresa, non comprende pulseaudio, ma invece include alsa-libs; per la felicità di tutti coloro che non amano il diffuso server audio di Lennart Poettering (Creatore tra l'altro di SystemD e Avahi).</p>
<p>Posso dire che di questo sono felice per due motivi: non amo pulseaudio, anche se per esigenze personali lo uso (la regolazione del volume per-applicazione è una necessità per me); e soprattutto per la compatibilità e diffusione del client. Forzare l'utente finale ad usare un sistema che può potenzialmente far smettere di funzionare qualcosa di importante come l'audio è un modo sicuro per perdere tale utente.</p>
<p>Ancora una volta, noto libgnome-keyring, che preferirei potesse essere sostituito dall'utente da una schermata di preferenze all'interno del programma.</p>
<p>Anche qui, un discreto lavoro.</p>
<p>Tra poco: caratteristiche, opzioni e conclusioni.</p>
<h2>Le caratteristiche utilizzabili</h2>
<p>Pur essendo una versione preliminare, Skype Alpha supporta già la maggior parte delle funzioni che Skype 4.3 offriva agli utenti linux.</p>
<p>Premetto che ho solo usato il sistema di messaggistica istantaneo e provato ad effettuare una chiamata senza risposta. Sarei curioso di vedere se è già possibile effettuare una condivisione schermo o usare la videocamera, ma a quel punto avrei dovuto dedicare ben più di 5 minuti al testing.</p>
<p>Il pulsante "chiudi" è qui interpretato come "riduci alla tray", che è buono rispetto al comportamento "riduci a icona" di Skype 7 per Windows.</p>
<h2>Le Opzioni</h2>
<p>Qui le opzioni di Skype Alpha sono veramente poche, come la ricezione di notifiche e <strong>finalmente</strong> la possibilità di disattivare i suoni della chat senza dover entrare in modalità "non disturbare", alcune opzioni come le anteprime dei link, la possibilità di vedere i video di youtube direttamente dal client, le menzioni (@username), possibilità di incollare immagini dagli appunti, eccetera.</p>
<p>Tutto qui. Le opzioni sono ridotte all'osso, ma essendo una versione preliminare comprendo perfettamente la situazione.</p>
<h2>Conclusioni</h2>
<p>Tutto considerato posso dire che Skype Alpha <strong>fa veramente</strong>... un'impressione diversa da quanto mi aspettassi. Quella che di primo acchito poteva sembrare una pessima decisione, potrebbe rivelarsi invece buona sul fronte dell'utente finale.</p>
<p>La velocità di avvio, l'interfaccia familiare, ma comunque leggera rispetto alla versione per Windows, la rimozione di PulseAudio dall'albero di dipendenze ed il supporto per molte funzioni native di Linux come le notifiche di sistema e il keyring sono sicuramente benvenute.</p>
<p>Uniche note di demerito sono la scelta di usare solo Gnome-Keyring come "portachiavi", la scarsità di opzioni e la mancanza delle scorciatoie "CTRL+TAB" e "CTRL+SHIFT+TAB" per andare avanti ed indietro tra le conversazioni che adoravo in SkypeTab-NG.</p>
<p>Altra piccolissima nota di demerito è il fatto che se avessi altri protocolli da usare, Skype Alpha sarebbe un'altra applicazione da tenere aperta sul mio desktop. Una libreria che si interfacci a <a href="https://penazarea.altervista.org/misc/Pidgin.html">LibPurple/Pidgin</a> ufficiale da parte di Microsoft (un po' come quella di eionrobb, Purple-Skypeweb(https://github.com/EionRobb/skype4pidgin/tree/master/skypeweb) ) resta ancora il mio (e spero di altri) sogno proibito.</p>
<p>Grazie per aver letto questo (lunghissimo) articolo, saluti a tutti ed alla prossima!</p>
<p>Penaz.</p>Glitch_Heaven DevLog 09/20162016-09-01T00:00:00+02:002016-09-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-09-01:/glitch_heaven/GH_DevLog_2016_09.html<p>An even poorer DevLog as what regards contents, but more of a rant about how things are going in the Glitch Universe.</p><h1>An even poorer DevLog as what regards contents, but more of a rant about how things are going in the Glitch Universe.</h1>
<p>Greetings everybody and welcome to another DevLog.</p>
<p>Things haven't been going too well lately, and between University, emotional and physical pain and various events happening, I practically didn't work on Glitch_Heaven at all, or if we shall be more precise: I didn't have the will to do so.</p>
<p>But before the rant begins, let's see the usual list of changes of this month:</p>
<ul>
<li><strong>Fixed a crashing bug when a certain glitch was enabled</strong>, this was due to a change in the underlying code and the inheriting objects didn't really appreciate it. Curse you Inheritance!</li>
<li><strong>Added Laser Buttons:</strong>Now lasers can work with a timer and/or with a trigger, the triggers always turn off the lasers while the timer turns on and off the laser every # seconds.</li>
<li><strong>Added a "Game Loading" Screen:</strong> Differently from the "loading screens" I mentioned in my <a href="https://penazarea.altervista.org/glitch_heaven/GH_DevLog_2016_08.html">previous post</a>, the August 2016 devlog, This triggers immediately after opening the application so you know the game is really started, sadly seems that 90% of the loading time is given by the underlying SDL implementation (PyGame) so most of the time the user will just see a small flashing window and then the menu opens, but it will be useful if I ever decide to pre-load graphics at the Game's Boot.</li>
</ul>
<p>And that's all, a very very poor DevLog, no updates on the tilemap, no updates on the sound (which will be needed soon), no updates on the music and practically no updates on the code.</p>
<p>Next Up, I'll rant about how things are going in the Glitch Universe.</p>
<p>Here comes the part I decided to write this devlog for.</p>
<p>What's the cause of all this lack of will in doing things? Sadly I don't know precisely, it's a period I'm completely out of energy. Studying for my graduation takes a lot of my time and all the stress around me isn't helping the creative process at all.</p>
<p>People keep telling me that I don't like how Glitch_Heaven is made just because it's my product, and we're negatively biased over what we create, and that's probably true: so much I would like to add to the game, but I can't because of lack of capacity or technical limitations.</p>
<p>Some of them would be, for instance the game somehow reacting to the music that is put in the background, so to make everything less static, but it seems that I can't find a solution about it, and if I get closer to find it, turns out it doesn't work or worse, the package required to do it is incompatible with the license of the game I'm making.</p>
<p>Speedrun mode, which allowed players to challenge each other to see who is the fastest puzzle-solver in the game had to be put aside for multiple reasons, mostly lack of knowledge in network coding and the lack of money to host a server where to keep the scores on, and some other stuff.</p>
<p>A possible solution to some technical limitations would be rewriting the entire game in C++, the most widely used coding language for VideoGames, but that would mean that I have to learn SDL for C++ (even though I'm more leaning towards SFML for some reason) which is obviously different from PyGame, I would need to rewrite Richard Jones's TMX library in C++ or find a library able to load TMX maps and give me a somewhat comparable comfort in coding.</p>
<p>Obviously rewriting over 5000 lines of code in a language that I can't say I know as well as I know Python 3 is a titanic work for me, which leaves me stuck between a rock and a hard place: keep going with Python 3 and somehow guarantee cross-platform compatibility or switch to C++ and have a whole new range of possibilities but also a whole new selection of challenges to overtake, cross-platform compatility being one of the many.</p>
<p>I feel the whole product is absolutely sub-par over something well-built as are the now known hit indie games like Stardew Valley, which was made by one developer, by the way. Even though this is my first seriously-made game, I can't help but being the harshest critic over my own work, and feeling like this game is absolutely unappealing.</p>
<p>So Glitch_Heaven is not doing good, it's spitting blood and it's very sick, metaphorically speaking; so I need to take a good break from the whole make-a-game thing and take a little bit more care of myself, as a great mind said: "If you can't take care of yourself, you can't take care of your game".</p>
<p>And as a side note regarding this quote I'd like to thank the whole <a href="https://twitter.com/Gamkedo">Gamkedo Community</a> for the great suggestions and the will to answer my silly questions, you people are great.</p>
<p>The game project won't be abandoned, just put aside for a little bit. No freaking out.</p>
<p>Thanks for reading this long rant, and please take care of yourselves.</p>
<p>Penaz</p>Tox: Una nuova alternativa che potrebbe soppiantare skype2016-08-29T00:00:00+02:002016-08-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-08-29:/misc/tox-una-nuova-alternativa-che-potrebbe-soppiantare-skype.html<p>Scopriamo Tox, un protocollo di nuova concezione orientato alla privacy che cercherà di spodestare Skype & Co.</p><h1>Scopriamo Tox, un protocollo di nuova concezione orientato alla privacy che cercherà di spodestare Skype & Co.</h1>
<p>Buongiorno a tutti, alzino la mano coloro che hanno almeno uno dei seguenti account per la messaggistica istantanea:</p>
<ul>
<li>Skype</li>
<li>Google Hangouts</li>
<li>Facebook Messenger</li>
<li>Whatsapp</li>
</ul>
<p>In quattro punti penso di aver incluso almeno 3 persone su 4, non possiamo farci nulla, tutti questi metodi sono semplici da usare e sfamano la nostra fame di comunicazione con i nostri amici. La maggior parte delle volte.</p>
<p>Come ho accennato in <a href="https://penazarea.altervista.org/misc/Pidgin.html">un precedente post</a>, mi sono lamentato dello scarso supporto e di alcune decisioni prese da Microsoft (proprietaria di Skype) riguardanti Skype per Linux, oggi vi presento un'alternativa gratuita che potrebbe stuzzicare la vostra curiosità: Tox.</p>
<p>Tox non è propriamente un programma, è un protocollo decentralizzato per la comunicazione tramite messaggistica istantanea e non solo. Decentralizzato vuol dire che non vi è un server centrale a cui tutti si connettono, a sua volta significa che non vi è un server centrale che è possibile attaccare, la rete Tox è creata dai propri utenti. Perciò non vi sono periodi di downtime.</p>
<p>Inoltre il protocollo Tox è dotato di una crittografia molto forte per proteggere la vostra privacy, ed è dotato di tutti i comfort che un programma di comunicazione può offrire.</p>
<p>Prima di tutto la classica chat a messaggi istantanei, con tanto di emoticons, a seguire vi sono chiamate vocali gratuite, anche se la qualità non è ancora comparabile a Skype dato che non è ancora stato veramente implementato un codec adattivo; continuiamo con video chiamate, condivisione del desktop, gruppi...</p>
<p>Una caratteristica che mi ha stuzzicato molto, dato che Skype ha introdotto una limitazione nel trasferimento dei files, è appunto la possibilità di trasferire files tra due client senza alcuna limitazione di dimensione.</p>
<p>Per quanto riguarda la sicurezza, Tox usa librerie di crittografia open source, così da garantire di essere sempre al passo con le ultime patch di sicurezza, inoltre la natura distribuita del protocollo rende praticamente impossibile "attaccare un server" e costringerlo a dispensare dati al pirata informatico di turno o a spegnersi.</p>
<p>Inoltre, in puro stile Gnu GPL, il software è libero e gratuito, perciò può essere modificato e tutti possono contribuire alla costruzione di migliorie per questo protocollo, oltre che condividere il progetto e usarlo.</p>
<p>Come ho detto precedentemente, Tox non è un programma, perciò per collegarci alla rete Tox avremo bisogno di un client, e ce ne sono numerosissimi (qTox, uTox, Ricin, Toxygen, ...) per praticamente qualunque piattaforma: Linux, Windows, Mac, iOS, Android, la vostra caffettiera...</p>
<p>Tox è stato concepito per essere sicuro ma anche semplice da usare, basta scegliere il vostro nome e cercare i vostri amici, dopo averli convinti ad unirsi in questo interessantissimo circuito di comunicazione.</p>
<p>Se volete più informazioni riguardo al progetto, non vi resta che visitare il <a href="http://tox.chat">Sito Ufficiale</a>.</p>
<p><strong>Attenzione:</strong> Tox Project (I creatori di Tox) e Tox Foundation sono ora due entità diverse, a causa di una disputa riguardante un possibile abuso di fondi ricavati dal crowdfunding del progetto da parte di Tox Foundation</p>
<p>Saluti a tutti, spero di avervi incuriosito a sufficienza, grazie per aver letto questo articolo.</p>
<p>Alla prossima!</p>
<p>Penaz.</p>Pigin: messaggistica multiprotocollo a portata di mano2016-08-28T00:00:00+02:002016-08-28T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-08-28:/misc/Pidgin.html<p>Conosciamo quello che da qualche mese è diventato il mio unico programma di messaggistica istantanea tutto in uno: Pidgin</p><h1>Conosciamo quello che da qualche mese è diventato il mio unico programma di messaggistica istantanea tutto in uno: Pidgin</h1>
<p>Salve a tutti, anche se non potrebbe sembrare un problema troppo annoso al giorno d'oggi, la messaggistica istantanea è dovunque e richiede un programma separato per ciascun protocollo, con Pidgin possiamo unificare tutti i notri protocolli in un unico programma!</p>
<p>Pensate alle vostre chat di Facebook, Google Hangouts, Steam, Twitter e chissà quali altri protocolli, tutte riunite in un unico programma.</p>
<p>Ma andiamo con ordine.</p>
<p>Pidgin è un programma di messaggistica istantanea multiprotocollo basato sulle librerie grafiche GTK+, perciò si adatta bene a qualunque tema desktop, sia esso Windows o Linux. Il programma supporta alcuni protocolli nativamente (per esempio XMPP) ed altri tramite plugins che possono essere aggiunti manualmente in modo da avere tutto a portata di mano.</p>
<p>Ma il sistema a plugins non si limita solo ai protocolli, altre addons aggiungono comandi (fantastico /dice per le partite di Dungeons and Dragons via chat), oppure altri come <a href="https://github.com/dm0-/window_merge">Window Merge</a> unificano l'interfaccia, passando da due finestre (lista contatti + chat) ad una finestra unica in stile Skype moderno, per poi passare ad opzioni aggiuntive, personalizzazioni del tema GTK, Messaggi ad un gruppo di contatti, supporto LaTeX fino ad arrivare a poter vedere i video di youtube che il vostro amico vi ha linkato direttamente dalla finestra di chat. Le possibilità sono infinite.</p>
<p>Trovo personalmente divertentissimo "Psychic mode" che apre automaticamente una finestra di conversazione quando qualcuno inizia a scrivervi, se siete abbastanza veloci potete veramente stupire i vostri amici.</p>
<p>Fra le altre caratteristiche disponibili abbiamo anche la possibilità di programmare azioni automatiche su alcuni contatti, per esempio inviare automaticamente una risposta se non siamo al computer, oppure lasciare un messaggio appena il nostro miglior amico si connette, controllo ortografico e molto molto altro.</p>
<p>Io personalmente lo uso per unificare tutte le mie chat e come sostituto di Skype per le chat, dato che Skype per Linux non è aggiornato da anni.</p>
<p>Se volete provare Pidgin, è sufficiente che lo scarichiate dal <a href="http://pidgin.im">Sito Ufficiale</a>. Il programma è disponibile per Windows, Linux e Mac OS (In questo caso si chiama Adium).</p>
<p>Oltre tutto, pidgin è dotato di una comoda interfaccia per linea di comando chiamata Finch.</p>
<p>Più Avanti, una piccola lamentela personale riguardo a skype.</p>
<p><br /></p>
<p>Ecco la lamentela.</p>
<p>Sono anni che skype non viene aggiornato su Linux, come utente Linux sono abbastanza deluso dal fatto che l'applicativo per skype sia rimasto bloccato alla versione 4.3 quando la versione Windows ha passato la versione 7.0.</p>
<p>Ed ora, nel 2016, vengo a sapere che una nuova versione di Skype per Linux è in lavorazione.</p>
<p>La mia reazione? Fantastico! Era proprio ora, immagino già il supporto completo a 64 bit senza il bisogno di doversi appoggiare a multilib (O ai tempi ad emul-linux-x86), interfaccia più leggera e probabilmente tempi di avvio più rapidi e supporto per le nuove emoticon.</p>
<p>Poi ho iniziato a pensare... Skype 7 su Windows è stato la causa di un forte rallentamento dell'avvio di sistema, tale che non riuscivo ad usare il mio computer per ben due minuti dopo l'avvio. E per quanto vecchio possa essere il mio PC, ha comunque 4GB di Ram ed un processore Quad-Core.</p>
<p>Ma con buona speranza mi sono informato ed ho fatto una scoperta che mi ha fatto letteralmente gelare il sangue nelle vene: è un client basato sulla tecnologia di SkypeWeb.</p>
<p>Ora, per quanto possa essere comunque un passo avanti rispetto ad un applicativo vecchio di quasi 5 anni, avere l'equivalente di un browser (perchè questo ho capito dalle voci che corrono) sempre aperto nel mio PC non è propriamente una cosa che mi piace. Per nulla.</p>
<p>A questo punto prendo un browser minimale, (come QuteBrowser, che ora sta passando al motore Blink) con supporto WebRTC e lo punto su SkypeWeb.</p>
<p>Come utente Linux avrei di gran lunga preferito fare un po' quello che voglio con il mio sistema, senza dovermi ritrovare ad aggiungere un altro applicativo per poter chattare. Lo so che non è possibile avere un programma completamente open-source che si collega alla rete Skype, ma una libreria (anche Closed-source come è Skype per Linux) a cui qualche interfaccia o client si possa collegare (magari proprio pidgin) sarebbe stata a mio avviso una cosa assai preferibile rispetto alla scelta che Microsoft ha fatto.</p>
<p>Ora personalmente non conosco come funzionano esattamente I programmi di messaggistica istantanea, quindi questa è una lamentela <strong>come utente</strong> e non come programmatore.</p>
<p>Devo dire che sono rimasto personalmente molto deluso da questa manovra.</p>
<p>Fine della lamentela, grazie a tutti per aver letto quest'articolo e per avermi sopportato finora.</p>
<p>Saluti a tutti quanti.</p>
<p>Penaz.</p>GH Monthly Devlog 08/2016 - Thoughts and Doubts2016-08-01T00:00:00+02:002016-08-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-08-01:/glitch_heaven/GH_DevLog_2016_08.html<p>Very short devlog, content-wise, so I decided to add a couple words of what's going on in my mind right now.</p><h1>Very short devlog, content-wise, so I decided to add a couple words of what's going on in my mind right now.</h1>
<p>Hello everybody, this time the devlog will be very very very skinny when coming to code-savvy stuff.</p>
<p>Because I haven't been coding much, simple as that. But let's dive in and see what happened this month (I don't foresee much going on in the next 10 days, and I'll eventually update this post if necessary):</p>
<ul>
<li>Added <strong>Lasers</strong>: Now there are timed / triggerable lasers that kill player on contact. This uses a new method of creation that takes the size directly from the TMX tilemap instead of a property that has to be defined.</li>
<li>Added a basic "Laser resistance" glitch: This will allow to use lasers as platforms (in a similar way of mobile platforms)</li>
<li>Added some basic "Loading..." screens: Now when the game is loading a new level, there will be a black screen with a white "Loading..." writing on the top left corner of the screen to avoid people thinking that the game has frozen, even if the loading routines are very fast.</li>
</ul>
<p>What I've been doing for most of the time is... Drawing.</p>
<p><img alt="New tile pictures" src="https://penazarea.altervista.org/images/2016/08/Tiles.png" /></p>
<p>Yes, It's that time where the graphics of the game need a bit more of care. I'm hand-drawing all the 32x32 pixels tiles so that the levels look a little better and less amateur.</p>
<p>The basis of the tiles is a blue-on-blue grid, which doesn't align between tiles for now, but will be taken care of when I have all the tiles ready and ordered, for now everything looks promising.</p>
<p>Hopefully the new graphics will add a little more variety to the game and make it a lot more enjoyable the what it is now.</p>
<p>Soon enough I should be able to work on the backgrounds too, using an open-source pixel art too called "Aseprite" which you can see at <a href="http://www.aseprite.org/">its official website</a></p>
<p>The devlog is over, but I wanted to throw here a couple of thoughts that many times go around my head, as a way to possibly calm them down.</p>
<p>It has been 10 months since I started this project, and besides the crawling speed this project has been going on, I notice more and more how the Videogame market is saturated, if not even oversaturated. It feels like there is no space for a project like Glitch_Heaven, my first serious project in the Videogame development field, trying to bring some twist and an interesting story in a known set of mechanics as a platform-runner game is. This game is the work of a single person, besides the story, where I got some help from a dear friend.</p>
<p>The code, the graphics, the basic idea, it's all something that came out of my mind, and I have my very very strong limitations, I'm not amazing at drawing pixel art, nor I'm great at composing music, and I'll have to compose my own video game music when the time comes; then there are technical limitations given by the SDL implementation I'm using, my very scarce experience in some fields of coding and game development.</p>
<p>At this point, I start asking myself if this all is worth the effort.</p>
<p>Rant over, thanks for being patient.</p>
<p>See you all at the next post, or next month's devlog!</p>
<p>Penaz.</p>Glitch_Heaven DevLog 07/20162016-07-01T00:00:00+02:002016-07-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-07-01:/glitch_heaven/GH_DevLog_2016_07.html<p>Very Minor advancements in this month's devlog, since I coded for only half a month due to University. Let's see what happened</p><h1>Very Minor advancements in this month's devlog, since I coded for only half a month due to University. Let's see what happened.</h1>
<p>Hello Everybody, in this month's devlog I don't really have much to say about the progress of the project, mostly because studies and such have been taking my time.</p>
<p>Here's a small list of what happened this month:</p>
<ul>
<li>Fixed collision detection not allowing to cross 1-tile tall spaces</li>
<li>Fixed crash when the last level is finished</li>
<li>Fixed Savegame module when the savegames folder is empty</li>
<li>Added option to erase savefiles</li>
<li>Fixed some more bugs that occurred when folders and lists are empty</li>
<li>Fixed menu updating when you save games</li>
<li>The new Load and save menus are now part of the master branch</li>
<li>Fixed a bug with collision detection and teleports, where you crossed the floor on Teleport</li>
<li>Added Password locks for Doors, buttons and terminals</li>
<li>Started working on a "how to play" section</li>
<li>Now exits, help terminals and checkpoints work with the "action" button</li>
<li>Now the game has an auto-save feature, it will save every time you complete a level, it just needs a menu button</li>
<li>Fixed some bugs in menus that made the game crash</li>
<li>Added support for final cutscenes after the last level of a campaign.
That's all I have for now, I exclude I'll be able to code more this month due to more upcoming University exams.</li>
</ul>
<p>For now, see you all next time!</p>
<p>Penaz</p>Glitch_Heaven Devlog - 06/20162016-06-01T00:00:00+02:002016-06-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2016-06-01:/glitch_heaven/GH_DevLog_2016_06.html<p>Small updates on the progress of my Game: Glitch_Heaven, Save/Load Menus, Code Optimization and others. All in this month's DevLog.</p><h1>Small updates on the progress of my Game: Glitch_Heaven, Save/Load Menus, Code Optimization and others. All in this month's DevLog.</h1>
<h3>This is an English Only DevLog post, as the project is developed for English-speaking people.</h3>
<p>As every month, here we are with the text DevLog of Glitch_Heaven, and in the trial to give some new life to this blog, I'm going to post the log both on the steam <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=613898099">GreenLight Page</a> and on here.</p>
<p>For the second month in a row, most of the edits are under the hood, small optimisations here and there but most of all, readability improvements, which should make the game easier to maintain and help spotting bugs a lot quicker than before.</p>
<p>Here's the usual list of edits in this month's DevLog:</p>
<ul>
<li>Fixed some useless work on "Help Signs", in future the concept will be completely remade</li>
<li>Complete rebase of the player entity</li>
<li>Removal of more legacy code</li>
<li>Fixed a debug mode bug (yes, the debug mode had a bug, a debug bug)</li>
<li>Added 2 new glitches, that change the inertia of the player entity</li>
<li>Fixed a bug that made Critical Failure Mode crash the game</li>
<li>Made the level loading/saving independent from Tk</li>
<li>Made the Single Map mode and Campaign Selection independent from Tk</li>
<li>The 2 points just mentioned fixed a bug with Tk/SDL crashing the game on Mac OS</li>
<li>Started some basic redraw of the tiles, starting from the Mobile Platforms</li>
<li>Creation of 2 new wrappers around some components of the menus, to make the code shorter and more readable</li>
<li>Added A new component: InputBox, which is used to create new SaveFiles.</li>
<li>Fixed a bug where if you touched the ceiling while hovering and looking left, the player entity would start inverting directions every frame.</li>
</ul>
<p>I'd like to thank every person who helped me testing Glitch_Heaven during the Pre-Alpha stage by reporting bugs and giving me lots of support, I wouldn't be here without all of you.</p>
<p>I would like to thank also whoever decided to play the game for a laugh, and subsequently regretted it xD</p>
<p>Catch You Next Month!</p>
<p>Penaz</p>Altri plugins per Spigot/Bukkit/Minecraft2015-08-23T00:00:00+02:002015-08-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2015-08-23:/coding/Spigot_Plugins_2.html<p>Nel tempo libero adoro scrivere codice, così ho prodotto altri piccoli (o meno piccoli) plugins per il server moddato di Minecraft più famoso: Spigot.</p><h1>Nel tempo libero adoro scrivere codice, così ho prodotto altri piccoli (o meno piccoli) plugins per il server moddato di Minecraft più famoso: Spigot.</h1>
<p>Buongorno a tutti. Personalmente sono una persona che si annoia molto facilmente, quindi mi piace tenermi attivo e creare qualcosa di nuovo ogni volta. Per questo ho creato alcuni nuovi plugins per Spigot, il server minecraft più usato. In questo piccolo articolo vedremo le principali caratteristiche di ciascuno, in ordine di completamento.</p>
<h2>BulkExport</h2>
<p>Il mio primo esperimento con listeners ed handlers in Spigot, questo plugin permette di creare degli scambi di merce predefiniti (esempio: 128 patate per un diamante) e successivamente fare scambi in massa, direttamente dall'inventario.</p>
<p>Se volete dare un'occhiata al codice, o scaricare il plugin, lo trovate nella mia pagina di GitHub: <a href="https://github.com/Penaz91/BulkExport">https://github.com/Penaz91/BulkExport</a></p>
<h2>MiniHealth</h2>
<p>Creato per una cara amica che ha dovuto affrontare un problema alquanto annoso: modificare l'ammontare di salute dei giocatori, portandolo da 10 cuori (20 punti vita) a 20 cuori (40 punti vita). Questo micro-plugin fa esattamente questo, al login del giocatore, la loro salute viene modificata a 20 cuori, rendendo l'esperienza Player-vs-Player più accesa e competitiva.</p>
<p>Per il codice ed il download, seguite questo link: <a href="https://github.com/Penaz91/MiniHealth">https://github.com/Penaz91/MiniHealth</a></p>
<h2>DoomBox</h2>
<p>Ispirato da un "one command only" (mod per server vanilla costruite con un solo blocco comandi), questo plugin permette di evocare una scatola infernale (rappresentata da un calderone con un tappeto in cima). All'apertura della scatola (rompendo il tappeto) un numero ben determinato di mostri uscirà dalla scatola, attaccando i giocatori che sono nei paraggi. Questo crea un gioco molto divertente se si è in molti giocatori. Dopo un ben determinato numero di evocazioni della scatola infernale, questa si sovraccaricherà e verrà evocato un boss. Un mostro estremamente pericoloso e potente, che può mettere in seria difficoltà anche i giocatori più esperti.</p>
<p>Il tutto è completamente configurabile. Fino ad ora, questo è il plugin più completo che abbia mai creato.</p>
<p>Se volete darci un'occhiata, seguite questo link: <a href="https://github.com/Penaz91/DoomBox">https://github.com/Penaz91/DoomBox</a></p>
<p>Tutti i plugin sono distribuiti sotto licenza MIT, quindi potete modificare, usare, ridistribuire il codice liberamente, purchè venga fatto riferimento al creatore originale e questi non venga ritenuto responsabile di eventuali danni.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Creiamo il nostro personale streaming Live2015-08-03T00:00:00+02:002015-08-03T00:00:00+02:00Penaztag:penazarea.altervista.org,2015-08-03:/misc/Streaming_Nginx.html<p>Vediamo come creare il nostro piccolo servizio di streaming Live, senza Twitch o altri servizi più famosi.</p><h2>Vediamo come creare il nostro piccolo servizio di streaming Live, senza Twitch o altri servizi più famosi.</h2>
<p>Buongiorno a tutti, tutti conoscono Twitch, un famoso servizio di streaming live usato da molti videogiocatori per trasmettere in tempo reale le proprie prodezze videoludiche. La registrazione è gratuita, ma vi sono alcuni motivi per cui qualcuno non vuole iscriversi ma comunque mostrare le proprie capacità; magari per uno streaming unico (per il quale un account Twitch sarebbe sprecato) o semplicemente per curiosità, oggi vedremo come creare il nostro piccolo servizio di streaming online.</p>
<p><strong>Questo tutorial è principalmente a fine di puro divertimento e curiosità.</strong></p>
<p>Strumenti necessari:</p>
<ul>
<li><a href="http://nginx.org/en/">Nginx</a> - famoso server web</li>
<li>Estensione RTMP per Nginx - Ciò ci permetterà di trasmettere i nostri video</li>
<li><a href="https://obsproject.com/">Open Broadcaster Software/OBS Studio</a> - Che ci permetterà di registrare ciò che accade su schermo.</li>
<li>Un router.</li>
</ul>
<p>Installiamo Nginx e l'estensione per lo streaming via RTMP, ora apriamo il file di configurazione nginx.conf (la sua posizione dipende dal sistema operativo usato) ed inseriamo in fondo alla pagina ciò che segue:</p>
<div class="codehilite"><pre><span></span><code><span class="n">rtmp</span> <span class="err">{</span>
<span class="n">server</span> <span class="err">{</span>
<span class="k">listen</span> <span class="mi">1935</span><span class="p">;</span>
<span class="n">chunk_size</span> <span class="mi">4096</span><span class="p">;</span>
<span class="n">application</span> <span class="n">live</span> <span class="err">{</span>
<span class="n">live</span> <span class="k">on</span><span class="p">;</span>
<span class="n">record</span> <span class="k">off</span><span class="p">;</span>
<span class="err">}</span>
<span class="err">}</span>
<span class="err">}</span>
</code></pre></div>
<p>Ciò ci permetterà di effettuare uno streaming live sulla porta 1935, che dovremo inoltrare sul nostro router (la procedura dipende dal router, cercate "Port forwarding <modello>" per vedere come si fa).</p>
<p>Dopo aver inoltrato la porta 1935, possiamo configurare Open Broadcaster Software. Apritelo, configurate le impostazioni come vi aggrada per quanto riguarda qualità ecc....</p>
<p>Ora andate in Impostazioni -> Parametri broadcast ed usate le seguenti opzioni:</p>
<blockquote>
<p>Modalità: Live Stream</p>
<p>Servizio di streaming: Custom</p>
<p>FMS URL: rtmp://[vostro IP qui]/live</p>
<p>Play Path/Stream Key: test</p>
</blockquote>
<p>E siete pronti per lo streaming! I vostri amici dovranno semplicemente aprire un player che supporti protocolli di rete (Come VLC) ed aprire uno stream di rete all'indirizzo: rtmp://[vostroIP]/live/test</p>
<p>Ma se volete veramente andare oltre, è possibile settare una pagina web per lo streaming. Ed è qui che il mio calvario di 3 ore è iniziato, ho provato di tutto FlowPlayer, JWPlayer (entrambe famose soluzioni freemium), Il tag "video" di HTML5, soluzioni in JavaScript che vanno oltre la percezione umana... Niente funzionava, il player non veniva visualizzato, oppure il formato non era supportato, oppure lo stream non veniva nemmano trovato. E poi sono arrivato a questa soluzione, open source e fantasticamente semplice.</p>
<p>Ingredienti:</p>
<ul>
<li><a href="http://www.videojs.com/">Video.js</a></li>
<li>Tanta pazienza e coraggio</li>
<li>Un router.</li>
<li>Un computer</li>
</ul>
<p>Per prima cosa inoltriamo la porta che abbiamo scelto per la nostra pagina HTTP (potrebbe essere la classica porta 80, siccome non sono su un server puro, ho scelto la porta 8080).</p>
<p>Scarichiamo Video.js ed estraiamolo nella cartella "http" di nginx, dove dovrebbero stare le pagine html.</p>
<p>Dopodichè creiamo una pagina come segue:</p>
<div class="codehilite"><pre><span></span><code><span class="cp"><!DOCTYPE html></span>
<span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"/video-js/video-js.css"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"/video-js/video.js"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span>
<span class="p"><</span><span class="nt">script</span><span class="p">></span>
<span class="nx">videojs</span><span class="p">.</span><span class="nx">options</span><span class="p">.</span><span class="nx">flash</span><span class="p">.</span><span class="nx">swf</span> <span class="o">=</span> <span class="s2">"/video-js/video-js.swf"</span>
<span class="p"></</span><span class="nt">script</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"main"</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">id</span><span class="o">=</span><span class="s">"content_area"</span> <span class="na">class</span><span class="o">=</span><span class="s">"well"</span><span class="p">></span>
<span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"vid_player"</span><span class="p">></span>
<span class="p"><</span><span class="nt">video</span> <span class="na">id</span><span class="o">=</span><span class="s">"MY_VIDEO_1"</span> <span class="na">class</span><span class="o">=</span><span class="s">"video-js vjs-default-skin"</span> <span class="na">controls</span>
<span class="na">preload</span><span class="o">=</span><span class="s">"auto"</span> <span class="na">width</span><span class="o">=</span><span class="s">"960"</span> <span class="na">height</span><span class="o">=</span><span class="s">"540"</span> <span class="na">poster</span><span class="o">=</span><span class="s">"images/POSTER.png"</span>
<span class="na">data-setup</span><span class="o">=</span><span class="s">"{}"</span><span class="p">></span>
<span class="p"><</span><span class="nt">source</span> <span class="na">src</span><span class="o">=</span><span class="s">"rtmp://<tuo_IP_qui>/live/test"</span> <span class="na">type</span><span class="o">=</span><span class="s">"rtmp/flv"</span><span class="p">></span>
<span class="p"><</span><span class="nt">p</span> <span class="na">class</span><span class="o">=</span><span class="s">"vjs-no-js"</span><span class="p">></span>To view this video please enable JavaScript, and consider upgrading to a web browser that <span class="p"><</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">"http://videojs.com/html5-video-support/"</span> <span class="na">target</span><span class="o">=</span><span class="s">"_blank"</span><span class="p">></span>supports HTML5 video<span class="p"></</span><span class="nt">a</span><span class="p">></</span><span class="nt">p</span><span class="p">></span>
<span class="p"></</span><span class="nt">video</span><span class="p">></span>
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"></</span><span class="nt">div</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</code></pre></div>
<p>Ora ai nostri amici non resterà che collegarsi al nostro IP, sulla porta giusta, sulla pagina giusta ed avranno un piccolo player che permetterà di vedere il nostro streaming Live!</p>
<p>Questo è quanto. Buono streaming a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>DuckDuckGo: un'alternativa interessante a google2015-07-31T00:00:00+02:002015-07-31T00:00:00+02:00Penaztag:penazarea.altervista.org,2015-07-31:/misc/DuckDuckGo.html<p>Proviamo insieme DuckDuckGo, un motore di ricerca molto interessante, OpenSource e rispettoso della nostra privacy.</p><h1>Proviamo insieme DuckDuckGo, un motore di ricerca molto interessante, OpenSource e rispettoso della nostra privacy.</h1>
<p>Buongiorno a tutti, oggi vi voglio parlare di DuckDuckGo, un piccolo motore di ricerca con alcune caratteristiche molto interessanti.</p>
<p>Per prima cosa, DuckDuckGo è OpenSource, quindi chiunque può aggiungere caratteristiche (ne parlerò più avanti) ma soprattutto, cosa rara di questi tempi, non salva le ricerche effettuate per scopi di profiling, tracciamento o statistiche di alcun tipo.</p>
<p>Se digitiamo il sito (<a href="http://duckduckgo.com">http://duckduckgo.com</a>) ci ritroveremo davanti un'interfaccia molto semplice e spartana,</p>
<p><img alt="Primo Screen DuckduckGo" src="https://penazarea.altervista.org/images/2015/07/ddg1.jpg" /></p>
<p>da cui potremo iniziare immediatamente a cercare come un qualsiasi motore di ricerca, ma passiamo subito alle funzionalità più carine: i risultati diretti.</p>
<p>DuckDuckGo ha la possibilità di mostrare direttamente alcuni risultati, codificati dalla comunità o dagli stessi creatori, che permettono di ottenere risultati mirati e veloci, senza passare tramite siti terzi.</p>
<p>Alcuni esempi di ricerche dirette possono essere:</p>
<ul>
<li>Minecraft Status</li>
<li>Hello World Python</li>
<li>QuickSort Python (vedi scheda Q/A)</li>
<li>Regex</li>
</ul>
<p>Un'altra caratteristica carina è la calcolatrice, in grado di fare calcoli semplici (2+2=4) o più complessi (22% of 4976).</p>
<p>Ancora, siete dei viaggiatori? O avete il vostro partner che vive in un paese lontano lontano e non volete svergliarlo con una chiamata? Guardate che ore sono da loro (Time New York, per esempio), o ancora sapete che hanno un appuntamento alle 4 del pomeriggio PST (orario pacifico), provate "4pm PST to GMT+1" (GMT+1 è il fuso orario Italiano) per sapere fino a che ora potete parlare.</p>
<p>Potete cercare una ricetta, con risultati immediati (Recipe Tiramisu, per esempio), oppure settare un timer (timer 1 minute, per un minuto), giocare a testa o croce (flip a coin), e non so quanti altri risultati immediati ci possano essere. Per vedere/creare/suggerire, date un'occhiata a <a href="http://duckduckhack.com">duckduckhack.com</a>.</p>
<p>Ora arriviamo ad una caratteristica interessante di DuckDuckGo: le Bang searches.</p>
<p>DuckDuckGo permette di avere risultati immediati ricercando direttamente in siti internet di vostra scelta, alcuni esempi:</p>
<ul>
<li>Markiplier !youtube (cerca "Markiplier" su youtube)</li>
<li>Obsidian !minecraft (cerca "obsidian" in minecraft wiki)</li>
<li>Space !wiki (cerca "Space" in wikipedia)</li>
<li>Abissi d'acciaio !amazon (Cerca "Abissi d'acciaio" su amazon)</li>
</ul>
<p>E molti molti altri... Non vi resta che provare voi stessi.</p>
<p>Buona ricerca a tutti!</p>
<p>Penaz</p>FluidText: il mio primo plugin per Bukkit2015-04-06T00:00:00+02:002015-04-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2015-04-06:/coding/FluidText_Bukkit.html<p>Un piccolo progetto a cui ho lavorato nel mio tempo libero, per conoscere le basi di programmazione di Bukkit: FluidText</p><h1>Un piccolo progetto a cui ho lavorato nel mio tempo libero, per conoscere le basi di programmazione di Bukkit: FluidText</h1>
<p>Salve a tutti, recentemente ho voluto testare le mie capacità di programmazione in Java creando un plugin per il più famoso server Minecraft: Bukkit. Ora che Spigot (un fork di bukkit a bassa latenza) è stato rilasciato nella versione 1.8 ho voluto creare un plugin che desse la possibilità di usare le nuove caratteristiche di chat. Ecco a voi FluidText.</p>
<p>FluidText è un semplice plugin che permette di creare facilmente file di aiuto "attivi" tramite semplici file di testo, aggiungendo bottoni, paginazione ed altro.</p>
<p>Nel readme di gitHub è presente la sintassi e l'uso di questo piccolo plugin, oltre che una lista dei comand principali.</p>
<p>Con FluidText è possibile riferirsi direttamente al giocatore (Tramite <strong>{PLAYER}</strong>, che verrà rimpiazzato con il nome utente del giocatore che richiamerà il file d'aiuto) oppure creare bottoni tramite</p>
<blockquote>
<p><code>Testo|Azione su click|Azione su puntamento|Valore click|Valore Puntamento</code>.</p>
</blockquote>
<p>Inoltre il plugin è in grado di fare un parsing primitivo dei file YAML, per poter avere più capitoli in un unico file d'aiuto.</p>
<p>Il repository di GitHub è situato in <a href="https://github.com/Penaz91/FluidText">questa pagina</a>.</p>
<p>Il plugin è distribuito sotto licenza MIT, gratuitamente, ma senza alcuna garanzia nè responsabilità.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Redshift ed F.Lux: Adattiamo il colore del nostro schermo alle nostre esigenze2015-01-27T00:00:00+01:002015-01-27T00:00:00+01:00Penaztag:penazarea.altervista.org,2015-01-27:/gratis-sul-web/Redshift_Flux.html<p>Scopriamo RedShift ed F.Lux, due programmi che permettono di cambiare la temperatura del colore dello schermo in base all'ora del giorno.</p><h1>Scopriamo RedShift ed F.Lux, due programmi che permettono di cambiare la temperatura del colore dello schermo in base all'ora del giorno.</h1>
<p>Buongiorno (o buonasera) a tutti, è scientificamente provato che restare a contatto con luci del tipo "blu" alla sera può portare ad alcuni disturbi quando arriva l'ora di andare a letto, sino ad arrivare ad una vera e propria sindrome chiamata "Sleep Delay Syndrome" (Sindrome da sonno ritardato) or "Delayed Sleep Phase Disorder" (Disordine da fase del sonno ritardata).</p>
<p>Infatti le luci di tipo "blu" (Originate da televisori, Computer e schermi in generale), sono generate in modo da imitare la luce solare e sottoporsi a luce solare negli orari in cui il nostro corpo dovrebbe dormire provoca dei problemi nella produzione di Melatonina, responsabile del sonno (Ad esempio questo è ciò che accade nel fenomeno conosciuto come jet-lag).</p>
<p>Se siete costretti a lavorare al computer la sera potrebbe essere utile abbassare la luminosità dello schermo e dotarsi di un programma che vi permetta di cambiare la temperatura del colore visualizzato sul vostro schermo, spostandola verso il rosso quando si fa sera.</p>
<p>Bene, questi programmi sono RedShift ed F.Lux. Entrambi funzionano sia su Windows che su Linux o Mac ed entrambi sono estremamente leggeri, con RedShift leggermente più flessibile e configurabile di F.Lux che di per sè ha un'interfaccia più accattivante.</p>
<p>Redshift vi permette di configurare la temperatura di giorno e di sera dello schermo, si collega a GeoClue per rilevare automaticamente la vostra posizione e regolarsi di conseguenza per quanto riguarda l'ora in cui far cambiare la temperatura, potete decidere se avere un passaggio graduale o istantaneo e quale modalità di interfacciamento con Xorg deve essere usata per agire. Il tutto deve essere fatto dal file di configurazione.</p>
<p>Potete avere maggiori informazioni e scaricare RedShift da <a href="http://jonls.dk/redshift/">questo link</a></p>
<p>D'altra parte F.Lux ha un'interfaccia molto semplice da cui si possono configurare tutte le opzioni tra cui la vostra posizione e passaggio dalla modalità giorno alla modalità notte in pochi secondi o diversi minuti.</p>
<p>Maggiori informazioni su F.Lux sono presenti sul sito che potete raggiungere cliccando <a href="https://justgetflux.com/">su questo link</a></p>
<p>Buon Divertimento a tutti,</p>
<p>Saluti e alla prossima.</p>
<p>Penaz</p>Montare ReadyShare di Netgear su Linux2015-01-13T00:00:00+01:002015-01-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2015-01-13:/misc/ReadyShare_Linux.html<p>Vediamo come poter montare un eventuale Netgear ReadyShare sulla nostra macchina Linux usando CIFS.</p><h1>Vediamo come poter montare un eventuale Netgear ReadyShare sulla nostra macchina Linux usando CIFS.</h1>
<p>Dopo il passaggio da SMB a CIFS, alcuni utenti (tra cui me) si sono ritrovati in difficoltà nel tentativo di montare il proprio hard disk usb attaccato al router Netgear tramite la funzione ReadyShare, ritrovandosi con i seguenti errori:</p>
<ul>
<li>Permission Denied</li>
<li>I/O Error</li>
</ul>
<p>Non vi preoccupate, il vostro hard disk sta bene, semplicemente CIFS ha bisogno di un parametro per connettersi correttamente al vostro ReadyShare.</p>
<p>Provate questo comando:</p>
<div class="codehilite"><pre><span></span><code><span class="n">mount</span><span class="p">.</span><span class="n">cifs</span> <span class="o">-</span><span class="n">o</span> <span class="n">sec</span><span class="o">=</span><span class="n">ntlm</span> <span class="c1">//[ip del router]/[nome dello share]; /mnt[mount point]</span>
</code></pre></div>
<p><strong>Perchè?</strong></p>
<p>Beh, il motivo è abbastanza semplice, mount.cifs usa il cosiddetto "Common Internet File System" per montare il drive sul nostro sistema, e ReadyShare è compatibile con lo standard CIFS, quello che manca è la precisa definizione dello standard di autenticazione, che noi definiamo con l'opzione "sec=ntlm" che dice a mount di usare "NT Lan Manager" come protocollo di sicurezza.</p>
<p>Dopo aver usato questo comando riceverete la richiesta di inserire la password per accedere al vostro drive esterno (potete semplicemente premere Invio se non ne avete una).</p>
<p>Per comodità ho voluto aggiungere un piccolo alias all'interno della mia console in modo da poter accedere all'hard disk direttamente senza dover ricordare il comando completo, semplicemente digitando "mntext" (Mount External).</p>
<p>Potete aggiungerlo al vostro .bashrc o .zshrc con questa riga:</p>
<blockquote>
<p>alias mntext="mount.cifs -o sec=ntlm //[ip del router]/[nome dello share] /mnt/[mount point]"</p>
</blockquote>
<p>Buon divertimento a tutti e saluti.</p>
<p>Alla prossima!</p>
<p>Penaz</p>VVVVVV Make&Play disponibile gratis!2014-08-29T00:00:00+02:002014-08-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2014-08-29:/gratis-sul-web/VVVVVV_MakePlay.html<p>VVVVVV, Il gioco che ha incollato al pc milioni di persone con la propria storia, gameplay e difficoltà è ora dispobilile gratis per il download!</p><h1>VVVVVV, Il gioco che ha incollato al pc milioni di persone con la propria storia, gameplay e difficoltà è ora dispobilile gratis per il download!</h1>
<p>Buongiorno a tutti, Oggi vi voglio parlare di un gioco commerciale: VVVVVV. VVVVVV è un gioco dalla grafica molto retrò (stile commodore64) e musica chiptune estremamente coinvolgente ed accattivante, basato su un gameplay tanto semplice da capire quanto difficile da padroneggiare: non si salta, il personaggio principale può "invertire la gravità" passando dal pavimento al soffitto e viceversa, non è possibile effettuare questa operazione a mezz'aria.</p>
<p>Per quanto VVVVVV sia pieno zeppo di spine, nemici ed ostacoli; la massiccia presenza di checkpoint rende il tutto molto meno stressante, rendendo il gioco veramente difficile ma non impossibile or stressante rendendolo il classico gioco che "ti fa prendere la scimmia" e dal quale è veramente faticoso staccarsi.</p>
<p>Bene, da quasi un paio di mesi VVVVVV è disponibile gratis sul sito ufficiale nella propria Make&Play edition, che non comprende la (secondo me fantastica) campagna principale ma in compenso comprende l'editor di livelli ed il motore con il quale è possibile giocare a tutti i livelli messi a disposizione dalla comunità di giocatori che vogliono mostrare le loro opere videoludiche al mondo. Il tutto Gratis.</p>
<p>Consiglio vivamente di provare questo capolavoro, creato da Terry Cavanagh (già noto per altri giochi come SuperHexagon) con le fantastiche tracce sonore in chiptune di SoulEye, e se decidete di acquistare un giorno la versione completa vi consiglio vivamente di dare un'ascolto al <a href="https://www.youtube.com/watch?v=HlQhHUT1boc">guitar medley di FamilyJules7X</a> e di controllare la descrizione del video, esiste infatti una mod per integrare tali tracce metal, in sostituzione di quelle in chiptune. Fantastico.</p>
<p>Potete tranquillamente scaricare questo fantastico gioco dalla <a href="http://thelettervsixtim.es/editor.html">pagina ufficiale di VVVVVV</a>. Sotto la sezione "VVVVVV Make&Play Edition"</p>
<p>Il gioco è disponibile per piattaforma Windows, Linux oppure MacOS.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz</p>Impariamo le lingue con Livemocha2014-08-14T00:00:00+02:002014-08-14T00:00:00+02:00Penaztag:penazarea.altervista.org,2014-08-14:/misc/LiveMocha.html<p>Conosciamo Livemocha un sito estremamente interessante dal quale potremo imparare tante lingue Gratuitamente</p><p>Conosciamo Livemocha un sito estremamente interessante dal quale potremo imparare tante lingue Gratuitamente</p>
<p>Purtroppo i problemi nella mia vita non informatica (alcuni la chiamano vita reale) si fanno sentire fin troppo e non ho avuto alcuna possibilità di pensare nè tantomeno pubblicare nuovi contenuti interessanti per il blog, perciò oggi, dopo 4 mesi di inattività cercherò di rifarmi presentandovi Livemocha.</p>
<p>Consigliatomi da un'amica americana (che ringrazio infinitamente), Livemocha è un fantastico sito nel quale potremo frequentare corsi di lingue, e non sto parlando dei classici Inglese, Francese, Tedesco e Spagnolo ma di ben oltre 35 lingue diverse tra cui Bulgaro, Cinese mandarino, Italiano, Giapponese, Lituano e Turco...</p>
<p>Il sito presenta video corsi per l'auto apprendimento di tantissime lingue ed in caso di necessità è possibile partecipare a vere e proprie lezioni in tempo reale con un insegnante della vostra lingua preferita.</p>
<p>Inoltre, se volete diffondere la vostra cultura potete insegnare la vostra lingua e contribuire alla crescita di questo fantastico sito quale è Livemocha.</p>
<p>Se volete provare immediatamente Livemocha e sottoscrivere un account gratuito è sufficiente seguire questo <a href="http://livemocha.com/">link</a>.</p>
<p>Se volete dare una rapida occhiata alle lingue che il sito vi offre è sufficiente <a href="http://livemocha.com/pages/learn-languages/">visualizzare la lista delle lingue</a>.</p>
<p>Buon apprendimento a tutti.</p>
<p>Saluti ed Al prossimo post.</p>
<p>Penaz.</p>Aggiungiamo lo splash nel nostro Initramfs2014-03-29T00:00:00+01:002014-03-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-03-29:/misc/Initramfs_Splash.html<p>Vediamo come aggiungere una schermata di Splash al nostro Initramfs con gli strumenti di SplashUtils.</p><h1>Vediamo come aggiungere una schermata di Splash al nostro Initramfs con gli strumenti di SplashUtils.</h1>
<p>Buongiorno a tutti, in questo articolo vi ho introdotto nel pericoloso ed allo stesso tempo affascinante mondo dell'Initramfs personalizzato, oggi vedremo come aggiungere una schemata di splash al nostro initramfs con splashutils.</p>
<p>Per prima cosa è necessario installare splashutils ed i temi che vogliamo usare, dopodichè è necessario eseguire il seguente comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">splash_geninitramfs --verbose --res |risoluzione| --copy |percorso cartella initramfs| |nome tema|</span>
</code></pre></div>
<p>Per esempio, nel mio caso:</p>
<div class="codehilite"><pre><span></span><code><span class="err">splash_geninitramfs --verbose --res 1366x768 --copy /usr/src/initramfs default</span>
</code></pre></div>
<p>Automaticamente lo script appena usato copierà i file necessari nella cartella scelta. Ora non resta che vedere se il modulo della scheda video è installato come modulo o integrato nel kernel. Se è integrato nel kernel potete tranquillamente compilare il vostro initramfs come indicato nell'articolo citato all'inizio, se invece è configurato come modulo dovrete effettuare alcune operazioni:</p>
<p><strong>Queste operazioni faranno in modo che l'initramfs non sia più "Universale", quindi dovrete effettuare di nuovo queste operazioni ad ogni aggiornamento del kernel</strong></p>
<p>Innanzitutto eliminate la cartella lib all'interno del vostro initramfs</p>
<div class="codehilite"><pre><span></span><code><span class="err">rmdir lib</span>
</code></pre></div>
<p>e create un link a lib64, sempre del vostro initramfs.</p>
<div class="codehilite"><pre><span></span><code><span class="err">ln -s lib lib64</span>
</code></pre></div>
<p>Ora copiate tutto il contenuto di /lib/modules in lib64 del vostro initramfs.</p>
<div class="codehilite"><pre><span></span><code><span class="err">cp -aR /lib/modules lib/</span>
</code></pre></div>
<p>Ora aggiungete nello script init, dopo il montaggio delle cartelle /proc e /sys la seguente riga</p>
<blockquote>
<p>modprobe |nome modulo scheda video|</p>
</blockquote>
<p>Nel mio caso:</p>
<blockquote>
<p>modprobe i915</p>
</blockquote>
<p>Appena avvenuto il caricamento del modulo lo splash dovrebbe comparire.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Creiamo un Initramfs personalizzato su Linux2014-03-22T00:00:00+01:002014-03-22T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-03-22:/misc/Custom_Initramfs.html<p>Vediamo come creare un Initramfs completamente personalizzato su Linux.</p><h1>Vediamo come creare un Initramfs completamente personalizzato su Linux.</h1>
<p>Buongiorno a tutti; a volte capita, per scelta o per necessità, di dover creare un cosiddetto Initramfs, cioè un'immagine di disco caricata contestualmente al kernel che dice al sistema come completare una certa procedura di avvio, per esempio montare un filesystem con LVM prima di montarlo e procedere all'avvio del pc dallo stesso volume LVM.</p>
<p>Esistono molti metodi per creare un initramfs, per gentoo ci sono gli script GenKernel oppure Dracut o ancora, si può usare better-initramfs.</p>
<p>Io ho voluto andare più a fondo e creare da zero il mio personalissimo Initramfs, cosa che molte volte richiede la generazione di un codice eseguibile in C per l'init. Ma se l'immagine viene ben costruita è possibile scrivere l'init in semplice codice Bash. Vediamo come.</p>
<p>I prerequisiti sono gli stessi di qualunque altro sistema su cui deve girare un initramfs, iniziamo creando la struttura di cartelle su cui andremo a lavorare:</p>
<div class="codehilite"><pre><span></span><code><span class="err">mkdir /usr/src/initramfs</span>
<span class="err">cd /usr/src/initramfs</span>
<span class="err">mkdir -p bin dev etc lib lib64 mnt/root proc root sbin sys</span>
</code></pre></div>
<p>Ora è necessario avere a disposizione un ambiente dove il nostro init possa venire eseguito. Invece di ricompilare una miriade di programmi per poi copiarli nella nostra immagine, senza mai vedere la fine è possibile usare busybox; che contiene un ambiente shell completo.</p>
<p>Verifichiamo che busybox sia compilato con librerie statiche:</p>
<div class="codehilite"><pre><span></span><code><span class="err">ldd /bin/busybox</span>
</code></pre></div>
<p>Se ldd risponde "Not a dynamic executable" possiamo copiarlo direttamente nella nostra cartella.</p>
<div class="codehilite"><pre><span></span><code><span class="err">cp -a /bin/busybox /usr/src/initramfs/bin/busybox</span>
</code></pre></div>
<p>Se al posto dell'avviso di cui sopra vi esce un elenco di librerie è necessario ricompilare busybox, per esempio usando la USE flag "static" per gentoo.</p>
<p>Ora copia alcuni nodi importanti:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cp -a /dev/{console,null,sda1,tty} /usr/src/initramfs/dev/</span>
</code></pre></div>
<p>Ora aggiungete tutti i programmi che possono essere utili all'avvio del vostro pc, tenendo conto che più ne aggiungete più il vostro initramfs sarà pesante, inoltre busybox contiene moltissime funzioni, anche un editor in stile VI.</p>
<p>Nel mio caso la struttura delle cartelle è:</p>
<blockquote>
<p>PenazMW initramfs # tree</p>
<p>.</p>
<p>|-- bin</p>
<p>| `-- busybox</p>
<p>|-- dev</p>
<p>| |-- console</p>
<p>| |-- null</p>
<p>| |-- sda1</p>
<p>| `-- tty</p>
<p>|-- etc</p>
<p>|-- init</p>
<p>|-- lib</p>
<p>|-- lib64</p>
<p>|-- mnt</p>
<p>| `-- root</p>
<p>|-- proc</p>
<p>|-- root</p>
<p>|-- sbin</p>
<p>| |-- lvm</p>
<p>| `-- mdev -> /usr/src/initramfs/bin/busybox</blockquote></p>
</blockquote>
<p>Avendo la root su un volume LVM ho dovuto ricompilare LVM2 con la USE flag "Static" ed ho deciso di popolare /dev tramite mdev, praticamente udev per busybox.</p>
<p>Ora arriva la parte creativa, la scrittura dello script di init, qui molto dipende dalle vostre esigenze, nel mio caso avremo:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/busybox sh</span>
<span class="c1">#Shell di emergenza in caso di problemi</span>
rescue_shell<span class="o">()</span> <span class="o">{</span>
<span class="nb">echo</span> <span class="s2">"Something went wrong. Dropping you to a shell."</span>
busybox --install -s
<span class="nb">exec</span> /bin/sh
<span class="o">}</span>
<span class="c1">#montaggio proc e sys e tmpfs</span>
mount -t proc none /proc
mount -t sysfs none /sys
<span class="c1">#Avvio Mdev</span>
<span class="nb">echo</span> /sbin/mdev <span class="p">&</span>gt<span class="p">;</span> /proc/sys/kernel/hotplug
mdev -s
<span class="c1">#Avvio Lvm2</span>
lvm lvchange -aly vg
lvm vgscan --mknodes
<span class="c1"># montaggio Root</span>
mount -o ro -t ext4 /dev/mapper/vg-Root /mnt/root <span class="o">||</span> rescue_shell
<span class="c1"># Pulizia</span>
umount /proc
umount /sys
<span class="c1"># Chroot e passaggio al vero init</span>
<span class="nb">echo</span> <span class="s2">"Switching to real root..."</span>
<span class="nb">exec</span> switch_root /mnt/root /sbin/init
</code></pre></div>
</td></tr></table>
<p>Particolare nota merita la funzione rescue_shell che, nel caso non fosse possibile montare la root, invece di provocare un kernel panic fa in modo che il sistema ricada con leggiadria in una console di emergenza da dove è possibile analizzare il problema.</p>
<p>I superutenti più arditi possono far leggere allo script la linea di comando ed inventare un nuovo argomento (tipo "shell") per accedere direttamente alla shell di emergenza, senza avviare completamente il sistema.</p>
<p>Ora è il momento di generare l'immagine con cui andremo ad avviare il sistema. Sono pochi comandi.</p>
<div class="codehilite"><pre><span></span><code><span class="err">cd /usr/src/initramfs</span>
<span class="err">find . -print0 | cpio --null -ov --format=newc|gzip -9 &gt; &lt;percorso di salvataggio&gt;/initramfs.gz</span>
</code></pre></div>
<p>È importante non salvare il file all'interno della /usr/src/initramfs altrimenti succederanno degli spiacevoli inconvenienti.</p>
<p>Ora è sufficiente copiare il file initramfs.gz dalla cartella di salvataggio alla /boot di sistema e configurare opportunamente il vostro boot manager, sia esso Grub 0.97, Grub2, LiLo o Burg.</p>
<p>Se tutto è andato come doveva al successivo avvio dovreste avere un initramfs funzionante.</p>
<p>Buon smanettamento a tutti!</p>
<p>Penaz.</p>Poniamo fine agli arresti di sistema involontari su Linux2014-03-20T00:00:00+01:002014-03-20T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-03-20:/misc/halt_alias.html<p>Vediamo un piccolo script in Bash per modificare il comportamento dei comandi di sistema "halt" e "reboot" di Linux.</p><h1>Vediamo un piccolo script in Bash per modificare il comportamento dei comandi di sistema "halt" e "reboot" di Linux.</h1>
<p>Buongiorno a tutti. Dopo due settimane di inattività torno alla carica con un problema che affligge me e sicuramente qualcun'altro: gli spegnimenti involontari dei sistemi Linux. La classica situazione tipo è: "Ok devo riavviare il sistema" per poi accorgersi che era necessario eseguire un'altra operazione o un'altra serie di operazioni prima del fatidico "reboot".</p>
<p>Tramite questo semplice script in bash è possibile fare in modo che il sistema chieda se vogliamo veramente riavviare il sistema:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="c1"># Un semplice script per il controllo granulare</span>
<span class="c1"># dello spegnimento e del riavvio del sistema</span>
<span class="k">while</span> <span class="nb">test</span> <span class="nv">$#</span> -gt <span class="m">0</span><span class="p">;</span> <span class="k">do</span>
<span class="k">case</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span> in
-h<span class="p">|</span>--help<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"Usage:"</span>
<span class="nb">echo</span> <span class="s2">" "</span>
<span class="nb">echo</span> <span class="s2">"-s|--shutdown -> Perform System Halt"</span>
<span class="nb">echo</span> <span class="s2">"-r|--reboot -> Perform System Reboot"</span>
<span class="nb">exit</span> <span class="m">0</span>
<span class="p">;;</span>
-s<span class="p">|</span>--shutdown<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"This will perform a full System halt, do you want to continue? [y/N]"</span>
<span class="nb">read</span> A
<span class="k">case</span> <span class="s2">"</span><span class="nv">$A</span><span class="s2">"</span> in
y<span class="p">|</span>yes<span class="p">|</span>Yes<span class="p">|</span>Y<span class="o">)</span>
shutdown -h now
<span class="nb">exit</span> <span class="m">0</span>
<span class="p">;;</span>
n<span class="p">|</span>no<span class="p">|</span>No<span class="p">|</span>N<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"Shutdown cancelled"</span>
<span class="nb">exit</span> <span class="m">0</span>
<span class="p">;;</span>
*<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"Invalid answer, assuming 'no'"</span>
<span class="nb">break</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="p">;;</span>
-r<span class="p">|</span>--reboot<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"This will perform a System reboot, do you want to continue? [y/N]"</span>
<span class="nb">read</span> A
<span class="k">case</span> <span class="s2">"</span><span class="nv">$A</span><span class="s2">"</span> in
y<span class="p">|</span>yes<span class="p">|</span>Yes<span class="p">|</span>Y<span class="o">)</span>
shutdown -r now
<span class="nb">exit</span> <span class="m">0</span>
<span class="p">;;</span>
n<span class="p">|</span>no<span class="p">|</span>No<span class="p">|</span>N<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"Reboot cancelled"</span>
<span class="nb">exit</span> <span class="m">0</span>
<span class="p">;;</span>
*<span class="o">)</span>
<span class="nb">echo</span> <span class="s2">"Invalid answer, assuming 'no'"</span>
<span class="nb">break</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="p">;;</span>
*<span class="o">)</span>
<span class="nb">break</span>
<span class="p">;;</span>
<span class="k">esac</span>
<span class="k">done</span>
</code></pre></div>
</td></tr></table>
<p>Dopo averlo piazzato dove più ci aggrada è sufficiente aprire il file di configurazione della nostra shell (.bashrc per gli utenti Bash e .zshrc per gli utenti Z-Shell) ed aggiungere le seguenti righe:</p>
<div class="codehilite"><pre><span></span><code><span class="err">alias halt=/usr/local/bin/ipwr.sh -s</span>
<span class="err">alias reboot=/usr/local/bin/ipwr.sh -r</span>
</code></pre></div>
<p>Nel mio caso ho inserito lo script in /usr/local/bin. Il sistema funzionerà dalla prossima apertura della shell.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Impariamo ad usare la CLI di Linux2014-03-04T00:00:00+01:002014-03-04T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-03-04:/misc/CLI.html<p>Diventiamo Super User imparando ad usare la potentissima interfaccia CLI di Linux con un ottimo libro gratuito.</p><h1>Diventiamo Super User imparando ad usare la potentissima interfaccia CLI di Linux con un ottimo libro gratuito.</h1>
<p>Buongiorno a tutti, dopo aver installato la vostra distribuzione preferita di Linux vi ritroverete più o meno immediatamente con un desktop perfettamente funzionante con cui potrete fare tutte le operazioni di tutti i giorni: modificare documenti, navigare in internet, ecc...</p>
<p>Dopo un po' potreste però avere la necessità di fare qualcosa di più e più in fretta, ed è qui che entra in gioco la Linea Di Comando o CLI di Linux, un'interfaccia che se ben compresa può dare diverse soddisfazioni ed oggi vi propongo un sito che ospita un ebook gratuito che vi insegnerà come usarla.</p>
<p>Tramite la linea di comando è possibile fate praticamente tutto quello che fate con l'interfaccia grafica (Anche <a href="http://it.wikipedia.org/wiki/Lynx_(software)">navigare in internet</a>) e molto, molto di più; con la linea di comando potete inoltre creare dei piccoli script che vi permettono di eseguire automaticamente operazioni lunghe o ripetitive ed eventualmente recuperare il vostro sistema nel caso risultasse corrotto.</p>
<p>Ovviamente tanta potenza arriva ad un costo, ed è l'estrema pericolosità di questo strumento, se posto nelle mani sbagliate, un paio di comandi da <strong>non usare mai</strong> sono:</p>
<div class="codehilite"><pre><span></span><code><span class="err">rm -rf /</span>
</code></pre></div>
<p>Eseguito da root, questo comando elimina tutto il contenuto della cartella radice, eliminando tutti i file di sistema ed i dati contenuti nella vostra home.</p>
<div class="codehilite"><pre><span></span><code><span class="err">perl -e "fork while fork" &</span>
</code></pre></div>
<p>Questa è una cosiddetta <em>fork bomb</em> un processo che si riproduce fino a quando non avviene un blocco del sistema, questa è una fork bomb scritta con perl, ma anche la CLI standard di linux è in grado di produrre gli stessi effetti, la più famosa fork bomb bash è la criptica:</p>
<div class="codehilite"><pre><span></span><code><span class="err">:(){ :|: & };:</span>
</code></pre></div>
<p>Che fa esattamente la stessa cosa.</p>
<p>Tornando a noi, per evitare di cadere in questi più o meno innocenti tranelli che potrebbero venirci tesi dai nostri amici Guru dell'informatica o da siti poco affidabili, e poter usare gran parte della potenza della CLI senza temere disastri vi propongo il sito <a href="http://linuxcommand.org/index.php">LinuxCommand</a> un sito pieno di risorse riguardanti la Linea di Comando Linux, inoltre vi consiglio caldamente di leggere il Libro proposto dal sito, scaricabile gratuitamente da <a href="http://linuxcommand.org/tlcl.php">questa pagina</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti ed alla prossima!</p>
<p>Penaz.</p>Cerchiamo files velocemente in VIM con Command-T2014-02-21T00:00:00+01:002014-02-21T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-21:/misc/VIM17.html<p>Conosciamo ed installiamo Command-T un fantastico plugin per VIM che ci permette di aprire file in maniera fulminea.</p><h1>Conosciamo ed installiamo Command-T un fantastico plugin per VIM che ci permette di aprire file in maniera fulminea.</h1>
<p>Buongiorno a tutti; a volte, soprattutto durante un progetto, potrebbe essere necessario aprire un file direttamente da VIM e l'uso del tasto TAB per completare i percorsi è abbastanza lento e laborioso (sempre che vi accada come accade a me che TAB non funzioni proprio), la soluzione a questo problema è un fantastico plugin: Command-T.</p>
<p>Il plugin ha preso il nome dalla finestra "Vai al file" di TextMate che a sua volta era legata proprio alla combinazione di tasti Command-T.</p>
<p>Con Command-T è possibile aprire file con pochissimi colpi di tastiera, basta digitare alcuni caratteri che appartengono al percorso o al nome del file, in quest'ordine ed il plugin farà la ricerca per voi.</p>
<p>Vediamo ora come installare Command-T.</p>
<p>Prima di tutto è necessario che VIM sia compilato con il supporto per Ruby, per esempio in gentoo è sufficiente aggiungere la USE flag "Ruby" in package.use.</p>
<p>Dopodiché possiamo installare direttamente Command-T con il nostro gestore pacchetti, ma purtroppo (almeno nella mia macchina) la versione in portage non funziona correttamente, provocando errori all'avvio di VIM, quindi vi inserisco la procedura di installazione manuale:</p>
<ol>
<li>Scaricate il VIMball dalla <a href="http://www.vim.org/scripts/script.php?script_id=3025">pagina ufficiale del Plugin</a></li>
<li>Aprite il file appena scaricato con VIM</li>
<li>Date il source del file aperto con:
>:so %</li>
<li>Ora aprite il terminale ed andate nella cartella dove è stato installato il plugin, solitamente ~/.vim/ruby/command-t e date:</li>
</ol>
<div class="codehilite"><pre><span></span><code><span class="err">ruby extconf.rb</span>
</code></pre></div>
<p>infine avviate la compilazione con</p>
<div class="codehilite"><pre><span></span><code><span class="err">make</span>
</code></pre></div>
<p>Ora è sufficiente dare il comando</p>
<blockquote>
<p>:CommandT</p>
</blockquote>
<p>oppure mapparlo alla vostra combinazione di pulsanti preferita per poter aprire immediatamente il file che vi serve (io uso la doppia virgola).</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Eric: un IDE per programmare in Python e Ruby2014-02-20T00:00:00+01:002014-02-20T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-20:/gratis-sul-web/Eric.html<p>Scopriamo Eric, un IDE creato appositamente per la programmazione in Python e Ruby.</p><h1>Scopriamo Eric, un IDE creato appositamente per la programmazione in Python e Ruby.</h1>
<p>Buongiorno a tutti, se non vi va di complicarvi eccessivamente la vita con configurazioni eccessivamente complesse e modifiche estreme su editor come VIM (<a href="../tag/vim.html">Vedi gli articoli dedicati</a>) potrebbe risultare utile un IDE bello e pronto, dedicato alla programmazione nei vostri linguaggi preferiti; oggi vi presento Eric, un IDE per la programmazione in <a href="http://it.wikipedia.org/wiki/Ruby">Ruby</a> e <a href="http://it.wikipedia.org/wiki/Python">Python</a>... programmato in Python.</p>
<p>Eric è basato sul motore Scintilla ed usa Qt per la creazione delle finestre grafiche, fra le innumerevoli caratteristiche di questo completissimo IDE troviamo:</p>
<ul>
<li>Possibilità di aprire un numero illimitato di editors;</li>
<li>Layout delle finestre completamente configurabile;</li>
<li>Evidenziazione della sintassi configurabile;</li>
<li>Completamento della sintassi automatico;</li>
<li>Folding del codice;</li>
<li>Evidenziazione dei possibili errori;</li>
<li>Cerca/Sostituisci in tutto il progetto a cui si sta lavorando e non solo nel codice corrente;</li>
<li>Supporto per diversi plugins;</li>
<li>Molto altro ancora...</li>
</ul>
<p>Eric è compatibile con i sistemi Windows, Linux e MacOS; per la felicità di tutti quanti. Se volete scaricare immediatamente questo fantastico IDE per Python e Ruby non vi resta che andare sul <a href="http://eric-ide.python-projects.org">sito internet ufficiale</a> e scaricare la versione adatta al vostro sistema operativo.</p>
<p>Buona programmazione a tutti!</p>
<p>Penaz.</p>Not Pacman: un altro classico rivisitato in chiave fisica.2014-02-19T00:00:00+01:002014-02-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-19:/gratis-sul-web/NotPacman.html<p>Diamo un'occhiata ad un altro classico video ludico rivisto in chiave fisica: Not Pacman.</p><h1>Diamo un'occhiata ad un altro classico video ludico rivisto in chiave fisica: Not Pacman.</h1>
<p>Buongiorno a tutti, in <a href="https://penazarea.altervista.org/gratis-sul-web/NotTetris.html">questo articolo</a> vi ho parlato di Not Tetris 2, un clone del celeberrimo Tetris con un tocco di fisica in più; e se un classico dei classici come PacMan potesse far uso della fisica? Ecco come nasce Not Pacman.</p>
<p>I gestori di <a href="http://stabyourself.net">Stabyourself.net</a> hanno deciso di ricreare PacMan con la possibilità di ruotare il campo di gioco in modo che il personaggio, influenzato dalla gravità, possa "rotolare" mangiando pallini luminosi.</p>
<p>Il resto della meccanica di Not Pacman è esattamente come quella di Pacman, a parte il fatto che anche i fantasmini sono affetti dalla gravità come il giocatore.</p>
<p>Inoltre è possibile giocare con molti tipi di controller diversi: se non avete un volante potete usare un joypad, se non avete un joypad potete usare il mouse, se non avete il mouse potete usare la tastiera e se non avete una tastiera è un grosso problema...</p>
<p>Il gioco è disponibile per sistemi Windows, Linux e MacOS. Per compilare il gioco da sorgenti è necessario il framework LÖVE di cui vi ho parlato in <a href="https://penazarea.altervista.org/gratis-sul-web/Love.html">questo articolo</a></p>
<p>Se volete provare Not Pacman non vi resta che collegarvi alla pagina dedicata su Stabyourself.net e scaricare il gioco.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Not Tetris 2: come tetris, ma non proprio...2014-02-18T00:00:00+01:002014-02-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-18:/gratis-sul-web/NotTetris.html<p>Presentazione di Not Tetris 2, un clone di tetris con la caratteristica di avere una fisica realistica.</p><h1>Presentazione di Not Tetris 2, un clone di tetris con la caratteristica di avere una fisica realistica.</h1>
<p>Buongiorno a tutti, da Stabyourself.net arriva un clone di Tetris tutto particolare: Not Tetris 2.</p>
<p>Questo gioco ha tutti il divertimento del classico tetris con tutti gli svantaggi di una fisica realistica, infatti i blocchi non sono confinati nella classica griglia che ha da sempre caratterizzato il gioco ma si possono muovere in ogni modo e le rotazioni non sono più ad angoli di 90° ma delle rotazioni continue che possono rendere il gioco un vero disastro se non si sta sufficientemente attenti.</p>
<p>Il gioco include le classiche tracce musicali che hanno reso famoso il gioco originale, ed è possibile creare delle partite multiplayer.</p>
<p>Nonostante la fisica realistica è comunque possibile fare punti in maniera abbastanza agevole: basta che una riga sia sufficientemente piena perchè vengano eliminati gli elementi che vi appartengono.</p>
<p>Il gioco è disponibile per Windows, Linux e MacOS. Per la compilazione da sorgente è necessario il framework LÖVE di cui vi ho parlato in <a href="https://penazarea.altervista.org/gratis-sul-web/Love.html">questo articolo</a>.</p>
<p>Se volete scaricare e giocare a Not Tetris 2 è sufficiente andare alla <a href="http://stabyourself.net/nottetris2/">pagina dedicata</a> sul sito di <a href="http://stabyourself.net">Stabyourself.net</a> e scaricare la versione adatta al vostro sistema operativo.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>npass: un piccolo frontend ncurses per Pass2014-02-18T00:00:00+01:002014-02-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-18:/coding/npass.html<p>Presentazione di npass, una piccola interfaccia per cercare rapidamente le password di Pass: il password manager di Unix.</p><h1>Presentazione di npass, una piccola interfaccia per cercare rapidamente le password di Pass: il password manager di Unix.</h1>
<p>Buongiorno a tutti, nonostante la leggerezza ed il minimalismo sono rimasto deluso dalla lentezza nella ricerca delle password all'interno dell'archivio di Pass, il password manager di Unix; così ho deciso di creare un piccolo frontend in python: nPass.</p>
<p>nPass è solamente una piccola applicazione in Python3 che ho creato con l'obiettivo di rendere più veloce la ricerca e la visualizzazione delle password che mi servono.</p>
<p>nPass si appoggia completamente a Pass, perciò non legge alcuna password o dato segreto; a dire il vero quando voi inserirete la "Master Password" per decriptare l'archivio, nPass sarà già chiuso.</p>
<p>Il programma di per sè è abbastanza semplice da usare, basta avviarlo con</p>
<div class="codehilite"><pre><span></span><code><span class="err">npass</span>
</code></pre></div>
<p>Con questo comando il programma sarà avviato in modalità visualizzazione, e nella parte inferiore della finestra vi sarà un prompt (>>>) che vi permetterà di filtrare istantaneamente le passwords semplicemente inserendo alcune lettere; quando l'elenco sarà filtrato a sufficienza potete usare le frecce direzionali per evidenziare la password che vi interessa e premere Invio per inviare a Pass il comando di visualizzazione e ricevere la richiesta di inserimento della "Master password" per decriptare l'archivio richiesto.</p>
<p>Se invece usate</p>
<div class="codehilite"><pre><span></span><code><span class="err">npass -c</span>
</code></pre></div>
<p>oppure</p>
<div class="codehilite"><pre><span></span><code><span class="err">npass --clip</span>
</code></pre></div>
<p>Npass verrà avviato in "modalità copia" che vi permetterà di usare la funzione di "Copia su appunti" che copierà la prima riga della password richiesta nella clipboard e la cancellerà automaticamente dopo 45 secondi.</p>
<p>Potete trovare il repository nella <a href="https://github.com/Penaz91">mia pagina di GitHub</a> oppure usare questo <a href="https://github.com/Penaz91/npass">link diretto</a> per vedere i files.</p>
<p><strong>Il programma è ancora in fase di development attivissimo quindi può presentare più di qualche baco.</strong></p>
<p>Buon proseguimento a tutti!</p>
<p>Penaz.</p>FiappoCube - Un clone minimale di FlappyBird2014-02-10T00:00:00+01:002014-02-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-10:/coding/FiappoCube.html<p>Per la sezione Game-Development in Python: FiappoCube, un clone minimale di Flappy Bird fatto con Python.</p><h1>Per la sezione Game-Development in Python: FiappoCube, un clone minimale di Flappy Bird fatto con Python.</h1>
<p>Buongiorno a tutti, sull'onda della rimozione di flappy bird da Play Store, ho deciso di mettere alla prova e creare un clone minimale del famosissimo gioco.</p>
<p>In tutto non ci è voluta più di mezz'ora per realizzare il cuore del gioco, cioè il sistema di volo (se si può parlare di un cubo che vola) e le collisioni.</p>
<p>Il gioco è fatto con Python e Pygame (di cui vi ho parlato <a href="https://penazarea.altervista.org/misc/Pygame.html">qui</a>).</p>
<p>FiappoCube è leggermente più evoluto e risulta più complesso da giocare, fra le caratteristiche:
- 3 Malus che occorrono ogni 10 punti:
- Gravità doppia
- Gravità invertita
- Velocità doppia
- Sistema di conteggio dei punti
- Sistema di volo variabile, ogni tocco sull'unico tasto di gioco fa volare il cubo in miera leggermente diversa, rendendo il tutto meno controllabile.</p>
<p>FiappoCube è disponibile sulla mia sezione di GitHub, nel <a href="https://github.com/Penaz91/FiappoCube">repository dedicato</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Sessioni SSH semplici con Linux2014-02-09T00:00:00+01:002014-02-09T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-09:/misc/SSH_Linux.html<p>Un piccolo trucchetto per rendere più semplici le nostre sessioni in SSH con Linux.</p><h1>Un piccolo trucchetto per rendere più semplici le nostre sessioni in SSH con Linux.</h1>
<p>Buongiorno a tutti, se avete molte macchine a cui dovete collegarvi via Secure-Shell potrebbe risultare difficoltoso ricordare tutti quanti i nomi utenti e tutti gli indirizzi IP di ciascuna macchina.</p>
<p>Per fortuna viene in aiuto lo stesso SSH o, per essere precisi, il suo file di configurazione.</p>
<p>Immaginiamo di avere una macchina che abbia un ip come 192.168.0.3 a cui vogliamo accedere da root, potremmo ricordarci tutti i dati e scrivere il comando:</p>
<div class="codehilite"><pre><span></span><code> <span class="n">ssh</span> <span class="n">root</span><span class="mf">@192.168.0.3</span>
</code></pre></div>
<p>oppure potremmo configurarlo nel seguente modo.</p>
<p>Apriamo o creiamo il file ~/.ssh/config, nella nostra home:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> vi .ssh/config</span>
</code></pre></div>
<p>e scriviamo una cosa del genere:</p>
<div class="codehilite"><pre><span></span><code><span class="err">Host pc-camera</span>
<span class="err"> HostName 192.168.0.3</span>
<span class="err"> User root</span>
</code></pre></div>
<p>e salviamo. Ora sarà sufficiente dare:</p>
<div class="codehilite"><pre><span></span><code><span class="err">ssh pc-camera</span>
</code></pre></div>
<p>ed avremo immediatamente una connessione verso il pc richiesto e la richiesta della password di root.</p>
<p>Nel caso volessimo accedere come un altro utente possiamo tranquillamente usare l' "alias" appena creato:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> ssh penaz@pc-camera</span>
</code></pre></div>
<p>Buona connessione a tutti!</p>
<p>Penaz.</p>3 ebook per imparare Python divertendosi2014-02-06T00:00:00+01:002014-02-06T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-06:/gratis-sul-web/Python_Ebook.html<p>Un tris di ebook per imparare il linguaggio Python divertendosi a creare giochi e non solo.</p><h1>Un tris di ebook per imparare il linguaggio Python divertendosi a creare giochi e non solo.</h1>
<p>Buongiorno a tutti, oggi voglio presentarvi un bel tris di ebook gratuiti con cui potrete imparare a programmare facilmente il linguaggio Python, divertendovi.</p>
<p>Tutti i libri sono scritti da Al Sweigart, e molto ben curati, ma vediamoli nel dettaglio.</p>
<h2>Invent Your Own Computer Games With Python</h2>
<p>Questo libro è dedicato principalmente al Python puro, come usarlo e creare i primi programmi da linea di comando, i primi programmini che rispondono all'input della tastiera, eccetera.</p>
<p>Pur essendo in inglese, il libro è stato scritto in maniera tale da essere comprensibile anche da un ragazzo dodicenne; è pieno zeppo di codice sorgente spiegato pezzo per pezzo e riga per riga.</p>
<p>La seconda edizione contiene ancora più contenuti ed un tutorial su come usare PyGame (di cui vi ho parlato in <a href="https://penazarea.altervista.org/misc/Pygame.html">questo articolo</a>).</p>
<p>Insomma un libro completissimo per imparare a programmare in Python da principiante a confidente, il tutto in 438 pagine.</p>
<p><a href="http://inventwithpython.com/index.html">Vai al sito ufficiale</a></p>
<h2>Making Games with Python & Pygame</h2>
<p>Con questo libro entriamo nella vera programmazione di videogiochi, imparando ad usare il wrapper per SDL Pygame.</p>
<p>Questo libro intende essere il seguito naturale del libro che vi ho mostrato prima, coprendo tutta la parte che riguarda la grafica, la musica ed i suoni in un videogioco.</p>
<p>Il libro comprende ben 11 giochi completi di codice sorgente accuratamente commentato e spiegato in ogni minimo dettaglio.</p>
<p>Con questo libro potrete gettarvi a capofitto e creare il vostro primo videogioco 2D e man mano che espanderete le vostre conoscenze potrete creare videogiochi sempre più complessi. Il tutto completamente Cross-Platform, così non dovrete nemmeno faticare per creare delle versioni differenziate per Windows o Linux.</p>
<p>Anche questo ebook è gratuito e liberamente scaricabile.</p>
<p><a href="http://inventwithpython.com/pygame/index.html">Vai Alla pagina ufficiale</a></p>
<h2>Hacking Secret Ciphers with Python</h2>
<p>Un altro fantastico libro, sempre di Al Sweigart, che ci insegnerà come programmare nel linguaggio Python.</p>
<p>Ma questa volta impareremo anche i più classici cifrari e costruiremo dei programmi in grado di criptare dati usando tali cifrari ed altri programmi in grado di "romperli".</p>
<p>I cifrari inseriti nel libro sono diversi, come il cifrario di Cesare, quello a trasposizione, a sostituzione e tanti altri.</p>
<p>I capitoli finali sono dedicati alla copertura della cifratura a chiave pubblica e la moderna cifratura RSA.</p>
<p><a href="http://inventwithpython.com/hacking/index.html">Vai Alla Pagina Ufficiale</a></p>
<p>Buona programmazione a tutti!</p>
<p>Saluti ed alla prossima!</p>
<p>Penaz.</p>Qalculate! Il calcolatore software potente.2014-02-05T00:00:00+01:002014-02-05T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-05:/gratis-sul-web/Qalculate.html<p>Presentazione di Qalculate! Un calcolatore per GNU/Linux estremamente potente, adatto agli studenti.</p><h1>Presentazione di Qalculate! Un calcolatore per GNU/Linux estremamente potente, adatto agli studenti.</h1>
<p>Buongiorno a tutti, oggi vi voglio parlare di un software che per, quanto semplice, non può mancare in nessun sistema informatico: La calcolatrice. Ne esistono di piccole, grandi, scientifiche, statistiche, ma secondo la mia opinione ne esistono veramente poche con un set di caratteristiche che possano solamente avvicinarsi a Qalculate!</p>
<p>Qualculate si definisce "Il calcolatore Desktop definitivo", e probabilmente è vero, dato l'estesissimo elenco di caratteristiche tecniche al proprio attivo, tutte a portata di mouse:</p>
<div class="codehilite"><pre><span></span><code><span class="err">- Supporto per le operazioni di base</span>
<span class="err"> -Somma</span>
<span class="err"> - Prodotto</span>
<span class="err"> - Differenza</span>
<span class="err"> - Divisione</span>
<span class="err"> - Elevazione a potenza</span>
<span class="err"> - Estrazione di radici</span>
<span class="err"> - ...</span>
<span class="err">- Funzioni scientifiche</span>
<span class="err">- Calcolo di logaritmi sia in base 10 che in base naturale</span>
<span class="err">- Calcolo di Funzioni trigonometriche</span>
<span class="err">- ...</span>
<span class="err">- Rappresentazione del risultato in diverse basi/sistemi numerici:</span>
<span class="err"> - Decimale</span>
<span class="err"> - Binario</span>
<span class="err"> - Esadecimale</span>
<span class="err"> - Ottale</span>
<span class="err"> - Sessagesimale</span>
<span class="err"> - Formato Ora</span>
<span class="err"> - Numero Romano</span>
<span class="err"> - Frazione</span>
<span class="err"> - Notazione scientifica</span>
<span class="err"> - ...</span>
<span class="err">- Calcolo di valori di verità</span>
<span class="err">- Possibilità di fare conversioni</span>
<span class="err"> - Di valuta, con aggiornamento dei tassi attuali di conversione</span>
<span class="err"> - Di unità</span>
<span class="err">- Funzioni Algebriche</span>
<span class="err"> - Risolvere un'equazione</span>
<span class="err"> - Trovare una funzione lineare</span>
<span class="err"> - ...</span>
<span class="err">- Funzioni analitiche</span>
<span class="err"> - Funzione Beta</span>
<span class="err"> - Funziona Gamma</span>
<span class="err"> - Parte Reale</span>
<span class="err"> - Parte Immaginaria</span>
<span class="err">- Funzioni di Analisi Matematica</span>
<span class="err"> - Integrazione</span>
<span class="err"> - Derivazione</span>
<span class="err"> - ...</span>
<span class="err">- Altri 15 menu pieni di funzioni utili</span>
<span class="err">- Costanti Matematiche:</span>
<span class="err"> - Pi Greco</span>
<span class="err"> - Sezione Aurea</span>
<span class="err"> - Base dei logaritmi naturali</span>
<span class="err"> - ...</span>
<span class="err">- Costanti fisiche</span>
<span class="err"> - Carica Elementare</span>
<span class="err"> - Costante di Avogadro</span>
<span class="err"> - ...</span>
<span class="err">- Altri 5 menu pieni di Variabili e costanti utili</span>
<span class="err">- 20 menu pieni di unità e prefissi utili come:</span>
<span class="err"> - Rad/s²</span>
<span class="err"> - yocto (10<sup>-24</sup>)</span>
<span class="err"> - ...</span>
</code></pre></div>
<p>E ancora tante, tantissime modalità e funzioni che rendono Qalculate! la calcolatrice desktop secondo me più completa che si possa desiderare.</p>
<p>Inoltre è possibile nascondere la tastiera a schermo e rendere Qualculate! una calcolatrice estremamente piccola pur mantenendo la sua ineguagliabile potenza</p>
<p>Qalculate! è secondo me uno strumento che non può mancare nel computer di uno studente di materie matematiche ed ingegneristiche insieme ad altri software potentissimi come WxMaxima (di cui vi ho parlato <a href="https://penazarea.altervista.org/gratis-sul-web/WxMaxima.html">in questo post</a>).</p>
<p>Pur essendo pieno di funzioni fino all'orlo, questo software è leggerissimo e parte in pochissimi istanti, nulla di diverso da un qualsiasi calcolatore per desktop.</p>
<p>Purtroppo il software non è aggiornato dal 2010, ma in ogni caso vengono rilasciate delle revisioni per mantenerlo compatibile con i sistemi moderni.</p>
<p>Se volete scaricarlo basta andare nella <a href="http://qalculate.sourceforge.net/news.html">pagina di sourceforge dedicata</a>.</p>
<p>Buon calcolo a tutti!</p>
<p>Penaz.</p>Commenti lampo in VIM con NerdCommenter2014-02-04T00:00:00+01:002014-02-04T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-04:/misc/VIM16.html<p>Presentazione di NerdCommenter, un plugin per VIM che vi consente di commentare velocemente delle righe di codice.</p><h1>Presentazione di NerdCommenter, un plugin per VIM che vi consente di commentare velocemente delle righe di codice.</h1>
<p>Buongiorno a tutti, se avete a che fare con il sistema operativo del Pinguino e usate VIM potrebbe essere necessario una volta ogni tanto, commentare rapidamente una o più righe in un file di configurazione; oppure se siete programmatori potreste aver necessità di commentare alcune righe di codice a scopo di debug.</p>
<p>Con il plugin NerdCommenter è possibile commentare con pochi gesti molte righe di codice o di file di configurazione in maniera semplice e veloce.</p>
<p>Per installare il plugin è sufficiente scaricarlo e seguire le istruzioni, su gentoo è ancora più semplice; basta dare:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge nerdcommenter</span>
</code></pre></div>
<p>Per attivarlo potrebbe essere necessario inserire la seguente riga nel vostro file di configurazione .vimrc:</p>
<blockquote>
<p>filetype plugin on</p>
</blockquote>
<p>Ora per commentare una riga è sufficiente puntarla e premere in successione i tasti:</p>
<blockquote>
<p>\c{spazio}</p>
</blockquote>
<p>Per commentare/scommentare rapidamente la riga selezionata.</p>
<p>In alcuni casi al posto del tasto "backslash" ( \ ) potrebbe essere necessario usare la virgola ( , ) a seconda del sistema operativo e del layout tastiera usato.</p>
<p>Se volete scaricare il plugin NerdCommenter per VIM è sufficiente andare sulla <a href="http://www.vim.org/scripts/script.php?script_id=1218">pagina dedicata</a></p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Pass: Un password manager minimale per linux2014-02-03T00:00:00+01:002014-02-03T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-02-03:/gratis-sul-web/Pass_Unix.html<p>Presentazione di un password manager minimale per Linux e Unix: Pass.</p><h1>Presentazione di un password manager minimale per Linux e Unix: Pass.</h1>
<p>Buongiorno a tutti, nella vostra vita informatica sicuramente avrete a che fare con più di una password; e se avete seguito i miei consigli in <a href="https://penazarea.altervista.org/misc/Password.html">questo articolo</a>, le vostre parole d'ordine segrete potrebbero non essere nemmeno semplici da ricordare. Ovviamente avere un'unica parola d'ordine per tutti i servizi è una cosa comoda ma poco sicura: se viene craccata, tutti i nostri servizi saranno a disposizione del pirata informatico di turno. E se usassimo una grossa password per proteggere tutte le altre? Ecco a cosa serve un password manager, ed oggi ve ne presento uno estremamente minimale, tanto da funzionare da linea di comando: Pass.</p>
<p>Il gestore si presenta come "The Standard Unix Password Manager" (Il manager di password standard di Unix), ed è un programma molto semplice che funziona da Linea di Comando, ogni parola d'ordine è criptata in un archivio GPG, per rendere le cose un po' più sicure, ed è possibile salvare le parole d'ordine in cartelle gerarchiche in modo da poterle richiamare più facilmente più avanti.</p>
<p>Questo gestore non salva solo parole d'ordine, ma qualsiasi testo, grazie alla modalità Multi-Linea, così potremo anche mettere al sicuro altri codici.</p>
<p>Vediamo come usarlo, iniziamo con l'installazione; su gentoo per esempio avremo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge pass</span>
</code></pre></div>
<p>Se non abbiamo mai usato GPG prima, è opportuno dare il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">gpg2 --gen-key</span>
</code></pre></div>
<p>In modo da generare i file per criptare i nostri archivi. Scegliamo una dimensione di 4096 bit per una maggiore sicurezza, diamo una bella parola d'ordine con i controfiocchi e poi mentre il vostro pc crea i file necessari, fate qualcosa. Qualiasi cosa: muovete il mouse, digitate un testo nel vostro editor, navigate in internet, giocate, fate un rendering 3d di un paesaggio naturale. Questo serve per creare sufficiente <a href="http://it.wikipedia.org/wiki/Entropia_(teoria_dell%27informazione)">entropia</a> da inserire nei file. Maggiore è l'entropia, migliori saranno gli archivi criptati.</p>
<p>Ora creiamo l'archivio con:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass init &lt;NomeArchivio&gt;</span>
</code></pre></div>
<p>Ora siamo pronti per memorizzare le nostre password, basta dare, per esempio:</p>
<div class="codehilite"><pre><span></span><code><span class="err">pass insert Azienda/fabbrica</span>
</code></pre></div>
<p>Enter password for Azienda/fabbrica:</blockquote>
Inserite la password, reinseritela quando richiesto; et voilà, la parola d'ordine è bella che memorizzata!</p>
<p>Per vederne l'elenco basta dare:</p>
<div class="codehilite"><pre><span></span><code><span class="err">pass</span>
</code></pre></div>
<blockquote>
<p>Store</p>
<p>`-- Azienda</p>
<p>` fabbrica</p>
</blockquote>
<p>Per memorizzare più informazioni oltre alla semplice parola d'ordine basta usare l'opzione -m:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass -m |nomeaccount|</span>
</code></pre></div>
<p>Con questo programma possiamo anche generare delle parole d'ordine, basta usare il comando generate:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass generate Azienda/magazzino 15</span>
</code></pre></div>
<p>genererà una parola d'ordine di 15 caratteri alfanumerici e simboli e la memorizzerà, il tutto in maniera automatica e quanto più casuale possibile.</p>
<p>Il servizio non va d'accordo con i simboli? Nessun problema, basta dare:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass generate -n Azienda/fatturazione 20</span>
</code></pre></div>
<p>E genererà una bella parola d'ordine di 20 caratteri alfanumerici senza simboli.</p>
<p>Per rimuovere una password basta usare:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass rm Azienda/VecchiaParola</span>
</code></pre></div>
<p>Infine se vogliamo richiamare una parola d'ordine è sufficiente dare il seguente comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> pass Azienda/Account</span>
</code></pre></div>
<p>Eventualmente aggiungendo l'opzione -c per poter memorizzare la parola d'ordine nella nostra memoria per 45 secondi ed in seguito farla sparire. Giusto il tempo per incollare la nostra parola d'ordine all'interno del campo e dare la conferma.</p>
<p>Fra le tante funzioni potremo anche memorizzare e richiamare password per i repository GIT, in maniera semplice e veloce.</p>
<p>Se volete ulteriori informazioni su Pass, non esitate a visitare il <a href="http://www.zx2c4.com/projects/password-store/">sito ufficiale</a></p>
<p>Buono storage a tutti!</p>
<p>Penaz.</p>Riconoscere le email truffaldine2014-01-31T00:00:00+01:002014-01-31T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-31:/misc/Email_Truffa.html<p>Un piccolo vademecum su come riconoscere una email truffaldina da una lecita.</p><h1>Un piccolo vademecum su come riconoscere una email truffaldina da una lecita.</h1>
<p>Buongiorno a tutti.Oggi voglio pubblicare un piccolo vademecum che vi aiuterà a riconoscere la maggior parte delle email truffaldine che potrebbero prima o poi capitare nella vostra casella.</p>
<p>Oltre a tutti questi consigli, come al solito è opportuna una buona dose di diffidenza, che su internet non guasta mai.</p>
<p>Per questo esempio useremo una email creata ad-hoc che vi ho riportato qui sotto:</p>
<blockquote>
<p>Da Mr. Robin Taylor ,</p>
<p>Mi aspetto che la mia lettera di incontrarvi in buona salute e il vostro
migliore stato d'animo di oggi , il mio nome è Mr. Robin Taylor ,
Assistant Manager Ubs Investment Bank London Branch . Ho deciso di cercare
una riservata cooperazione con voi in esecuzione del contratto descritto
qui - sotto per il nostro sia reciproco vantaggio e vi esorto a mantenere
il top secret a causa della natura di questa transazione . Durante la
revisione dei conti bancari in nostra banca , ho scoperto una somma totale
dei fondi non reclamati di £ 15,400 , 000.00 GBP ( Quindici milione e
quattrocentomila sterline britanniche Sterling ) in un conto che
appartiene a uno dei nostri cliente straniero in ritardo (Late Mr. Stephen
Richard ), uno scienziato americano e ingegnere che purtroppo ha perso la
vita e la famiglia in un incidente d'auto mortale .</p>
<p>Dopo aver attraversato il suo fascicolo personale nella mia banca , ho
scoperto che è morto senza eredi specifico per questi fondi . Volentieri
cerco il vostro consenso , per presentarvi quale il parente più prossimo /
erede del defunto in modo che i proventi di questo account per un valore
di £ 15,400 , 000.00 GBP sarà rilasciato a voi come beneficiario , che vi
verranno comunicate in rapporto percentuale al 60% per me e per il 40 % a
voi , rispettivamente . Tutto quello che chiedo è la vostra massima leale
collaborazione , la fiducia e la massima riservatezza per realizzare
questo progetto con successo . Ho lavorato con attenzione le modalità per
l'esecuzione di questa operazione in regime di legittima per proteggere
l'utente da qualsiasi violazione della legge , sia nel vostro Paese e qui
in Inghilterra quando il fondo viene trasferito al vostro conto bancario .
Dopo la vostra considerazione e l'accettazione di questa offerta , vi
prego di inviarmi subito le seguenti informazioni .</p>
<ul>
<li>Il vostro nome completo ,</li>
<li>Il tuo Indirizzo di contatto</li>
<li>Il vostro diretta numero di telefono cellulare .</li>
<li>La data di nascita</li>
</ul>
<p>Così posso inviare i dati del nostro database banca a comparire nel
sistema bancario che si sta nominato il parente più prossimo / erede
beneficiario del fondo , e poi io guiderò la vostra comunicazione con Ubs
Investment Bank per il rilascio immediato e il trasferimento del fondo per
voi , io aspetto la tua risposta immediata alla mia e-mail privata :
robin_ttt1@hotmail.com , così possiamo iniziare subito l'operazione .</p>
<p>Grazie in apprezzamento e attesa della vostra risposta urgente .</p>
<p>Cordiali saluti ,</p>
<p>Mr. Robin Taylor
Assistant Manager Ubs Investment Bank.
Numero di cellulare : +447024053928
E- mail:robin_ttt1@hotmail.com</p>
</blockquote>
<p>Ovviamente questo è un esempio esagerato, ma i truffatori possono essere molto più abili e subdoli di così.</p>
<p>Ora analizzeremo per bene tutte le caratteristiche che la rendono una email truffaldina.</p>
<h2>La forma</h2>
<p>Per prima cosa vediamo come inizia la lettera:</p>
<blockquote>
<p>Da Mr. Robin Taylor</p>
</blockquote>
<p>Sicuramente non è il modo ideale di iniziare una lettera e questo dovrebbe già metterci in allarme, ma immaginate quella che sembra una email dalla vostra banca che inizia con</p>
<blockquote>
<p>Gentile cliente,</p>
</blockquote>
<p>Oppure</p>
<blockquote>
<p>Gentile Signore/a,</p>
</blockquote>
<p>Solitamente le banche e le aziende come PayPal usano gli estremi lasciati durante la sottoscrizione del contratto, quindi una apertura non truffaldina sarebbe una cosa del tipo</p>
<blockquote>
<p>Gentile |nome| |cognome|,</p>
</blockquote>
<p>Sicuramente una lettera che non inizia secondo i canoni tradizionali di una lettera dovrebbe insospettirci non poco.</p>
<h2>La grammatica</h2>
<p>La maggior parte delle email truffaldine viene tradotta con l'ausilio di traduttori automatici e perciò risulta sgrammaticata in maniera anche buffa, prendiamo per esempio:</p>
<blockquote>
<p>ho scoperto una somma totale
dei fondi non reclamati di £ 15,400 , 000.00 GBP ( <span style="color: #ff0000;">Quindici milione</span> e
quattrocentomila sterline britanniche <span style="color: #ff0000;">Sterling</span> ) in un conto che
appartiene a uno dei nostri cliente straniero<span style="color: #ff0000;"> in ritardo</span> (<span style="color: #ff0000;">Late</span> Mr. Stephen
Richard ),</p>
</blockquote>
<p>Il primo errore è evidente, la dicitura corretta sarebbe "quindici<strong> milioni</strong>"; il secondo invece, per coloro che conoscono l'inglese è una ripetizione dato che Sterling si traduce in italiano con Sterlina.</p>
<p>Il terzo errore è "in ritardo", per cosa? Per il bus, per venire a casa? Io sono un tipo paziente e posso aspettare anche una buona mezzora. Ma soprattutto la seconda ripetizione con Late (in ritardo).</p>
<p>In realtà probabilmente per "late" si intende "defunto". Quindi è molto probabilmente la classica truffa del cliente o riccone defunto senza eredi.</p>
<p><strong>Allenatevi a trovare le altre sgrammaticature</strong></p>
<h2>L'oggetto e la richiesta</h2>
<p>Come è evidente dalla email, l'oggetto non è dei più leciti, legali, etici o sensati: dividere il contenuto di un conto corrente di un morto per ricavarne un beneficio personale e soprattutto farlo con una persona che non si conosce nemmeno.</p>
<p>Più avanti nella mail possiamo vedere anche cosa ci viene rischiesto per entrare in possesso del nostro "malloppo":</p>
<blockquote>
<p>Dopo la vostra considerazione e l'accettazione di questa offerta , vi
prego di inviarmi subito le seguenti informazioni .</p>
<ul>
<li>Il vostro nome completo ,</li>
<li>Il tuo Indirizzo di contatto</li>
<li>Il vostro diretta numero di telefono cellulare .</li>
<li>La data di nascita</li>
</ul>
</blockquote>
<p>Che corrisponde esattamente a tutto il materiale necessario per un furto d'identità in piena regola.</p>
<p>Delle truffe più fini sono quelle dell'"aggiornamento dati" nelle quali venite incitati a cliccare su un link per entrare nella pagina della vostra banca e riattivare tutti i servizi. Se volete farlo, <strong>digitate manualmente l'indirizzo della vostra banca nel browser e non seguite il link</strong>, nel caso vi fosse veramente necessità dei vostri dati sarà scritto nella home page della vostra banca.</p>
<h2>La testata</h2>
<p>Per i più smanettoni è possibile vedere l'header della email e verificare eventuali incongruenze, immaginiamo un header del genere:</p>
<blockquote>
<p>Return-Path: robin.t1@hotmail.com</p>
<p>Received: from |indirizzo| (192.xxx.xx.116) by |indirizzo| (8.xxx.xxx.22)</p>
<p>id 52E87465001BF2CF for ||indirizzo destinatario||; Thu, 30 Jan 2014 20:16:31 +0100</p>
<p>Received: from |indirizzo| (EHLO |indirizzo|) ([192.xxx.xxx.164])</p>
<p>by |indirizzo|</p>
<p>with ESMTP id YFF69486;</p>
<p>Thu, 30 Jan 2014 20:16:18 +0100 (CET)</p>
<p>Authentication-Results: |indirizzo|; dkim=neutral (message not signed) header.i=none</p>
<p>Received-SPF: SoftFail identity=mailfrom; client-ip=198.xx.xxx.134;</p>
<p>receiver=|indirizzo|;</p>
<p>envelope-from="robin.t1@hotmail.com";</p>
<p>x-sender="robin.t1@hotmail.com";</p>
<p>x-conformance=spf_only;</p>
<p>x-record-type="v=spf1"</p>
<p>X-LREMOTE-IP: 198.xx.xxx.134</p>
<p>Received: from xxx.hoxxxxxxika.org ([198.xx.xxx.134])</p>
<p>by |indirizzo| with ESMTP; 30 Jan 2014 18:31:53 +0000</p>
<p>Received: from localhost ([127.0.0.1]:37178 helo=jhupas.com)</p>
<p>by xxx.hoxxxxxxika.org with esmtpa (Exim 4.82)</p>
<p>(envelope-from |robin.t1@hotmail.com|)</p>
<p>id 1W8wOD-00057s-DC; Thu, 30 Jan 2014 11:31:01 -0700</p>
<p>Received: from 41.xxx.xxx.138 ([41.xxx.xxx.138])</p>
<p>(SquirrelMail authenticated user kxxxxxxxxxxxxe@jhupas.com)</p>
<p>by jhupas.com with HTTP;</p>
<p>Thu, 30 Jan 2014 11:31:01 -0700</p>
<p>Message-ID: |2dff8dbdd55321fff27578e7ac8a3e44.squirrel@jhupas.com|</p>
<p>Date: 30/01/2014 19.31</p>
<p>Subject: Da Mr. Robin Taylor ,</p>
<p>From: "Mr. Robin Taylor" |robin.t1@hotmail.com|</p>
<p>Reply-To: robin_ttt1@hotmail.com</p>
<p>User-Agent: SquirrelMail/1.4.22</p>
<p>MIME-Version: 1.0</p>
<p>Content-Type: text/plain;charset=iso-8859-1</p>
<p>Content-Transfer-Encoding: 8bit</p>
<p>X-Priority: 3 (Normal)</p>
<p>Importance: Normal</p>
<p>X-AntiAbuse: This header was added to track abuse, please include it with any abuse report</p>
<p>X-AntiAbuse: Primary Hostname - hos.hoxxxxxxika.org</p>
<p>X-AntiAbuse: Original Domain - |dominio|</p>
<p>X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12]</p>
<p>X-AntiAbuse: Sender Address Domain - hotmail.com</p>
<p>X-Get-Message-Sender-Via: xxx.hoxxxxxxika.org: authenticated_id: kxxxxxxxxxxxxe@jhupas.com</p>
<p>X-Junkmail-Status: score=38/55, host=|indirizzo|</p>
<p>X-Junkmail-Signature-Raw: score=suspect(3),</p>
<p>refid=str=0001.0A0C0205.52EAA50E.011C,ss=2,re=0.000,fgs=0,</p>
<p>ip=198.xx.xxx.134,</p>
<p>so=2011-06-21 16:49:39,</p>
<p>dmn=2011-06-08 23:29:05,</p>
<p>mode=multiengine</p>
<p>X-Junkmail-IWF: false</p>
<p>X-Mirapoint-Virus-RAPID-Raw: score=unknown(0),</p>
<p>refid=str=0001.0A0C0205.52EAA50E.011C,ss=2,re=0.000,fgs=0,</p>
<p>ip=198.xx.xxx.134,</p>
<p>so=2011-06-21 16:49:39,</p>
<p>dmn=2011-06-08 23:29:05</p>
<p>X-Mirapoint-Loop-Id: f2b1bb9fe6ca62f6b32ddcc3759bbff0</p>
<p>X-libjamoibt: 258</p>
</blockquote>
<p>Prima cosa: dato che l'indirizzo da cui "è partito" il messaggio fa parte di hotmail, ci conviene verificare come il nostro Taylor si è autenticato sul server:</p>
<blockquote>
<p>From: "Mr. Robin Taylor" robin.t1@hotmail.com</p>
<p>[...]</p>
<p>(SquirrelMail authenticated user kxxxxxxxxxxxxe@jhupas.com)</p>
</blockquote>
<p>E qui abbiamo una prima incongruenza, solitamente un utente si autentica sul server con lo stesso indirizzo con cui invia la mail.</p>
<p>Il nostro Taylor dice di essere Inglese, quindi vediamo per dove è rimbalzata l'email, analizzando a ritroso tutte le righe "received from":</p>
<blockquote>
<p>Received: from |indirizzo| (192.xxx.xx.116) by |indirizzo| (8.xxx.xxx.22)</p>
<p>id 52E87465001BF2CF for ||indirizzo destinatario||; Thu, 30 Jan 2014 20:16:31 +0100</p>
<p>Received: from |indirizzo| (EHLO |indirizzo|) ([192.xxx.xxx.164])</p>
<p>by |indirizzo|</p>
<p>[...]</p>
<p>Received: from xxx.hoxxxxxxika.org ([198.xx.xxx.134])</p>
<p>by |indirizzo| with ESMTP; 30 Jan 2014 18:31:53 +0000</p>
<p>Received: from localhost ([127.0.0.1]:37178 helo=jhupas.com)</p>
<p>by xxx.hoxxxxxxika.org with esmtpa (Exim 4.82)</p>
<p>[...]</p>
<p>Received: from 41.xxx.xxx.138 ([41.xxx.xxx.138])</p>
<p>(SquirrelMail authenticated user kxxxxxxxxxxxxe@jhupas.com)</p>
</blockquote>
<p>E vedremo che, per esempio l'email è partita dalla Nigeria, rimbalzando per un server Americano per poi arrivare a noi. E qui di Inghilterra neanche l'ombra.</p>
<p>Alcuni server forniscono delle informazioni anti abuso, più semplici da leggere:</p>
<blockquote>
<p>X-AntiAbuse: This header was added to track abuse, please include it with any abuse report</p>
<p>X-AntiAbuse: Primary Hostname - xxx.hoxxxxxxika.org</p>
<p>X-AntiAbuse: Original Domain - |dominio|</p>
<p>X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12]</p>
<p>X-AntiAbuse: Sender Address Domain - hotmail.com</p>
</blockquote>
<p>Come possiamo vedere l'hostname primario da dove è partita la mail non ha a che fare con hotmail o l'inghilterra.</p>
<p>Questo è quanto...</p>
<p>Buona analisi forense a tutti!</p>
<p>Penaz.</p>Creiamo e Modifichiamo i File DWG con DraftSight2014-01-30T00:00:00+01:002014-01-30T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-30:/gratis-sul-web/DraftSight.html<p>Vediamo come creare, aprire e modificare i file CAD in formato DWG con DraftSight.</p><h1>Vediamo come creare, aprire e modificare i file CAD in formato DWG con DraftSight.</h1>
<p>Buongiorno a tutti, nonostante la massiccia presenza di ottimi software per il Computer Aided Design (CAD), purtroppo non è possibile aprire il formato proprietario DWG. Da 3DS, creatori di SolidWorks, arriva DraftSight, un ottimo software CAD che permette di aprire, creare e modificare i file con estensione DWG.</p>
<p>Il software richiede una registrazione (per la licenza standalone) gratuita via internet e funziona sui computer Windows, Linux e MacOS.</p>
<p>Se volete scaricare il software lo troverete nella sezione <a href="https://penazarea.altervista.org/Software_Graphics.html">grafica dei software suggeriti</a>, insieme ad altri software CAD estremamente validi.</p>
<p>In alternativa potete scaricarlo direttamente dal <a href="http://www.3ds.com">sito di 3DS</a>, nella <a href="http://www.3ds.com/it/prodotti-e-servizi/draftsight/">pagina dedicata al software</a></p>
<p>Buona progettazione a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>GBrainy: Teniamo in allenamento il cervello2014-01-28T00:00:00+01:002014-01-28T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-28:/gratis-sul-web/GBrainy.html<p>Teniamo in allenamento il nostro cervello divertendoci con i giochi di GBrainy.</p><h1>Teniamo in allenamento il nostro cervello divertendoci con i giochi di GBrainy.</h1>
<p>Buongiorno a tutti, oggi voglio presentarvi GBrainy: un piccolo compendio di mini giochi con i quali potrete mettere alla prova le vostre capacità cerebrali divertendovi.</p>
<p>I giochi / test di GBrainy sono divisi in sezioni, precisamente:</p>
<ul>
<li><strong>Logica:</strong> Giochi pensati per mettere alla prova il vostro pensiero ragionato;</li>
<li><strong>Calcolo Mentale:</strong> Operazioni aritmetiche pensate per mettere alla prova le vostre capacità di calcolo mentale;</li>
<li><strong>Esercizi di memoria:</strong> Esercizi pensati per mettere alla prova la vostra memoria a breve termine;</li>
<li><strong>Analogie Verbali:</strong> Esercizi costruiti per mettere alla prova le vostre capacità verbali.</li>
</ul>
<p>Inoltre GBrainy mette a disposizione un sistema di regolazione della difficoltà, rendendo il gioco / programma adatto a bambini, adulti e persone di terza età; inoltre è possibile espandere abbastanza facilmente il numero di giochi compresi con un sistema basato su XML.</p>
<p>Fra le altre caratteristiche di GBrainy troviamo:</p>
<ul>
<li>Possibilità di passaggio dalla modalità finestra a schermo intero e viceversa;</li>
<li>Statistiche storiche per giocatore e per area di esercizio;</li>
<li>Record personali del giocatore;</li>
<li>Suggerimenti per il giocatore sulle aree da migliorare.</li>
</ul>
<p>Il gioco è quasi totalmente tradotto in Italiano, secondo le statistiche del sito è tradotto al 90% in Italiano, inoltre è completamente Open Source perciò potrete contribuire con pezze per i bachi del programma, con traduzioni o con idee per nuovi giochi da inserire; ogni aiuto è ben apprezzato.</p>
<p>Il software è disponibile per sistemi Linux/Unix e Windows, se volete iniziare subito a giocare potete scaricare il pacchetto adatto al vostro sistema operativo dalla <a href="https://wiki.gnome.org/action/show/Apps/gbrainy?action=show&redirect=gbrainy">pagina ufficiale del Wiki</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Magic SysRq non funziona? Vediamo che succede.2014-01-25T00:00:00+01:002014-01-25T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-25:/misc/MagicSysRq2.html<p>Scopriamo perché la Magic SysRq potrebbe non funzionare su alcuni sistemi.</p><h1>Scopriamo perché la Magic SysRq potrebbe non funzionare su alcuni sistemi.</h1>
<p>Buongiorno a tutti, a volte può capitare che il vostro sistema Linux incorra in qualche blocco, se avete letto il mio <a href="https://penazarea.altervista.org/misc/MagicSysReq.html">articolo riguardante la Magic SysRq</a> sapete che non tutto è perduto e che potete usare la combinazione ALT+RSYS+lettera per dialogare a tu per tu col kernel linux e salvare quanto più possibile.</p>
<p>Ci sono certi sistemi in cui però la combinazione di tasti magica conosciuta come Magic SysRq non funziona. Vediamo perchè.</p>
<h3>Ho il tasto SysRq, ma la combinazione non sortisce alcun effetto</h3>
<p>Probabilmente la Magic SysRq è disabilitata, in un terminale dai:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cat /proc/sys/kernel/sysrq</span>
</code></pre></div>
<p>se restituisce zero allora la Magic SysRq è disabilitata, riattivala nel kernel.</p>
<h3>Non trovo il tasto SysRq!!</h3>
<p>Solitamente il tasto SysRq è conosciuto anche con i nomi più comuni di Stamp, Stamp/RSys, Stamp/Sysrq, PrintScr o PrintSc</p>
<h3>La funzione di Magic SysRq è attiva nel kernel, ma le combinazioni di tasti non sortiscono alcun effetto.</h3>
<p>Questo è uno dei casi peggiori. Probabilmente il tasto di Richiesta di Sistema (SysRq) è nascosto da qualche parte. Per trovarlo apri un terminale e da root digita:</p>
<div class="codehilite"><pre><span></span><code><span class="err">showkey -k</span>
</code></pre></div>
<p>Ora prova a vedere quale tasto o combinazione di tasti restituisce il codice "99" alla pressione (non al rilascio), nel mio caso era FN+Canc. ShowKey si chiude da solo dopo 10 secondi che non riceve alcun input da tastiera.</p>
<h3>Non riesco a trovare la combinazione di tasti esatta con ShowKey.</h3>
<p>Questo è il caso peggiore: la combinazione di tasti non esiste.In tal caso dovremo inventarcela. Decidi un tasto/combinazione di tasti che vuoi elevare al grado di SysRq, dopodichè da root avvia</p>
<div class="codehilite"><pre><span></span><code><span class="err">showkey -s</span>
</code></pre></div>
<p>e prendi nota dei codici (scancodes) usciti dalla pressione dei tasti. Dopodichè usa il programma setkeycodes per collegare gli scancodes al keycode della SysRq, per esempio se sono usciti i codici 0x73 e 0x52:</p>
<div class="codehilite"><pre><span></span><code><span class="err">setkeycodes 7352 99</span>
</code></pre></div>
<p>è facile capire che il primo argomento è dato dai codici usciti dal comando precedente senza lo 0x iniziale mentre il secondo argomento è il keycode della SysRq, che è sempre 99. Tale operazione dovrà essere effettuata ad ogni avvio, perciò sarebbe opportuno metterla nello script di avvio del tuo sistema operativo.</p>
<p>Purtroppo tanti produttori stanno pian piano eliminando il tasto di SysRq dai propri prodotti di fascia consumer, dato che sotto il sistema operativo con finestrelle (ed ora anche piastrelle) non ha gran senso; ma nel sistema operativo del pinguino tale tastino può risparmiare molti mal di testa.</p>
<p>Ora sapete come investigare nel caso abbiate qualche problema con la combinazione di tasti della Magic SysRq.</p>
<p>Buona investigazione a tutti!</p>
<p><strong>Appena avete trovato la vostra combinazione di tasti, scrivetela da qualche parte in modo da averla a disposizione quando serve, ad esempio sul lato del case o nella parte inferiore del vostro laptop.</strong></p>
<p>Saluti!</p>
<p>Penaz.</p>Capi City: Il monopoly informatico gratuito2014-01-24T00:00:00+01:002014-01-24T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-24:/gratis-sul-web/Capi_City.html<p>Giochiamo al celeberrimo gioco del monopoly sul nostro computer con Capi City.</p><h1>Giochiamo al celeberrimo gioco del monopoly sul nostro computer con Capi City.</h1>
<p>Buongiorno a tutti, se vi piace il gioco del Monopoly non potete non provare Capi City (prima era chiamato Capitalism). Capi City vi permette di giocare al vostro gioco da tavolo preferito sul vostro computer Windows o Linux sia in locale che online, grazie al supporto per i server <a href="http://sourceforge.net/projects/monopd/">monopd</a></p>
<p>Fra le caratteristiche salienti del programma troviamo:</p>
<ul>
<li>Supporto completo ai server MonoPd versione 0.9.3</li>
<li>Lingue disponibili:<ul>
<li>Inglese</li>
<li>Tedesco</li>
<li>Russo</li>
</ul>
</li>
<li>Possibilità di lancio automatico dei dadi</li>
<li>Possibilità di chattare con gli altri giocatori usando anche delle emoticon</li>
<li>Possibilità di usare un avatar personalizzato con Capid</li>
</ul>
<p>Quindi se volete passare una serata diversa con i vostri amici fisicamente più lontani potete montare in maniera veloce un server monopd e giocare tutti assieme al celeberrimo gioco del Monopoly!</p>
<p>Se volete scaricarlo seguite <a href="http://sourceforge.net/projects/capitalism/">questo link</a></p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>Registriamo le nostre sessioni di terminale con Asciinema2014-01-21T00:00:00+01:002014-01-21T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-21:/gratis-sul-web/Asciinema.html<p>Dimenticate programmi di registrazione e video sfocati di terminali incomprensibili, registrate il vostro terminale nel modo giusto con Asciinema.</p><h1>Dimenticate programmi di registrazione e video sfocati di terminali incomprensibili, registrate il vostro terminale nel modo giusto con Asciinema.</h1>
<p>Buongiorno a tutti, a volte può risultare utile registrare una sessione di terminale di Linux per poterla pubblicare sul web, mandarla ad un amico o collega, oppure, se siete dei docenti, per presentarla ai vostri studenti; in tal caso viene in vostro aiuto Asciinema.</p>
<p>Il problema dei classici programmi di registrazione del desktop è dato soprattutto dal rapporto qualità/dimensione del video, così per avere un video leggero siete costretti a sacrificare la qualità, a volte il video può divenire talmente incomprensibile o pesante da costringervi a rinunciare.</p>
<p>Bene, Asciinema è stato creato proprio per creare degli ASCIIcast (contrazione di ASCII Screencast) e vi permette di registrare le vostre sessioni di terminale in maniera veloce, comoda e alla massima qualità possibile.</p>
<p>Asciinema prende ispirazione dai programmi <em>script/scriptreplay</em> e si basa sui principi alla base di altri programmi come <em>screen</em> per la creazione e gestione di pseudo-terminali; l'approccio di Asciinema è completamente testuale perciò i file risultanti sono ridicolosamente leggeri ed in più è possibile caricare gli ASCIIcast direttamente sul sito, così da poterli condividere.</p>
<p>Se volete registrare il vostro terminale non vi resta che andare sul <a href="http://asciinema.org/">Sito ufficiale</a> e seguire le semplicissime istruzioni a video, anch'esse registrate su ASCIIcast.</p>
<p>Il tutto funziona tranquillamente sotto Linux, FreeBSD e Mac OS X.</p>
<p>Buona registrazione a tutti!</p>
<p>Penaz.</p>Impariamo a programmare con Scratch2014-01-16T00:00:00+01:002014-01-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-16:/gratis-sul-web/Scratch.html<p>Conosciamo Scratch, un ambiente online in cui potremo programmare facilmente piccoli giochi, storie ed animazioni.</p><h1>Conosciamo Scratch, un ambiente online in cui potremo programmare facilmente piccoli giochi, storie ed animazioni.</h1>
<p>Buongiorno, spesso programmare viene considerata un'arte non semplice da imparare e perciò la scelta del linguaggio di programmazione con cui iniziare è sempre una scelta complessa. Python, Visual Basic e Pascal sono linguaggi molto gettonati ed hanno una sintassi abbastanza semplice, ma bisogna pur sempre impararla prima di poter essere introdotti ai concetti base della programmazione; con Scratch potremo "programmare senza programmare"</p>
<p>Scratch è un ambiente di programmazione con cui potremo creare piccoli giochi, animazioni e storie animate semplicemente connettendo dei piccoli pezzi di puzzle in maniera completamente grafica.</p>
<p>Scratch contiene al suo interno tutti i paradigmi più classici della programmazione:</p>
<ul>
<li>Azioni singole</li>
<li>Cicli</li>
<li>Condizionali If/then/else</li>
<li>Molto altro.</li>
</ul>
<p>Con scratch possiamo anche comporre piccole canzoncine e tutto quello che ci è concesso dalla nostra fantasia, in maniera semplice, veloce e senza alcuna fatica.</p>
<p>Se volete provare Scratch non vi resta che andare sulla <a href="http://scratch.mit.edu/">pagina dedicata nel sito del MIT</a> e fare click su "Try it out!" e vi ritroverete immediatamente catapultati nell'ambiente di programmazione con un assistente sulla destra che vi guiderà passo passo nel vostro primo esperimento di programmazione / animazione / composizione / disegno / ...</p>
<p>Inoltre è possibile provare i progetti della comunità e vederne il "codice sorgente", così da prendere qualche spunto per i vostri prossimi progetti.</p>
<p>Vi lascio con un link ad un <a href="http://vimeo.com/65583694">coloratissimo video di presentazione</a></p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>7 Days: Un'avventura horror gratuita2014-01-10T00:00:00+01:002014-01-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2014-01-10:/gratis-sul-web/7Days.html<p>Conosciamo una fantastica avventura horror in prima persona gratuita: 7 Days.</p><h1>Conosciamo una fantastica avventura horror in prima persona gratuita: 7 Days.</h1>
<p>Buongiorno a tutti, molte avventure horror gratuite sono poco appetibili e molto brevi, soprattutto quelle in prima persona; 7 Days è un'eccezione, un gioco che non si incentra sulla grafica che ricorda molto da vicino i primi giochi in 3D o, per chi è più giovane: Minecraft. Il gioco preferisce un approccio più psicologico giocando con i pensieri del giocatore in tutti i modi possibili.</p>
<p>Il gioco, che viene descritto più come un'esperienza, è suddiviso in 7 giorni; ognuno con un proprio preciso significato e lo scopo del gioco è quello di riuscire a capire cosa sta succedendo all'interno di una casa in cui il giocatore si sveglia senza saperne il motivo.</p>
<p>Il campo di visione è molto molto molto stretto, come se stessimo guardando attraverso un telescopio e ciò rende i corridoi, già di per sè stretti, ancora più claustrofobici.</p>
<p>Un gioco che vi farà sicuramente saltare sulla sedia qualche volta, ma che si basa più che altro sulla tensione e su giochi mentali che fanno sentire il giocatore ancora più disorientato e impaurito.</p>
<p>Il gioco è stato scritto da un team di programmatori Italiani con Game Maker studio (di cui vi ho parlato <a href="https://penazarea.altervista.org/gratis-sul-web/GameMakerStudio.html">qui</a>) e la traduzione in inglese è stata assistita dal team di Enigma-Dev (di cui vi ho parlato in <a href="https://penazarea.altervista.org/gratis-sul-web/Enigma_Dev.html">questo articolo</a>) e merita decisamente una partitina.</p>
<p>Se volete provarlo potete scaricarlo da <a href="http://www.indiedb.com/games/7days">IndieDB</a>.</p>
<p>Buon divertimento a tutti e saluti!</p>
<p>Penaz.</p>7 browser web per Linux che potreste non conoscere2013-12-23T00:00:00+01:002013-12-23T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-23:/misc/Browsers.html<p>Conosciamo 7 fantastici browser web per linux: leggeri, veloci e gratuiti.</p><h1>Conosciamo 7 fantastici browser web per linux: leggeri, veloci e gratuiti.</h1>
<p>Buongiorno a tutti, quando si arriva alla navigazione su internet la scelta ricade sempre sui soliti noti: Firefox, IE, Chrome, ecc... Ma esistono tantissimi browser altrettanto funzionali, e magari anche più leggeri, da provare: eccone alcuni.</p>
<h3>Konqueror</h3>
<p>Un ottimo browser facente parte della suite KDE e basato sul motore KHTML, da cui è nato il ben più famoso WebKit che fa funzionare browser come Safari. Il funzionamento è veloce anche se il rendering delle pagine web a volte lascia un pochino a desiderare, ma è possibile cambiare il motore di rendering ed usare il più evoluto Webkit. La particolarità di questo browser è che funziona anche come file manager e visualizzatore universale.</p>
<p>Se volete avere più informazioni su Konqueror: <a href="http://www.konqueror.org/">Link</a></p>
<h3>Surf</h3>
<p>Dire che Surf è un browser minimale è dire poco, estremamente veloce ma leggermente scarno per quanto concerne le caratteristiche, ad esempio non è provvisto di navigazione a schede. Alcuni potrebbero trovarlo scomodo, altri potrebbero dire che "aiuta a mantenere la concentrazione", in ogni caso merita almeno di essere menzionato.</p>
<p>Se volete alcune informazioni in più: <a href="http://surf.suckless.org/">Link</a></p>
<h3>Lynx</h3>
<p>Questo applicativo è di per sè molto particolare, dato che è un browser testuale funzionante da linea di comando, ciò è importante nel caso abbiate assolutamente bisogno di navigare ma il vostro X non funziona. Ottimo per leggere le JavaDocs senza lasciare la vostra amata console.</p>
<p>Per maggiori informazioni: <a href="http://lynx.browser.org/">Link</a></p>
<h3>Midori</h3>
<p>Il piccolo browser che vi stupirà, basato su webkit è estremamente veloce e semplice da usare ma non per questo scarno di funzioni, provvisto di navigazione a schede, supporto per plugins, e molto molto altro.</p>
<p>Per altre informazioni visitate il sito web: <a href="http://midori-browser.org/">Link</a></p>
<h3>Vimprobable2</h3>
<p>Appassionati di VIM Unitevi! Un browser basato su webkit che ricalca il famosissimo editor modale. Veloce e minimale. Da provare.</p>
<p>Per altre informazioni: <a href="http://sourceforge.net/apps/trac/vimprobable/">Link</a></p>
<p><strong>ATTENZIONE: Sembra che questo applicativo sia stato discontinuato</strong></p>
<h3>DWB</h3>
<p>Si presenta semplicemente come "basato su webkit" ma è decisamente veloce, minimale e lascia tantissimo spazio per la visualizzazione delle pagine web, presenta tutti i crismi di un browser più avanzato come</p>
<ul>
<li>navigazione a schede</li>
<li>supporto per plugin (Tramite dwbem)</li>
<li>navigazione privata</li>
<li>possibilità di cambiare l'user-agent</li>
<li>preferiti</li>
</ul>
<p>Per inciso è l'applicativo da cui scrivo la maggior parte dei miei articoli, anche questo ha scorciatoie simili a VIM.</p>
<p>Per provarlo o avere maggiori informazioni: <a href="https://portix.bitbucket.org/">Link</a></p>
<p><strong>Aggiornamento: DWB è ora un progetto praticamente abbandonato, il mio browser preferito è <a href="https://www.qutebrowser.org">QuteBrowser</a>, scritto in Python e presto sarà basato su QTWebEngine, un port QT di Blink, il motore di Google Chrome</strong></p>
<h3>Luakit</h3>
<p>Si presenta come "Il browser per chi ha decisamente troppo tempo tra le mani" è basato su WebKit completamente personalizzabile in ogni proprio aspetto sia esso estetico o comportamentale. Il tutto può essere personalizzato tramite il linguaggio Lua, semplicissimo da imparare.</p>
<p>Purtroppo non viene aggiornato da molto tempo, spero di vedere rifiorire il progetto molto presto.</p>
<p>Per informazioni: <a href="http://mason-larobina.github.io/luakit/">Link</a></p>
<p>E questo è quanto, buona navigazione a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>Pygame: Un esempio di Platform di base2013-12-18T00:00:00+01:002013-12-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-18:/coding/Pointless_Platformer.html<p>Un esempio della costruzione di un gioco a piattaforme estremamente basilare in Python e PyGame: Pointless Platformer!!</p><h1>Un esempio della costruzione di un gioco a piattaforme estremamente basilare in Python e PyGame: Pointless Platformer!!</h1>
<p>Buongiorno a tutti, dopo diverso tempo ho deciso di riprendere in mano pygame (<a href="http://www.pygame.org/news.html">sito ufficiale</a>) e provare a costruire un piccolo gioco a piattaforme, con tutti i problemi che ne derivano. Alla fine di tutto sono uscito con questo esempio molto condensato che spero sia utile a chi un giorno si ritrovasse con la voglia di programmare per davvero (senza strumenti come GameMaker o Game Editor) un videogioco.</p>
<p>Questo gioco non ha alcun obiettivo (per questo è Pointless) ma ha tutte le caratteristiche di un gioco a piattaforme:</p>
<ul>
<li>Simulazione della gravità (senza velocità terminale, anche se è semplice aggiungerla)</li>
<li>Collisioni con i blocchi delle piattaforme</li>
<li>Movimento del personaggio in tutte le direzioni, salti compresi</li>
<li>Una piccola routine per costruire i livelli (a partire da una lista di "#")</li>
</ul>
<p>Il codice è ampiamente commentato nella gran parte delle proprie sezioni e, diversamente da altri miei progetti come <a href="https://penazarea.altervista.org/coding/Pygame_Shooter_02_Beta.html">Primitive Shooter</a> è scritto in Python3.</p>
<p>Se volete provarlo ed annoiarvi un pochino i pulsanti sono semplicemente:</p>
<ul>
<li>Freccia Destra > Vai a destra</li>
<li>Freccia Sinistra > Vai a sinistra</li>
<li>Freccia Su > Salta</li>
</ul>
<p>Per uscire dal gioco è sufficiente chiudere la finestra di pygame.</p>
<p><strong>Attenzione: </strong>*A causa di un baco di Pygame se avviate il gioco con IDLE (L'editor di Python usato soprattutto sotto windows) vi ritroverete con l'editor bloccato se chiuderete la finestra di pygame, in tal caso è sufficiente inserire la riga</p>
<blockquote>
<p>pygame.quit()</p>
</blockquote>
<p>prima di quit()</p>
<p>in modo da ottenere:</p>
<div class="codehilite"><pre><span></span><code><span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span><span class="o"></</span><span class="n">p</span><span class="o">></span>
</code></pre></div>
<p>Il gioco sta comodamente entro le 150 righe, commenti compresi, ecco il codice:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="c1">#Imports</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">pygame.locals</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">exit</span>
<span class="c1">#Inizializziamo Pygame, schermo e clock</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="n">screen</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">),</span><span class="mi">0</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_caption</span><span class="p">(</span><span class="s2">"Pointless Platformer!!"</span><span class="p">)</span>
<span class="n">clock</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span>
<span class="sd">"""Creiamo i 2 principali gruppi di sprites: le sprites da disegnare in generale</span>
<span class="sd">e le piattaforme, in un gruppo separato per poter usare le funzioni di collisione"""</span>
<span class="n">todraw</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">plats</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="c1">#Classe per la creazione delle piattaforme</span>
<span class="k">class</span> <span class="nc">Platform</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">plats</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">))</span>
<span class="c1">#Classe giocatore</span>
<span class="k">class</span> <span class="nc">Player</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">onground</span><span class="o">=</span><span class="kc">False</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="mi">20</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="mi">20</span>
<span class="n">todraw</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="n">xcoll</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span>
<span class="n">ycoll</span><span class="p">()</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="p">,</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">))</span>
<span class="sd">""" Le collisioni vengono calcolate separatamente sull'asse x ed y</span>
<span class="sd">altrimenti il nostro personaggio sembrerà teletrasportarsi"""</span>
<span class="k">def</span> <span class="nf">xcoll</span><span class="p">():</span>
<span class="n">collision</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="n">player</span><span class="p">,</span> <span class="n">plats</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">collision</span><span class="p">:</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">right</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">left</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o"><</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">left</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">right</span>
<span class="k">def</span> <span class="nf">ycoll</span><span class="p">():</span>
<span class="n">collision</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="n">player</span><span class="p">,</span> <span class="n">plats</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
<span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="o">=</span><span class="kc">False</span>
<span class="k">for</span> <span class="n">block</span> <span class="ow">in</span> <span class="n">collision</span><span class="p">:</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="o">=</span><span class="kc">True</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o"><</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">top</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">bottom</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span> <span class="c1">#serve per evitare l'impressione che il giocatore si "appiccichi" al soffitto</span>
<span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="o">=</span><span class="kc">False</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">bottom</span><span class="o">=</span><span class="n">block</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">top</span>
<span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="o">=</span><span class="kc">True</span>
<span class="sd">"""Una semplice routine per costruire il livello, ogni "#" corrisponde</span>
<span class="sd">ad un blocco 20x20 pixel di terreno/piattaforma"""</span>
<span class="k">def</span> <span class="nf">build</span><span class="p">():</span>
<span class="n">myx</span><span class="o">=</span><span class="mi">0</span>
<span class="n">myy</span><span class="o">=</span><span class="mi">0</span>
<span class="n">level</span><span class="o">=</span><span class="p">[</span>
<span class="s1">'###########################'</span><span class="p">,</span>
<span class="s1">'# # #'</span><span class="p">,</span>
<span class="s1">'# ####### #'</span><span class="p">,</span>
<span class="s1">'# ####'</span><span class="p">,</span>
<span class="s1">'# ## ## #'</span><span class="p">,</span>
<span class="s1">'# #### ######### #'</span><span class="p">,</span>
<span class="s1">'###########################'</span><span class="p">]</span>
<span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">level</span><span class="p">:</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">r</span><span class="p">:</span>
<span class="k">if</span> <span class="n">c</span><span class="o">==</span><span class="s1">' '</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">elif</span> <span class="n">c</span><span class="o">==</span><span class="s1">'#'</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">Platform</span><span class="p">(</span><span class="n">myx</span><span class="p">,</span><span class="n">myy</span><span class="p">)</span>
<span class="n">myx</span><span class="o">+=</span><span class="mi">20</span>
<span class="n">myy</span><span class="o">+=</span><span class="mi">20</span>
<span class="n">myx</span><span class="o">=</span><span class="mi">0</span>
<span class="c1">#Simulazione di gravità, molto semplicistica</span>
<span class="k">def</span> <span class="nf">gravity</span><span class="p">():</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">+=</span><span class="mf">0.9</span>
<span class="n">player</span><span class="o">=</span><span class="n">Player</span><span class="p">()</span>
<span class="n">build</span><span class="p">()</span>
<span class="c1">#Ciclo di gioco</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">screen</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">gravity</span><span class="p">()</span>
<span class="c1">#Ciclo eventi</span>
<span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span> <span class="c1">#Uscita</span>
<span class="n">exit</span><span class="p">()</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYDOWN</span><span class="p">:</span> <span class="c1">#Viene premuto un tasto</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span> <span class="c1">#Su</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="p">:</span> <span class="c1">#Salta solo se il giocatore è a terra</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=-</span><span class="mi">9</span>
<span class="n">player</span><span class="o">.</span><span class="n">onground</span><span class="o">=</span><span class="kc">False</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span> <span class="c1">#Sinistra</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=-</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span> <span class="c1">#Destra</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYUP</span><span class="p">:</span> <span class="c1">#Viene rilasciato un tasto</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="c1">#Aggiorna tutte le sprites e lo schermo</span>
<span class="n">todraw</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">plats</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="c1">#Faccio in modo che il gioco non vada oltre i 30FPS</span>
<span class="n">clock</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
</code></pre></div>
<p>Questo è quanto. Buona programmazione a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Project EF12 - Il successore di MUGEN?2013-12-15T00:00:00+01:002013-12-15T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-15:/gratis-sul-web/ProjectEF12.html<p>Direttamente dal Giappone arriva Project EF12 un motore 3D per picchiaduro completamente personalizzabile.</p><h1>Direttamente dal Giappone arriva Project EF12 un motore 3D per picchiaduro completamente personalizzabile.</h1>
<p>Buongiorno a tutti, qualche tempo fa ho postato un <a href="https://penazarea.altervista.org/gratis-sul-web/MUGEN.html">articolo su MUGEN</a>, un programma con cui potete creare i vostri picchiaduro 2D ad incontri, bene; direttamente dal giappone arriva Project EF12 (per gli amici, semplicemente EF12), un motore per picchiaduro ad incontri in stile Tekken completamente personalizzabile.</p>
<p>Sembra che questo motore possa letteralmente teletrasportare la qualità dei videogiochi indie e/o amatoriali dal 2000 al 2013.</p>
<p>Il motore è disponibile gratuitamente, ma è necessaria una registrazione (sempre gratuita) presso il sito di Playism.</p>
<p>Se il motore vi piace potete acquistare la versione completa di Documentazione e Tutorials secondo la modalità "Pay What You Want" (paga quanto vuoi) a partire da 1$ (circa 75-80 centesimi di €).</p>
<p>La versione in giapponese è già disponibile, così come dovrebbe essere già disponibile anche quella in inglese.</p>
<p>Se volete provare il tutto non vi resta che precipitarvi sulla <a href="http://playism-games.com/games/ef12/">pagina dedicata</a> di Playism, registrarvi e scaricare il kit.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti</p>
<p>Penaz.</p>Naya's Quest:un'ottima avventura di Terry Cavanagh2013-12-14T00:00:00+01:002013-12-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-14:/gratis-sul-web/NayasQuest.html<p>Conosciamo Naya's Quest, un'avventura in pixel-art creata da Terry Cavanagh, gratis sul nostro browser!</p><h1>Conosciamo Naya's Quest, un'avventura in pixel-art creata da Terry Cavanagh, gratis sul nostro browser!</h1>
<p>Buongiorno a tutti; se non conoscete Terry Cavanagh correte subito in castigo dietro la lavagna e quando andate a casa provate subito le sue opere d'arte del mondo videoludico come SuperHexagon e VVVVVV; oggi vi presento un'altro prodotto della sua mente vulcanica: Naya's Quest.</p>
<p>Giocare a Naya's Quest è come tornare indietro nel tempo, quando i videogiochi usavano una tecnica di rappresentazione simil-tridimensionale conosciuta come visuale isometrica, in questo gioco dovremo guidare Naya in luogo strano per fare delle ricerche riguardo ad uno strano fenomeno detto "The Edge"</p>
<p>Il gioco risulta un'intrigante fusione di platform e puzzle, decisamente da provare.</p>
<p>Se volete provare il gioco non vi resta che precipitarvi su <a href="http://terrycavanaghgames.com/nayasquest/">questa pagina</a> e avviare direttamente il gioco dal browser, purtroppo Naya's Quest può (per ora) essere giocato solo così.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti,</p>
<p>Penaz.</p>Game Maker Studio disponibile Gratis per il download2013-12-13T00:00:00+01:002013-12-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-13:/gratis-sul-web/GameMakerStudio.html<p>Game Maker studio è disponibile gratis per il download da YoYoGames.</p><h1>Game Maker studio è disponibile gratis per il download da YoYoGames.</h1>
<p>Buongiorno a tutti, oggi parliamo di Game Maker, un ottimo software per iniziare a creare i propri videogiochi senza dover mettere mano ad enormi libri riguardanti i fondamenti della programmazione, librerie in C++ o motori 3D difficili da usare. Ora il link del vecchio Game Maker purtroppo non esiste più, dato che il è stato mandato in pensione in favore della nuova versione Game Maker Studio, che nella versione base è scaricabile gratuitamente dal sito di YoYoGames.</p>
<p>Purtroppo le features della versione gratuita sono molto ristrette, ad esempio non avrete a disposizione un numero illimitato di risorse, ma comunque potrete esportare il vostro gioco verso queste piattaforme, senza alcun costo aggiuntivo:</p>
<ul>
<li>Mac OSX</li>
<li>Windows (le versioni classiche come XP e 7)</li>
<li>Windows 8</li>
</ul>
<p>se volete iniziare subito ad usare Game Maker Studio non vi resta che scaricarlo da <a href="http://www.yoyogames.com/studio">questo link</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Penaz.</p>Grafica Ibrida AMD/Intel su linux2013-12-04T00:00:00+01:002013-12-04T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-04:/misc/AMD_Intel_Hybrid.html<p>Vediamo come usare la grafica ibrida AMD / Intel su linux, senza riavviare X!</p><h1>Vediamo come usare la grafica ibrida AMD / Intel su linux, senza riavviare X!</h1>
<p>Buongiorno a tutti; come molti sanno, linux è un ottimo sistema operativo per portatili, ma l'introduzione nel 2010/2011 delle tecnologie di grafica ibrida MUXLess da parte dei produttori hanno messo un po' in difficoltà i produttori di drivers Open-Source, sia per AMD che per Nvidia.</p>
<p>La grafica ibrida consiste nell'avere non una, ma 2 schede video sullo stesso portatile, in modo da poter passare dall'una all'altra a seconda delle necessità: mobilità o prestazioni.</p>
<p>Quella appena descritta è la cosiddetta Grafica Ibrida MUXed cioè dotata di un multiplexer che permette di scambiare "fisicamente" l'ingresso dello schermo da una scheda all'altra.</p>
<p>Purtroppo è stata introdotta anche la cosiddetta tecnologia MUXLess, dove la scheda integrata è permanentemente collegata allo schermo, mentre una seconda scheda ha il solo obiettivo di effettuare delle elaborazioni per poi mandare i risultati su schermo tramite la scheda integrata.</p>
<p>In questo articolo vedremo come usare quest'ultima tecnologia con i Driver OpenSource di Linux per le schede AMD ed Intel, rispettivamente i cosiddetti driver Intel e Radeon (da non confondere con Fglrx o FireGL i quali sono i driver proprietari di AMD)</p>
<h2>Materiale Necessario</h2>
<p>Sono necessari alcuni programmi per poter usare la nostra scheda più potente, la maggior parte dei quali sono già inclusi nella maggior parte delle distribuzioni:</p>
<ul>
<li>I Driver della scheda video integrata (su gentoo: xf86-video-intel)</li>
<li>I Driver della scheda video "discreta" (su gentoo: xf86-video-ati)</li>
<li>XRandr</li>
<li>Il supporto nel kernel per i driver intel, radeon e lo switching delle schede tramite VGASwitcheroo</li>
<li>Opzione di Esposizione del filesystem di debug (debugfs) attiva nel kernel</li>
<li>Mesa, libdrm e tutti gli strumenti classici per far funzionare le schede grafiche</li>
</ul>
<h2>Entriamo in azione!</h2>
<p>Per prima cosa verifichiamo che la nostra scheda AMD sia attiva con</p>
<div class="codehilite"><pre><span></span><code><span class="err"> cat /sys/kernel/debug/vgaswitcheroo/switch</span>
</code></pre></div>
<p>Se ritorna un risultato del genere:</p>
<blockquote>
<p>0:IGD:+:Pwr:0000:00:02.0
1:DIS: :Off:0000:01:00.0</p>
</blockquote>
<p>La scheda AMD è spenta, (si nota da DIS: :Off), ed è necessario attivarla tramite il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> echo ON > /sys/kernel/debug/vgaswitcheroo/switch</span>
</code></pre></div>
<p>Un secondo cat ci darà il risultato che volevamo:</p>
<blockquote>
<p>0:IGD:+:Pwr:0000:00:02.0
1:DIS: : Pwr:0000:01:00.0</p>
</blockquote>
<p>Ora facciamo in modo che i dati generati dalla scheda AMD vengano ridirezionati alla scheda Intel, usiamo il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">xrandr --listproviders</span>
</code></pre></div>
<p>che ci darà un risultato simile a questo:</p>
<blockquote>
<p>Providers: number : 2
Provider 0: id: 0x7b cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 5 associated providers: 1 name:Intel
Provider 1: id: 0x53 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 0 associated providers: 1 name:radeon</p>
</blockquote>
<p>Annotiamo l'id delle due schede e proseguiamo.</p>
<p><strong>Nel caso xrandr visualizzasse un solo provider assicuratevi che non vi siano script all'avvio che disattivino la scheda AMD, a volte può succedere che uno script all'avvio spenga la scheda prima che X riesca a rilevarla, così Xrandr non riesce ad includerla fra i provider disponibili.</strong></p>
<p>Ora diamo il "comando magico":</p>
<div class="codehilite"><pre><span></span><code><span class="err">xrandr --setprovideroffloadsink <id radeon> <id intel></span>
</code></pre></div>
<p>nel mio caso:</p>
<div class="codehilite"><pre><span></span><code><span class="err">xrandr --setprovideroffloadsink 0x53 0x7b</span>
</code></pre></div>
<p>Bene, il più è fatto, ora per usare la scheda discreta è sufficiente avviare il programma voluto da linea di comando, preceduto da DRI_PRIME=1.</p>
<h2>Il test</h2>
<p>Per testare la scheda ho voluto usare gli strumenti di mesa-progs.</p>
<p>Prima il test campione, fatto sulla scheda integrata:</p>
<div class="codehilite"><pre><span></span><code><span class="err">glxgears -info</span>
</code></pre></div>
<p>Con il seguente risultato</p>
<blockquote>
<p>Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
GL_RENDERER = Mesa DRI Intel(R) Sandybridge Mobile
GL_VERSION = 3.0 Mesa 9.2.4
GL_VENDOR = Intel Open Source Technology Center
GL_EXTENSIONS = GL_ARB_multisample G [...] GL_ARB_texture_storage_multisample</p>
<p>302 frames in 5.0 seconds = 60.392 FPS</p>
<p>300 frames in 5.0 seconds = 59.879 FPS</p>
</blockquote>
<p>Come si vede da GL_RENDERER, il render è effettuato dalla scheda integrata Intel, aggiungendo la variabile DRI_PRIME=1, il risultato cambia, e non poco:</p>
<div class="codehilite"><pre><span></span><code><span class="err"> DRI_PRIME=1 glxgears -info</span>
</code></pre></div>
<blockquote>
<p>Running synchronized to the vertical refresh. The framerate should be
approximately the same as the monitor refresh rate.
GL_RENDERER = Gallium 0.4 on AMD CAICOS
GL_VERSION = 3.0 Mesa 9.2.4
GL_VENDOR = X.Org
GL_EXTENSIONS = GL_ARB_multisample <strong>[...]</strong> GL_ARB_texture_storage_multisample
15677 frames in 5.0 seconds = 3135.300 FPS
15597 frames in 5.0 seconds = 3119.350 FPS</p>
</blockquote>
<p>Questa volta, GL_RENDERER ci assicura che il rendering è fatto dalla scheda AMD, con microcodici CAICOS tramite Gallium versione 0.4, un'altra cosa che ci assicura il funzionamento della scheda è l'aumento dei frame per secondo e la ventola che gira talmente forte che sembra che stia per partire un jet dal nostro portatile, a meno che il vostro sistema di raffreddamento non sia un pochino più efficiente del mio.</p>
<p>Quando avete finito, potete nuovamente disattivare la scheda con</p>
<div class="codehilite"><pre><span></span><code><span class="err">echo OFF > /sys/kernel/debug/vgaswitcheroo/switch</span>
</code></pre></div>
<p>per poter risparmiare batteria ed evitare di avere una stufetta per le mani.</p>
<p>Questo è quanto.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima</p>
<p>Penaz.</p>Giochi da tavolo con VASSAL2013-12-03T00:00:00+01:002013-12-03T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-03:/gratis-sul-web/VASSAL.html<p>Per la serie "Game Development", diamo un'occhiata a VASSAL Engine, un motore per creare adattamenti di giochi da tavolo e di carte online.</p><h1>Per la serie "Game Development", diamo un'occhiata a VASSAL Engine, un motore per creare adattamenti di giochi da tavolo e di carte online.</h1>
<p>Buongiorno a tutti, oggi per la nostra sezione dedicata ai programmi che ci danno una mano a dar forma ai nostri progetti videoludici, vi presento VASSAL.</p>
<p>VASSAL è un motore che ci permette di costruire e giocare ad adattamenti online di giochi da tavolo e di carte. Il motore ci permette di giocare direttamente online o anche tramite email permettendoci anche di passare da un modo di gioco all'altro nel corso della stessa partita.</p>
<p>Questo motore, come la maggior parte del software che vi ho presentato qui, è multipiattaforma, quindi potrete usarlo tranquillamente su Windows, Linux e MacOS, infatti VASSAL è scritto in Java al 100% e ciò gli permette di girare praticamente su tutte le piattaforme che ci possono venire in mente.</p>
<p>L'interfaccia di tipo Drag&Drop è estremamente intuitiva e ci permette di creare velocemente i nostri giochi, con mappe personalizzabili, contatori personalizzabili e addirittura file di aiuto in HTML personalizzabili; per la massima flessibilità.</p>
<p>In più le funzionalità possono tranquillamente essere estese tramite moduli, sempre scritti in Java.</p>
<p>Se volete unirvi alla schiera di utilizzatori di VASSAL ed iniziare immediatamente a costruire i vostri "giochi da tavolo online" non vi resta che collegarvi al <a href="http://www.vassalengine.org">sito ufficiale</a>, da dove potrete scaricare il motore e trovare un nutrito wiki che vi aiuterà a compiere i primi passi.</p>
<p>Questo è quanto, alla prossima!</p>
<p>Penaz.</p>Ancora giochi con Pumpkin Games2013-12-02T00:00:00+01:002013-12-02T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-02:/gratis-sul-web/Pumpkin_Games.html<p>Un altro piccolo sito da cui scaricare delle piccole perle videoludiche: Pumpkin Games.</p><h1>Un altro piccolo sito da cui scaricare delle piccole perle videoludiche: Pumpkin Games.</h1>
<p>Buongiorno a tutti, piccola premessa: ho deciso di usare questo articolo come terreno di test per un nuovo plugin di Wordpress, in modo da rendere meno "sporco" il contenuto degli articoli e rendere più chiara la lettura; tornando a noi, oggi vi voglio proporre un altro sito da cui potrete scaricare alcuni piccoli videogiochi con cui passare qualche decina di minuti in modo spensierato: Pumpkin Games.</p>
<p>Su Pumpkin Games troverete alcuni giochi tecnicamente molto semplici, ma estremamente curati nella grafica e ben rifiniti, facciamo una piccola carrellata.</p>
<h2>Doppelganger</h2>
<p>Doppelganger è uno shooter a scorrimento orizzontale in due dimensioni, in cui l'obiettivo principale è salvare i due astronauti dagli alieni. La particolarità di questo gioco è data dal fatto di controllare 2 mondi contemporaneamente. Un vero test di destrezza e coraggio.</p>
<h2>Titan Attacks</h2>
<p>Sei l'ultimo comandante di carri armati soppravvissuto sulla terra. E dovrai, da solo, contrastare un'intera armata di alieni invasori. Respingi i Titani (Titans) attraverso il sistema solare per poi sconfiggerli sul loro pianeta natale.</p>
<h2>SUMO</h2>
<p>Combatti contro i tuoi amici o contro il PC in un intenso shooter/brawler a squadre. Crea le tue regole e dacci dentro!</p>
<h2>Ultratron</h2>
<p>La tua missione è quella di vendicare la razza umana e di distruggere i quattro robots dell'apocalisse.</p>
<h2>Alien Adbuction</h2>
<p>Stranamente, penso per un errore, la descrizione sul sito è uguale a quella di Ultratron. Purtroppo non ho ancora avuto il tempo di provare questo piccolo gioco di Pumpkin Games...</p>
<h2>Ending</h2>
<p>Questo gioco è descritto come un "puzzle di movimento e morte". Sul sito di Pumpkin Games è disponibile il codice sorgente XNA.</p>
<p>Se volete provare uno (o magari tutti) questi giochi non vi resta che precipitarvi nella <a href="http://www.pumpkin-games.net/">pagina ufficiale</a> di Pumpkin Games e provarli.</p>
<p>Auguro un buon divertimento a tutti, noi ci vediamo al prossimo post.</p>
<p>Saluti!</p>
<p>Penaz.</p>Gridrunner++ gratis da scaricare!2013-12-01T00:00:00+01:002013-12-01T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-12-01:/gratis-sul-web/GridRunner++.html<p>GridRunner++ viene descritto come "Il miglior arcade shooter mai creato", ed ora è disponibile per il download gratis.</p><h1>GridRunner++ viene descritto come "Il miglior arcade shooter mai creato", ed ora è disponibile per il download gratis.</h1>
<p>Buongiorno a tutti, sono oramai passati 11 anni da quando GridRunner++ è uscito per PC e nonostante la non proprio giovane età, questo gioco è considerato ancora uno dei migliori (se non il migliore) shooter arcade di sempre, riuscendo a superare agevolmente prodotti più nuovi come Ikaruga ed il suo stesso seguito GridRunner Revolution.</p>
<p>Originariamente GridRunner++ era la versione di Jeff Minter di Centipede per PocketPC: i nemici arrivavano sullo schermo allineati e appena venivano ammazzati riempivano il campo di gioco con pericolosissime bombe.</p>
<p>Il vantaggio di essere un gioco per PocketPC (dal lato del programmatore) è dato dal fatto che effettuare un porting su PC è estremamente facile. Infatti il suddetto porting arrivò poco dopo.</p>
<p>A differenza di Centipede, GridRunner++ è un pochino più agile e le bombe esplodono creando una forma a "+", non è una gran difficoltà fino a quando non si ha a che fare con 10 bombe in contemporanea; allora il discorso si fa ludicamente serio.</p>
<p>Il gioco così creato risulta un continuo bilanciamento tra sparare ed uccidere i nemici e riuscire ad evitare i nemici stessi ed i loro colpi, man mano che il gioco prosegue il campo di battaglia diventerà sempre più follemente incasinato. Per fortuna GridRunner++ ha anche dei powerup a forma di... pecora.</p>
<p>La nostra bella pecorella non solo aumenta il moltiplicatore dei punti, permettendoci di macinare numeri a più non posso in puro stile arcade ma creerà una nave fantasma che può sparare sia in alto che in basso, anche se non è potente come la nave principale la possibilità di poterne accumulare fino ad un massimo di 9 le renderà molto presto indispensabili.</p>
<p>Ma il fatto che le pecorelle siano così utili non è affatto un motivo valido per correre immediatamente a raccoglierne una. In un gioco come GridRunner++ correre a prendere un bonus è un ottimo modo per finire in faccia ad uno dei tanti nemici che compaiono, anche nei primi livelli; riducendo la nostra navetta ad un mucchio di pixel luccicanti che si spargono per lo schermo.</p>
<p>Inoltre se si aspetta fino a poco prima che la pecorella scompaia per incontrare il proprio oscuro destino è possibile avere qualche istante di invulnerabilità, permettendoci così di tornare velocemente in posizione per sparare a tutto ciò che ci capita a tiro.</p>
<p>Se invece è troppo tardi per la nostra nave e ci ritroviamo con un mucchio di pixel luccicanti sotto mano, non tutto è perduto: se riusciamo a dirigere i detriti della nostra nave verso una pecorella non riceveremo il bonus ma avremo salva la pellaccia.</p>
<p>Il gioco pesa solo 4MB e funziona esattamente come funzionava 11 anni fa, nel lontano 2002.</p>
<p>Se volete giocare al gioco che tuttora detiene il titolo di "Miglior shooter arcade mai creato" non vi resta che visitare la <a href="http://minotaurproject.co.uk/Minotaur/donate.php#grpc">pagina dedicata</a> e scaricarlo sul vostro pc.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Impariamo VIM: Copia ed incolla negli appunti di sistema2013-11-22T00:00:00+01:002013-11-22T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-11-22:/misc/VIM15.html<p>Vediamo come copiare ed incollare nella clipboard di sistema com VIM.</p><h1>Vediamo come copiare ed incollare nella clipboard di sistema com VIM.</h1>
<p>Buongiorno a tutti, se usate VIM da molto tempo avrete notato che se fate un copia (Yank) non potete incollare il contenuto copiato in un altro programma. Questo è dato dal fatto che VIM usa dei propri appunti, diversi da quelli di sistema, per fortuna ci viene in aiuto il registro " * ".</p>
<p>Infatti usando il registro asterisco è possibile modificare la clipboard di sistema direttamente da VIM, vediamo come:</p>
<p>Dopo aver aperto un documento qualsiasi con VIM</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi file.txt</span>
</code></pre></div>
<p>Selezioniamo il testo da copiare dalla modalità visuale, come faremmo di solito ed infine copiamo in premendo in successione i tasti virgolette, asterisco ed y:</p>
<blockquote>
<p>[ " ][ * ][ y ]</p>
</blockquote>
<p>Dopodichè potete incollare quello che avete copiato nel programma di cui avete bisogno.</p>
<p>Per incollare dalla clipboard di sistema verso VIM è sufficiente sostituire "y" con "p", la procedura è sempre la stessa:</p>
<blockquote>
<p>[ " ][ * ][ p ]</p>
</blockquote>
<p>Io per praticità e per preferenze personali ho voluto modificare le impostazioni di VIM ed usare il registro "+", se volete farlo anche voi è sufficiente aprire il vostro file .vimrc:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi .vimrc</span>
</code></pre></div>
<p>ed aggiungere la seguente riga:</p>
<blockquote>
<p>set clipboard=unnamedplus</p>
</blockquote>
<p>Dal prossimo avvio di VIM potrete usare i seguenti comandi per copiare ed incollare da e verso la clipboard di sistema:</p>
<blockquote>
<p>[ " ][ + ][ x ] - Taglia</p>
<p>[ " ][ + ][ y ] - Copia</p>
<p>[ " ][ + ][ p ] - Incolla</blockquote></p>
</blockquote>
<p><strong>Non cercate di rimappare il pulsante y direttamente, tramite il seguente comando:</strong></p>
<blockquote>
<p>:map y "+y</p>
</blockquote>
<p><strong>Altrimenti la prima volta che cercherete di copiare del testo nella clipboard VIM andrà in loop (se avete fatto un po' di programmazione lo capirete subito) richiamando continuamente la nuova mappatura di y (<a href="http://it.wikipedia.org/wiki/Algoritmo_ricorsivo">vedi ricorsione su Wikipedia</a>). Nel caso l'aveste fatto, un "killall vim" chiuderà il programma bloccato, ma potreste non riuscire a recuperare i dati non salvati.</strong></p>
<p>Ecco come tagliare, copiare ed incollare da e verso gli appunti di sistema.</p>
<p>Buon lavoro a tutti!</p>
<p>Saluti e alla prossima.</p>
<p>Penaz.</p>JustinGuitar: Corsi di chitarra gratis online2013-11-03T00:00:00+01:002013-11-03T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-11-03:/gratis-sul-web/JustinGuitar.html<p>Conosciamo JustinGuitar, un sito che propone completamente gratis un completo corso di chitarra.</p><h1>Conosciamo JustinGuitar, un sito che propone completamente gratis un completo corso di chitarra.</h1>
<p>Buongiorno a tutti, molti sanno che conoscendo l'inglese si aprono moltissime possibilità per quanto riguarda l'apprendimento, il lavoro, ecc... Oggi vedremo un sito adatto ai nostri amici che masticano un po' di inglese: JustinGuitar.</p>
<p>JustinGuitar è un sito che propone un completissimo corso di chitarra completo di video, audio e spartiti oltre che molti licks e trucchetti vari per dare una marcia in più a coloro che di chitarra ne sanno già qualcosa.</p>
<p>La maggior parte dei videocorsi di JustinGuitar sono sottotitolati in inglese o sottotitolabili, quindi risulteranno molto chiari anche nel caso il nostro istruttore parlasse un po' troppo in fretta. Le spiegazioni sono chiarissime, completissime e piene di consigli per quanto concerne gli errori comuni che fanno gli alunni alle prime armi, come evitare tali errori e sviluppare fin da subito le "buone abitudini" nel suonare la chitarra.</p>
<p>JustinGuitar offre le proprie lezioni gratis, ma è possibile (e consigliato) donare qualcosa per mantenere il sito gratuito, dopotutto tale portale richiede uno sforzo in termini di tempo, fatica e denaro (soprattutto per l'hosting del server), in alternativa è possibile comprare qualche prodotto sempre dal sito.</p>
<p>Fra le altre cose il sito dispone anche di alcuni piccoli ma utili strumenti per migliorare le nostre performance con la chitarra, tra cui un timer ed un metronomo.</p>
<p>Per un'esperienza completa con la vostra chitarra mi sento di consigliarvi di vedere l' articolo riguardante <a href="https://penazarea.altervista.org/gratis-sul-web/Spartiti_Gratis.html">UltimateGuitar</a> e la <a href="https://penazarea.altervista.org/Software_Multimedia.html">Pagina Multimedia</a> dei Software Consigliati in cui troverete TuxGuitar, un sito ed uno strumento che vi aiuteranno ad imparare le vostre canzoni preferite.</p>
<p>Se volete visitare il sito, non vi resta che seguire <a href="http://justinguitar.com">Questo link</a> che vi porterà alla pagina principale di JustinGuitar.</p>
<p>Buon divertimento con la vostra amica a 6 corde!</p>
<p>Saluti a tutti e alla prossima!</p>
<p>Penaz.</p>Impariamo le basi della programmazione in vari linguaggi con un ottimo sito: Codecademy.2013-11-01T00:00:00+01:002013-11-01T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-11-01:/gratis-sul-web/Codecademy.html<p>Impariamo le basi della programmazione in vari linguaggi con un ottimo sito: Codecademy.</p><h1>Impariamo le basi della programmazione in vari linguaggi con un ottimo sito: Codecademy.</h1>
<p>Dopo un interminabile periodo di pausa forzata, torno a postare nel blog proponendo un sito che consentirà a chi mastica un po' di inglese di imparare facilmente a programmare in vari linguaggi: Codecademy.</p>
<p>Con Codecademy imparerete precisamente:</p>
<ul>
<li>Javascript</li>
<li>Php</li>
<li>Ruby</li>
<li>Python</li>
<li>HTML + CSS</li>
</ul>
<p>Oltre a poter imparare ad usare le API di siti come youtube, twitter, ecc...</p>
<p>Nella home page potete provare un piccola esperienza di programmazione, dopo una semplice registrazione potrete tenere traccia dei vostri progressi e creare voi stessi delle lezioni che vanno ad integrare quello che il sito già offre.</p>
<p>Se volete provare Codecademy non vi resta che precipitarvi sul sito seguendo <a href="http://codeacademy.com">questo link</a></p>
<p>Buona programmazione a tutti!</p>
<p>Alla prossima!</p>
<p>Penaz.</p>Suoni naturali direttamente nel nostro browser2013-10-04T00:00:00+02:002013-10-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-10-04:/misc/Suoni_Naturali.html<p>Per gli amanti della natura costretti a stare in ufficio: una selezione di siti con cui potrete rilassarvi con suoni naturali.</p><h1>Per gli amanti della natura costretti a stare in ufficio: una selezione di siti con cui potrete rilassarvi con suoni naturali.</h1>
<p>Buongiorno a tutti, nonostante quello che si dice, sono molto più apprezzati i suoni naturali che non gli album di artisti famosi; tutto questo perchè i suoni naturali ci avvicinano alla Terra, ci rilassano e ci fanno sentire parte di essa.</p>
<p>Vi è mai capitato di sentirvi estremamente rilassati durante una notte di pioggia leggera? Le gocce che battono sulle tegole di casa, il gorgoglio delle grondaie che scaricano l'acqua e magari qualche leggero tuono in lontananza?</p>
<p>Se volete rilassarvi in casa o in ufficio vi propongo una piccola selezione di siti da cui potrete avere la vostra dose quotidiana di suoni naturali; gratis e con qualsiasi sistema operativo, basta avere un browser.</p>
<h3>Sounds of Nature</h3>
<p>Un buon sito da cui potrete ascoltare una serie di suoni naturali pronti all'uso direttamente dal vostro browser, basta fare click su "Hear Now" sotto al suono che avete scelto e troverete i vostri sensi immediatamente capultati al mare, in una foresta oppure in campagna.</p>
<p>Se volete provare, andate nella <a href="http://en.ecosounds.net/">pagina principale del Sito</a>.</p>
<h3>MeditationRoom</h3>
<p>La sezione dedicata ai suoni naturali di meditationroom non è estesissima, ma vanta suoni al 100% naturali, senza ripetizioni. Qui vi ritroverete per 20 minuti sotto una gentile pioggia estiva oppure mezz'ora vicino ad un torrente di montagna o ancora a fare una rilassante passeggiata mentale nella foresta, a voi la scelta!</p>
<p>Se volete entrare nella pagina, seguite <a href="http://www.meditationroom.org/nature-sounds.html">questo link</a></p>
<h3>iSerenity</h3>
<p>iSerenity è un sito decisamente molto molto molto spartano, ma fa il suo lavoro. Mette a disposizione una serie di suoni tra cui i già noti suoni della foresta, la pioggia, un piccolo temporale e aggiunge anche il rumore di una macchina da scrivere che batte, uno scoppiettante fuocherello oppure un semplice rumore bianco, ottimo per coprire o ridurre i rumori ambientali.</p>
<p>Potete raggiungere il sito di iSerenity tramite <a href="http://www.iserenity.com/">questo link</a></p>
<h3>Rainy Mood</h3>
<p>Quale tra i suoni naturali di questo mondo è (almeno secondo me) il più naturale se non la pioggia?</p>
<p>Diretto e semplice da usare, basta scrivere l'indirizzo nel vostro browser ed il gioco è fatto. Avrete a vostra disposizione 30 minuti di pioggia in alta qualità, nessuno bottone da cliccare; solo pioggia.</p>
<p>Potete bagnarvi sotto la pioggia (mentalmente si intende), seguendo <a href="http://www.rainymood.com/">questo link</a></p>
<h3>NatureSoundsFor.me</h3>
<p>Decisamente il sito più ricco e flessibile che ho trovato finora. Potete ascoltare fino a 4 suoni naturali contemporaneamente scegliendoli da una lista suddivisa per categorie. Potete inoltre esportare i suoni per poterli ascoltare con il vostro MP3 oppure creare un link da passare ai vostri amici stressati e bisognosi di relax.</p>
<p>Se volete entrare nel sito, seguite <a href="http://naturesoundsfor.me/">questo link</a></p>
<p>Questo è quanto.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Passwords più sicure, ecco come2013-10-03T00:00:00+02:002013-10-03T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-10-03:/misc/Password.html<p>Vediamo come rendere più sicure le nostre passwords con alcuni semplici accorgimenti.</p><h1>Vediamo come rendere più sicure le nostre passwords con alcuni semplici accorgimenti.</h1>
<p>Buongiorno a tutti, quello della sicurezza informatica è un tema complesso e preoccupante; su internet i nostri dati sono sempre in pericolo, è per questo che sono state inventate le passwords, delle parole d'ordine che consentono l'accesso ad una risorsa solo a coloro i quali conoscono la giusta parola d'ordine.</p>
<p>Ciò che non tutti sanno è che esistono diversi tipi di attacchi che consentono a persone non autorizzate di accedere a tali risorse, mettendo a rischio la nostra privacy; vediamo come migliorare la robustezza delle nostre passwords e rendere più difficile la vita ai pirati informatici.</p>
<h3>Non usare parole singole</h3>
<p>Infatti le parole singole sono molto suscettibili ad un cosiddetto "attacco dizionario", supponendo che esistano 1.000.000 di parole italiane ed una velocità media di 1500 password al secondo (velocità tutt'altro che sovrastimata) la password verrebbe craccata in circa 12 minuti; il tempo di un caffè.</p>
<h3>Usare una passphrase</h3>
<p>Invece di una password è possibile usare una frase che ci permetta l'accesso, una cosa del tipo:</p>
<blockquote>
<p>questaèlamiapasswordenessunolacraccheràmai</p>
</blockquote>
<p>è semplice da ricordare ed è più robusta ad un attacco dizionario, infatti questa passphrase è composta da 10 parole e (con le stesse supposizioni del punto precedente) richiede 1.000.000^10 tentativi per essere craccata, il che allunga il tempo a 2.11*10^49 anni... Almeno....</p>
<h3>1337 (Leet)</h3>
<p>Derivata inizialmente da errori di battitura nel famoso circuito di Chat IRC, il linguaggio leet fa al caso nostro per complicare la vita ai più niubbi fra i pirati informatici, infatti prendendo una parola qualsiasi e applicandoci il linguaggio leet è possibile allungare di molto il tempo di cracking, per esempio la parola</p>
<blockquote>
<p>Lampone</p>
</blockquote>
<p>diventerebbe</p>
<blockquote>
<p>L4mp0n3</p>
</blockquote>
<p>Il che ci mette al riparo dagli attacchi dizionario meno smaliziati (<strong>Attenzione: alcuni dizionari includono anche le parole in linguaggio leet</strong>) e costringe il tanto odiato pirata informatico ad usare un attacco di brute force vero e proprio e dovendo usare un alfabeto di 26 lettere maiuscole + 26 minuscole + 10 cifre i tentativi necessari per craccare una password del genere ammontano a più di 3500 miliardi, richiedendo circa 74 anni...</p>
<p>Se vogliamo complicare le cose possiamo sostituire dei caratteri con gruppi di simboli che ne ricordano la forma, come per esempio:</p>
<div class="codehilite"><pre><span></span><code><span class="err">L4|\/|p0|\|3</span>
</code></pre></div>
<p>in cui abbiamo usato la barra verticale, forward slash e backslash. Questo costringerà il nostro caro cracker ad estendere ulteriormente il suo alfabeto aggiungendo simboli più o meno comuni, supponendo che vengano aggiunti altri 15 simboli al nostro "alfabeto" saranno necessari almeno 918 milioni di anni...</p>
<h3>Combinare le strategie</h3>
<p>Combinando le strategie precedenti è possibile blindare la propria password oltre i limiti dell'immaginabile.</p>
<p>Una password come</p>
<blockquote>
<p>questaèlamiapasswordenessunolacraccheràmai</p>
</blockquote>
<p>Ed opportunamente convertita in</p>
<div class="codehilite"><pre><span></span><code><span class="err">Q|_|3574èl4|\/|14p455\/\/0rd3|\|355|_||\|0l4cr4cc|-|3rà|\/|41</span>
</code></pre></div>
<p>Lunga 61 caratteri e praticamente invulnerabile agli attacchi dizionario necessiterà di almeno 2.5*10^104 anni... Penso proprio che il nostro caro pirata informatico si stancherà un po' prima...</p>
<h3>Usate le iniziali di una frase</h3>
<p>Un altro modo per ricordare facilmente una password è quello di usare le iniziali di una frase, per esempio:</p>
<blockquote>
<p>Il 5 Maggio è il mio compleanno, tanti auguri a me!</p>
</blockquote>
<p>Diventerebbe:</p>
<blockquote>
<p>I5Mèimc,taam!</p>
</blockquote>
<p>Ecco a voi una password completamente casuale per chi non conosce il ragionamento che ci sta dietro, con una buona combinazione di lettere maiuscole, minuscole, simboli e numeri.</p>
<h3>Usare una password completamente casuale</h3>
<p>Se pecchiamo di fantasia è possibile fare in modo che il computer possa generare per noi una password in maniera pseudocasuale, se avete un minimo di esperienza in un qualsivoglia linguaggio di programmazione potete creare il vostro personalissimo generatore di password, questo è un piccolo esempio in Python 3:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python3</span>
<span class="c1">#Costruzione della lista di caratteri</span>
<span class="kn">import</span> <span class="nn">random</span>
<span class="n">l</span><span class="o">=</span><span class="p">[</span><span class="s2">"a"</span><span class="p">,</span><span class="s2">"b"</span><span class="p">,</span><span class="s2">"c"</span><span class="p">,</span><span class="s2">"d"</span><span class="p">,</span><span class="s2">"e"</span><span class="p">,</span><span class="s2">"f"</span><span class="p">,</span><span class="s2">"g"</span><span class="p">,</span><span class="s2">"h"</span><span class="p">,</span><span class="s2">"i"</span><span class="p">,</span><span class="s2">"j"</span><span class="p">,</span><span class="s2">"k"</span><span class="p">,</span><span class="s2">"l"</span><span class="p">,</span><span class="s2">"m"</span><span class="p">,</span><span class="s2">"n"</span><span class="p">,</span><span class="s2">"o"</span><span class="p">,</span><span class="s2">"p"</span><span class="p">,</span><span class="s2">"q"</span><span class="p">,</span><span class="s2">"r"</span><span class="p">,</span><span class="s2">"s"</span><span class="p">,</span><span class="s2">"t"</span><span class="p">,</span><span class="s2">"u"</span><span class="p">,</span><span class="s2">"v"</span><span class="p">,</span><span class="s2">"w"</span><span class="p">,</span><span class="s2">"x"</span><span class="p">,</span><span class="s2">"y"</span><span class="p">,</span><span class="s2">"z"</span><span class="p">]</span>
<span class="n">a</span><span class="o">=</span><span class="p">[]</span>
<span class="k">for</span> <span class="n">ch</span> <span class="ow">in</span> <span class="n">l</span><span class="p">:</span>
<span class="n">a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ch</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span>
<span class="n">l</span><span class="o">+=</span><span class="n">a</span>
<span class="k">del</span> <span class="n">a</span>
<span class="n">l</span><span class="o">+=</span><span class="p">[</span><span class="s2">","</span><span class="p">,</span><span class="s2">"."</span><span class="p">,</span><span class="s2">"!"</span><span class="p">,</span><span class="s2">"-"</span><span class="p">,</span><span class="s2">"_"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
<span class="n">l</span><span class="o">+=</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="c1">#Inizio Programma</span>
<span class="n">n</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">"Di quanti caratteri? "</span><span class="p">))</span>
<span class="n">m</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">"Quante password generare? "</span><span class="p">))</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="n">pwd</span><span class="o">=</span><span class="s2">""</span>
<span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">):</span>
<span class="n">pwd</span><span class="o">+=</span><span class="nb">str</span><span class="p">(</span><span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">l</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="n">pwd</span><span class="p">)</span>
</code></pre></div>
<p><strong>Attenzione: questo script non è crittograficamente sicuro, dato il seed, è possibile riprodurre le varie password generate</strong></p>
<p>Oppure usare un generatore di password come <a href="http://pwgen-win.sourceforge.net/">PWGen</a></p>
<h3>Usare un password manager</h3>
<p>Se avete la memoria corta oppure avete un sacco di password di cui tenere traccia potrebbe essere utile un metodo per averle tutte sotto mano, potrebbe essere un file di testo criptato con VIM (<a href="https://penazarea.altervista.org/misc/VIM10.html">come in questo articolo</a>) ma se volete veramente uno strumento adatto a gestire molte password comodamente dovete usare un password manager, ne esistono molti di gratuiti come KeePass oppure KWalletManager se usate KDE che vi danno la sicurezza della crittografia e la comodità del login con un click. L'unica cosa che dovete fare è creare una password robusta che userete come chiave d'accesso per proteggere tutte le altre password memorizzate dal manager. Tutto qui.</p>
<p>Questo è quanto. Aggiornerò l'articolo ogniqualvolta troverò o inventerò nuovi metodi per rendere più sicura la nostra vita informatica.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Domination: Il risiko per il vostro PC2013-09-17T00:00:00+02:002013-09-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-09-17:/gratis-sul-web/Domination.html<p>Giocare a risiko è sicuramente divertente, ma la tecnologia si fa avanti. Aggiorniamoci giocando a Domination, una versione di risiko completa per PC, gratis!</p><h1>Giocare a risiko è sicuramente divertente, ma la tecnologia si fa avanti. Aggiorniamoci giocando a Domination, una versione di risiko completa per PC, gratis!</h1>
<p>Buongiorno a tutti. Chi non ha mai giocato a Risiko? Il famosissimo gioco strategico da tavolo in cui si cerca con tutti i mezzi di raggiungere il dominio supremo del mondo. Da oggi potremo giocarlo direttamente sul nostro PC grazie ad un progetto open-source che si chiama Domination.</p>
<p>Domination dispone di moltissime mappe diverse, che ci permetteranno di variare il gioco, un sistema di battaglia che simulerà il lancio dei dadi ed altre features che vorrei lasciarvi scoprire da soli.</p>
<p>Il gioco è disponibile per praticamente tutte le piattaforme, attualmente sono disponibili le versioni per Windows, Linux, MacOS, BSD e qualunque altro sistema operativo che sia in grado di fare girare un programma scritto in Java. E tanto per gradire, di recente è stata rilasciata anche una versione utilizzabile su dispositivi mobili dotati di Sistema operativo Android.</p>
<p>Se volete iniziare subito a giocare non vi resta che catapultarvi sulla <a href="http://domination.sourceforge.net">pagina ufficiale di SourceForge</a> e scaricare subito la versione adatta al vostro sistema.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Minetest: Un ottimo clone OpenSource di Minecraft2013-09-06T00:00:00+02:002013-09-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-09-06:/gratis-sul-web/Minetest.html<p>Diamo un'occhiata da vicino a Minetest, un ottimo clone open-source di Minecraft con caratteristiche molto interessanti.</p><h1>Diamo un'occhiata da vicino a Minetest, un ottimo clone open-source di Minecraft con caratteristiche molto interessanti.</h1>
<p>Buongiorno a tutti. Oggi vi voglio presentare un sandbox game praticamente uguale al già celeberrimo Minecraft, ma con qualche caratteristica che potrebbe davvero stupirci: MineTest.</p>
<p>MineTest, come Minecraft, è un sandbox game in cui potete raccogliere e posizionare blocchi.Il gioco trae ispirazione da Infiniminer e dallo stesso Minecraft, ma ha alcune caratteristiche che possono permettergli di crescere in maniera velocissima, diamoci un'occhiata.</p>
<h2>Download Leggero</h2>
<p>Eh si, MineTest è leggerissimo, attualmente pesa solo 4.5MB nella versione installer per Windows e, diversamente dal ben più famoso Minecraft, non richiede alcun download aggiuntivo per funzionare.</p>
<h2>Java vs. C++ , C & Lua</h2>
<p>Diversamente da Minecraft che è scritto in Java e quindi potenzialmente pesante e lento, MineTest è scritto per il 95% in C e C++ e qualche cosina è scritta anche in Lua. MineTest fa uso del potentissimo motore IRRLicht di cui vi ho parlato qualche tempo fa in <a href="https://penazarea.altervista.org/gratis-sul-web/IRRlicht.html">questo articolo</a>; tutto ciò lo rende veloce e leggero, tanto da poter girare tranquillamente su un laptop con grafica integrata Intel G945M.</p>
<h2>Mods e Textures!!</h2>
<p>Eh si, il gioco supporta l'integrazione tramite Mods e Textures. Anche se le textures di default sono decisamente piacevoli e sufficientemente varie.</p>
<h2>Crafting</h2>
<p>Passando al lato ludico del discorso, è possibile costruire oggetti in una griglia 3x3 senza necessità di avere un tavolo da lavoro.</p>
<h2>Ceste con lucchetto</h2>
<p>Basta coi metodi raccogliticci per evitare che altri rubino i frutti delle nostra fatiche, in MineTest è possibile costruire delle ceste con lucchetto che possono essere aperte solo dal giocatore che le ha costruite. Comodo, no?</p>
<h2>I dettagli contano</h2>
<p>Ci sono tanti piccoli dettagli che rendono piacevole il gioco, come la possibilità di vedere lo stato della fornace (completato al xx% tanto per capirci) solo puntandola.</p>
<h2>È OpenSource</h2>
<p>Il che significa che potete contribuire anche voi, programmando o terminando la traduzione del gioco. Contribuite!!</p>
<p>Ora vediamo alcune mods che potenzieranno l'esperienza di gioco.</p>
<h3>MoreOres/MoreBlocks</h3>
<p>Questa mod vi metterà a disposizione più blocchi e materiali. Potrete scavare alla ricerca di stagno e rame per poi costruire armi ed attrezzi in bronzo, trovare oro e argento ed un minerale blu detto Mithril, estremamente raro e resistente e, diversamente dal Lapis Lazuli di Minecraft, il Mithril ha una utilità pratica più ampia rispetto alla mera decorazione.</p>
<p><a href="https://forum.minetest.net/viewtopic.php?id=549">Pagina di download di MoreOres</a></p>
<p><a href="https://forum.minetest.net/viewtopic.php?id=509">Pagina di Download di MoreBlocks</a></p>
<h3>Minecarts</h3>
<p>Abbastanza autoesplicativa, i minecarts in stile MineCraft, pronti alla costruzione e all'uso!</p>
<p>Se volete viaggiar comodi, andate alla <a href="https://forum.minetest.net/viewtopic.php?id=2451">Pagina di Download della Mod</a></p>
<h3>RealTest</h3>
<p>Inserisci una forte vena di realismo nel gioco, permettendo di scavare alla ricerca di minerali vari, creare separatamente parti di attrezzi per poi unirle in un unico attrezzo, creare leghe di metalli, ecc...</p>
<p><a href="https://forum.minetest.net/viewtopic.php?id=2671">Link per il download</a></p>
<h3>Advanced Farming Mod</h3>
<p>Migliora ed integra la funzionalità di coltivazione di MineTest, per la felicità degli aspiranti agricoltori.</p>
<p>Io non sono ancora riuscito a farla funzionare.</p>
<p><a href="https://forum.minetest.net/viewtopic.php?id=2787">Link Per il download</a></p>
<h3>MESEcons</h3>
<p>E qui arriviamo al punto caldo della faccenda, questa mod introduce al MESE stone, una pietra con proprietà del tutto simili alla redstone di minecraft, proponendo fili di MESE con la possilibità di:</p>
<ul>
<li>Costruire e posizionare porte logiche di qualunque tipo, siano esse AND, OR, XOR, NAND ecc...</li>
<li>Costruire ed usare sensori solari</li>
<li>Costruire ed usare plafoniere luminose alimentate con MESE, ottime in combinazione con un sensore solare ed una porta NOT per avere la luce nella vostra casa appena fa buio.</li>
<li>Trasmettere i segnali in verticale senza dover faticare con metodi più o meno strani, semplicemente usando dei tratti di MESEcon verticali.</li>
</ul>
<p>E dulcis in fundo:</p>
<ul>
<li>Costruire ed usare un microprocessore programmabile in Lua!!</li>
</ul>
<p>Questo vi permette di costruire veri e propri minicomputer all'interno del gioco, per la felicità dei programmatori folli.</p>
<p>Se volete darvi da fare con le MESEcons, andate alla <a href="https://forum.minetest.net/viewtopic.php?id=628">pagina di Download</a></p>
<h3>HomeDecor</h3>
<p>Questa mod vi permetterà di costruire una barca, una montagna ed un sacco di oggetti che serviranno per arredare la vostra casa, tra i tanti:</p>
<ul>
<li>Porte a vetri</li>
<li>Comodini per la camera da letto (ci potete anche inserire degli oggetti)</li>
<li>Lampade da tavolo e da muro, per l'illuminazione</li>
<li>Tavoli in legno/vetro</li>
<li>Staccionate in legno e ringhiere in metallo</li>
<li>Molto altro.</li>
</ul>
<p>Se volete decorare la vostra casa non vi resta che andare alla <a href="https://forum.minetest.net/viewtopic.php?id=2041">Pagina di Download</a></p>
<h3>Technic</h3>
<p>Questa mod è dedicata agli amanti delle tecnologie avanzate, infatti con questa mod potrete introdurre in minetest nuovi blocchi (zinco, uranio e cromo) e nuove strumentazioni, tra cui:</p>
<ul>
<li>Pannelli solari per alimentare alcune macchine</li>
<li>Fornaci per creare leghe di metalli</li>
<li>Un tavolo per riparare gli attrezzi</li>
<li>Laser da minatore</li>
<li>Motoseghe</li>
<li>Torce elettriche</li>
<li>Campi di forza</li>
<li>E molto, molto altro.</li>
</ul>
<p>Se volete scaricare la mod ricordatevi che sono necessarie delle dipendenze (altre mod) specificate nella stessa pagina del download. <a href="https://forum.minetest.net/viewtopic.php?id=2538">Link alla pagina di Download</a></p>
<p>Assicuratevi di scegliere la versione "stable" e non il branch "master", dato che questa mod di minetest è ancora in fase di riscrittura.</p>
<p>Non vi resta che provare il gioco e tutte le mod immaginabili, scaricandolo dal <a href="http://minetest.net/">Sito Ufficiale</a>.</p>
<p>Buono scavo a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>TGX16.com: La turbografx 16 sul nostro browser!2013-08-30T00:00:00+02:002013-08-30T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-30:/gratis-sul-web/TGX16.html<p>Dopo la Sega Megadrive e la SNES ora portiamo la console di NEC sul nostro browser con TGX16.com .</p><h1>Dopo la Sega Megadrive e la SNES ora portiamo la console di NEC sul nostro browser con TGX16.com .</h1>
<p>Buongiorno a tutti, come ho fatto precedentemente con la <a href="https://penazarea.altervista.org/gratis-sul-web/SSega.html">Sega Megadrive</a> ed alcune <a href="https://penazarea.altervista.org/gratis-sul-web/SNESfun.html">console Nintendo</a> ora vi propongo un sito dove potrete giocare con i giochi della TurboGrafx-16 direttamente dal vostro browser: TGX16.com</p>
<p>Seppur non abbia potuto competere con i mostri sacri del mondo videoludico dei tempi la TurboGrafx-16 ha pur sempre venduto 5 milioni di unità e quindi vale la pena provare qualche gioco.</p>
<p>Come gli altri siti che vi ho proposto nei precedenti articoli è necessario un browser compatibile, una tastiera e flash installato.</p>
<p>Se volete iniziare a giocare su tgx16.com potete precipitarvi direttamente sul sito internet seguendo <a href="http://www.tgx16.com/">questo link</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>SNESfun: La SNES sul vostro browser2013-08-28T00:00:00+02:002013-08-28T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-28:/gratis-sul-web/SNESfun.html<p>Torniamo all'era dei 16Bit con SNESfun, un sito che ci permetterà di giocare a leggende videoludiche sul nostro browser.</p><h1>Torniamo all'era dei 16Bit con SNESfun, un sito che ci permetterà di giocare a leggende videoludiche sul nostro browser.</h1>
<p>Chi non ha mai sentito parlare di Super Nintendo, SNES o Super Famicon? Leggende del mondo videoludico create dalle vulcaniche menti degli amici della Nintendo. Giochi come Super Mario World, Legend of Zelda, Arkanoid riportano alla menti molti ricordi dei nostalgici dell'era dei 16Bit.</p>
<p>Se volete rivivere quei momenti potete montare sul vostro PC un emulatore, oppure potete navigare sul sito SNESfun, dove potrete giocare direttamente sul vostro browser moltissimi titoli che hanno fatto la storia del mondo videoludico.</p>
<p>Come con <a href="https://penazarea.altervista.org/gratis-sul-web/SSega.html">SSega</a>, dovete avere un browser compatibile, una tastiera e flash installato.</p>
<p>Se volete iniziare a giocare subito non vi resta che catapultarvi alla velocità della luce sul <a href="http://www.snesfun.com">sito di SNESfun</a> e iniziare a giocare!</p>
<p>Buon divertimento a tutti! Ci vediamo al prossimo articolo!</p>
<p>Penaz.</p>SSega: La megadrive sul vostro browser!!2013-08-26T00:00:00+02:002013-08-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-26:/gratis-sul-web/SSega.html<p>Chi non ricorda la celeberrima SEGA Megadrive (Genesis)? Con SSega potrete giocare i suoi migliori titoli sul vostro browser!</p><h1>Chi non ricorda la celeberrima SEGA Megadrive (Genesis)? Con SSega potrete giocare i suoi migliori titoli sul vostro browser!</h1>
<p>Buongiorno a tutti. Chi non ha mai visto una SEGA MegaDrive, conosciuta in America come SEGA Genesis? È una di quelle console che hanno fatto la storia dei videogiochi con titoli come la trilogia di Sonic The Hedgehog e la sorprendente tecnologia "Lock-On" usata in Sonic & Knuckles che permetteva di combinare Sonic & Knuckles con Sonic 3 o Sonic 2 e ottenere un gioco ancora diverso, rispettivamente Sonic 3 & Knuckles e Knuckles in Sonic 2. Ma non di solo Sonic vivevano i giocatori dell'era 16bit, infatti esistevano molti altri titoli, come Earthworm Jim, Fatal Fury e Altered Beast. Senza poi contare le espansioni che le sono state applicate come SEGA CD e la poco sfruttata 32X.</p>
<p>Se volete giocare a questi giochi su un sistema moderno potete dotarvi di un emulatore oppure andare su SSega, un sito che vi permette di giocare a molti titoli e modifiche di giochi della nostra cara console.</p>
<p>Se volete iniziare subito a giocare, basta avere una tastiera, un browser compatibile, flash installato e andare sulla <a href="http://www.ssega.com">pagina di SSega</a> ed armarsi di pazienza.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Imbrogliamo nella CLI di Linux con Cheat2013-08-22T00:00:00+02:002013-08-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-22:/misc/Cheat_CLI.html<p>Vi è mai capitato di usare un programma abbastanza spesso da capire a che serve ma non sufficientemente per ricordarne la sintassi? Ecco Cheat!</p><h1>Vi è mai capitato di usare un programma abbastanza spesso da capire a che serve ma non sufficientemente per ricordarne la sintassi? Ecco Cheat!</h1>
<p>Buongiorno a tutti, la linea di comando di Linux è decisamente flessibile e piena di programmi utili, ma non è sempre possibile ricordare la sintassi di tutti quanti, ecco che ci viene in soccorso Cheat, un piccolo script che ci suggerirà le forme più comuni usate per un certo programma.</p>
<p>La sintassi da usare è semplice:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cheat &lt;comando&gt;</span>
</code></pre></div>
<p>per esempio, per sapere come usare il programma TAR, basta dare:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cheat tar</span>
</code></pre></div>
<p>Ed il programma risponderà prontamente:</p>
<blockquote>
<p>To extract an uncompressed archive:
tar -xvf /path/to/foo.tar</p>
<p>To extract a .gz archive:
tar -xzvf /path/to/foo.tgz</p>
<p>To create a .gz archive:
tar -czvf /path/to/foo.tgz /path/to/foo/</p>
<p>To extract a .bz2 archive:
tar -xjvf /path/to/foo.tgz</p>
<p>To create a .bz2 archive:
tar -cjvf /path/to/foo.tgz /path/to/foo/</p>
</blockquote>
<p>Non vi resta che scaricarlo dalla <a href="https://github.com/chrisallenlane/cheat">pagina ufficiale di GitHub</a>, dove potrete trovare anche tutte le informazioni per installarlo.</p>
<p>Questo è quanto, come sempre ringrazio i miei informatori per questa chicca che posso proporvi.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Esploriamo Open Broadcaster Software2013-08-14T00:00:00+02:002013-08-14T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-14:/gratis-sul-web/OBS.html<p>Conosciamo da vicino un discreto programma per registrare ciò che avviene sul nostro schermo: Open Broadcaster Software.</p><h1>Conosciamo da vicino un discreto programma per registrare ciò che avviene sul nostro schermo: Open Broadcaster Software.</h1>
<p>Buongiorno a tutti, sotto consiglio di un amico oggi vi voglio proporre un programma per registrare su file le vostre prodezze informatiche, che riguardino software di disegno o videogiochi: Open Broadcaster Software.</p>
<p>Questo programma è in grado di registrare su file tutto ciò che avviene sullo schermo ed eventualmente effettuare il rendering diretto in un formato ideale per YouTube. Inoltre i video che ne escono sono estremamente leggeri, l'ideale per i trasferimenti tramite internet.</p>
<p>Il software funziona solo con Windows e richiede le DirectX versione 10 o superiore.</p>
<p>Se volete provarlo non vi resta che precipitarvi sul <a href="https://obsproject.com/index">Sito ufficiale</a> oppure andare nella sezione <a href="https://penazarea.altervista.org/Software_Multimedia.html">Multimedia</a> dei <a href="https://penazarea.altervista.org/Software_Gratis.html">software consigliati da me</a></p>
<p>Buona registrazione a tutti!</p>
<p>Saluti e alla prossima.</p>
<p>Penaz.</p>Wayland e Weston - Diamoci un'occhiata da vicino2013-08-13T00:00:00+02:002013-08-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-13:/misc/Wayland.html<p>Diamo un occhiata al discusso e attesissimo Wayland, il sistema che secondo alcuni sostituirà X.Org sui sistemi Linux.</p><h1>Diamo un occhiata al discusso e attesissimo Wayland, il sistema che secondo alcuni sostituirà X.Org sui sistemi Linux.</h1>
<p>Buongiorno a tutti. Oggi, un giorno prima dell'uscita ufficiale di KDE 4.11, voglio proporvi qualche schermata di Weston e Wayland una novità per molti, ma una realtà che si sta facendo avanti con molta forza nel mondo del pinguino.</p>
<h2>Cos'è Wayland?</h2>
<p>Wayland è un protocollo per un Window Compositor, e viene inteso come rimpiazzo per X.Org nei sistemi Linux, anche se più semplice, snello e veloce.</p>
<h2>Cos'è Weston?</h2>
<p>Weston è il Window Compositor predefinito di Wayland, molto semplice e snello, facendo un paragone forzato possiamo dire che è l'equivalente wayland di TWM, anche se Weston fa qualcosa in più.</p>
<h2>Essendo un protocollo nuovo, le mie applicazioni X smetteranno di funzionare?</h2>
<p>Si e no. I ragazzi incaricati dello sviluppo hanno pensato a XWayland; un sistema che permette ad un X.Org server modificato di funzionare come se fosse parte di Wayland. Maggiori dettagli si possono trovare alla <a href="http://wayland.freedesktop.org/xserver.html">pagina dedicata</a></p>
<h2>Wayland funziona su Gentoo?</h2>
<p>Non nativamente. Infatti richiede che il sistema fornisca una struttura base di variabili d'ambiente, come ad esempio la variabile XDG_RUNTIME_DIR; che gentoo non fornisce.</p>
<h2>Quindi Wayland non funziona su Gentoo...</h2>
<p>Non ho detto questo, infatti è possibile fare in modo che Gentoo possa fornire tale variabile. Le istruzioni approfondite su come fare si possono trovare nella sezione "Building" del sito ufficiale, nella parte dedicata alla variabile <code>$XDG_RUNTIME_DIR</code>. Potete arrivarci direttamente seguendo <a href="http://wayland.freedesktop.org/building.html"">questo link</a></p>
<h2>Come siamo messi con le prestazioni?</h2>
<p>Wayland e Weston sono stati creati per risolvere i grossi problemi che affliggono X.Org da molto tempo, tra cui anche i vari cali prestazionali che ci possono essere. Wayland si rivolge direttamente a DRI2 per il controllo della scheda, così da controllare ogni singolo frame che viene buttato sullo schermo. Grazie alla nuova struttura e a questo controllo le prestazioni sono tutt'altro che scarse.</p>
<h2>Quindi potrò usare Wayland sul mio vecchio PC a 500MHz, giusto?</h2>
<p>Adesso non esageriamo. Infatti Wayland, data la sua struttura, ha bisogno di hardware leggermente meno vetusto; precisamente:</p>
<ul>
<li>Una scheda Intel del tipo i915 o superiore (Si parla di giugno 2004).</li>
<li>Una scheda ATI con drivers opensource (Niente fglrx o catalyst), si ipotizza che funzioni fino alla serie 7000 (Anno 2000 circa)</li>
<li>Una scheda NVidia con i driver opensource Nouveau.</li>
<li>È possibile compilare wayland anche per Raspberry Pi.</li>
</ul>
<h2>Mi avevi promesso che c'erano degli screen!!!</h2>
<p>Infatti, eccoli qui:</p>
<p><img alt="Wayland - Schermata 1" src="https://penazarea.altervista.org/images/2013/08/wayland-1.png" /></p>
<p><img alt="Wayland - Schermata 2" src="https://penazarea.altervista.org/images/2013/08/wayland-2.png" /></p>
<p><img alt="Wayland - Schermata 3" src="https://penazarea.altervista.org/images/2013/08/wayland-3.png" /></p>
<p><img alt="Wayland - Schermata 4" src="https://penazarea.altervista.org/images/2013/08/wayland-4.png" /></p>
<p>Questi sono degli screenshot di Weston, non sono molti ma danno un'idea di com'è l'ambiente di base.</p>
<h2>E Com'è?</h2>
<p>Decisamente veloce ad avviarsi, il cursore risponde un po' lentamente, ma probabilmente con qualche modifica alle impostazioni è possibile dargli un po' più di vita. Mi piace il fatto che occupi poco spazio in memoria e poco tempo di CPU, il che lo rende ottimo per sistemi mobili e netbooks con poca potenza a disposizione.</p>
<h2>All'inizio hai citato KDE 4.11: Perchè?</h2>
<p>Perchè KDE 4.11 sarà la prima versione di KDE ad avere il supporto sperimentale per Wayland, ecco perchè...</p>
<h2>Qualche considerazione finale?</h2>
<p>Si, Wayland sembra già funzionare benino e col tempo spero migliori dato che faccio parte della ben nutrita schiera di coloro che non vedono l'ora di cacciare X.Org e tutti i problemi ad esso collegati dai propri sistemi informatici.</p>
<p>L'installazione, a parte il settaggio di una variabile è stata totalmente indolore, nessuna configurazione da fare, nessun file da modificare, è bastata un</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge wayland weston</span>
</code></pre></div>
<p>seguito da un bel</p>
<div class="codehilite"><pre><span></span><code><span class="err">weston-launch</span>
</code></pre></div>
<p>E mi sono trovato davanti l'interfaccia base di weston, che ho trovato decisamente pulita e confortevole.</p>
<p>Incrocio le dita mentre vi saluto.</p>
<p>Alla prossima!</p>
<p>Penaz.</p>Disattivare il touchpad all'inserimento del mouse2013-08-02T00:00:00+02:002013-08-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-08-02:/misc/Mouse_Touchpad.html<p>Impostiamo la disattivazione e riattivazione automatica del touchpad all'inserimento/disinserimento di un mouse USB sul nostro portatile Linux.</p><h1>Impostiamo la disattivazione e riattivazione automatica del touchpad all'inserimento/disinserimento di un mouse USB sul nostro portatile Linux.</h1>
<p>Buongiorno a tutti, tutti i portatili hanno un touchpad con cui potete tranquillamente guidare il vostro cursore; ma se avete un mouse inserito potrebbe il touchpad stesso, da strumento di indubbia utilità potrebbe trasformarsi in una forte fonte di fastidio, soprattutto durante la digitazione. Allora perchè non disattivarlo all'inserimento del nostro fidato mouse USB per poi riattivarlo automaticamente quando lo stacchiamo nuovamente?</p>
<p>Su Windows questa funzionalità è quasi sempre già inclusa ma su linux potrebbe essere necessaria qualche piccola operazione di manutenzione prima di aver accesso a questa fantastica funzionalità che funzionerà in maniera praticamente istantanea.</p>
<p>Vediamo i programmi necessari (solitamente installati in ogni distribuzione):</p>
<ul>
<li>Udev</li>
<li>I driver xf86-input-synaptics</li>
</ul>
<p>Dopo alcune prove ho trovato il comando che permette di disattivare e riattivare il touchpad da linea di comando:</p>
<div class="codehilite"><pre><span></span><code>synclient <span class="nv">TouchPadOff</span><span class="o">=</span><span class="m">1</span>
</code></pre></div>
<p>Per disattivare il touchpad mentre</p>
<div class="codehilite"><pre><span></span><code>synclient <span class="nv">TouchPadOff</span><span class="o">=</span><span class="m">0</span>
</code></pre></div>
<p>per la riattivazione, allora ho deciso di creare un paio di piccoli script che mi permettessero di attivare e disattivare rapidamente il touchpad, eccoli qui sotto.</p>
<p>Per l'attivazione:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/sh</span>
su <span class="sb">`</span>users<span class="p">|</span>awk <span class="s1">'{print $1}'</span><span class="sb">`</span> -c <span class="s1">'notify-send "Mouse-Touchpad Management" "Mouse Removed, Switching to Touchpad" -t 500 -i /home/penaz/.mouse/Mouse.png'</span>
synclient <span class="nv">TouchpadOff</span><span class="o">=</span><span class="m">0</span>
</code></pre></div>
<p>Per la disattivazione:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/sh</span>
su <span class="sb">`</span>users<span class="p">|</span>awk <span class="s1">'{print $1}'</span><span class="sb">`</span> -c <span class="s1">'notify-send "Mouse-Touchpad Management" "Mouse Detected, Disabling Touchpad" -t 500 -i /home/penaz/.mouse/Mouse.png'</span>
synclient <span class="nv">TouchpadOff</span><span class="o">=</span><span class="m">1</span>
</code></pre></div>
<p>Agli script ho aggiunto una riga per creare un avviso che mi notificasse dell'avvenuto inserimento o disinserimento del mouse il tutto è salvato nella home nella sottocartella ".mouse". Ora non ci resta che creare una regola per UDev.</p>
<div class="codehilite"><pre><span></span><code><span class="err">cd /etc/udev/rules.d</span>
<span class="err">vi 01-touchpad.rules</span>
</code></pre></div>
<p>e inserire questa regola:</p>
<blockquote>
<p>ACTION=="add", SUBSYSTEM=="input", KERNEL=="mouse[0-9]", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/penaz/.Xauthority", ENV{ID_CLASS}="mouse", ENV{REMOVE_CMD}="/home/penaz/.mouse/enable.sh", RUN+="/home/penaz/.mouse/disable.sh"</p>
</blockquote>
<p>Ora non ci resta che riavviare il sistema in modo che Udev riconosca la nuova regola e goderci il nostro nuovo modo di lavorare comodamente, passando velocissimamente da mouse a touchpad.</p>
<p>Questo metodo è stato provato da me con gentoo-linux, riadattando un metodo usato su archlinux ma penso possa essere usato su praticamente tutte le distribuzioni più conosciute.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Scatenate il vostro estro artistico con Silk!2013-07-31T00:00:00+02:002013-07-31T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-07-31:/misc/Silk.html<p>Conosciamo Silk, un sito per dare sfogo al nostro estro artistico represso dalla vita di tutti i giorni.</p><h1>Conosciamo Silk, un sito per dare sfogo al nostro estro artistico represso dalla vita di tutti i giorni.</h1>
<p>Buongiorno a tutti, oggi voglio farvi conoscere un sito molto interessante; il suo nome è Silk e si propone come un sito di "Interactive Generative Art", in parole povere ci permette di fare disegni in stile astratto velocemente e con una facilità impressionante, come se avessimo in mano un pennarello che disegnasse con la seta.</p>
<p><img alt="Esempio disegno di Silk" src="https://penazarea.altervista.org/images/2013/07/silk.png" /></p>
<p>Tra gli effetti disponibili troviamo:</p>
<ul>
<li>la simmetria centrale della linea che stiamo disegnando</li>
<li>una riproduzione "a spirale" della linea che stiamo disegnando</li>
<li>simmetria rotazionale di vario tipo</li>
<li>possibilità di scelta di colori e di creare sfumature tra due diversi colori</li>
<li>una musica di sottofondo rilassante che può tranquillamente essere disattivata</li>
<li>possibilità di salvare e/o condividere i propri capolavori</li>
</ul>
<p>Quindi se state cercando di creare un wallpaper astratto "stile seta" potete tranquillamente crearlo senza alcuna fatica e anche divertendovi e rilassandovi nel frattempo.</p>
<p>Il sito è molto semplice da usare e comunque visualizza su schermo alcuni suggerimenti che possono aiutarvi nell'utilizzo anche se sinceramente l'unica cosa che può farvi imparare veramente come usare questo sito (e anche darvi grosse e soprattutto inaspettate soddisfazioni) è quella di provare una ad una (o perchè no, due a due :D) le funzioni che Silk ci offre.</p>
<p><strong>Tutte le opere d'arte generate sono sottoposte a licenza <a href="https://creativecommons.org/licenses/by/3.0/deed.en_US">Creative Commons di tipo "by"</a></strong></p>
<p>Se volete provarlo non vi resta che <a href="http://weavesilk.com/">recarvi sul sito</a> ed iniziare immediatamente a disegnare.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Impariamo VIM: Omnicomplete2013-07-27T00:00:00+02:002013-07-27T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-07-27:/misc/VIM14.html<p>Impariamo come attivare ed usare la funzione "Omnicomplete" di VIM e rendiamola più semplice da usare.</p><h1>Impariamo come attivare ed usare la funzione "Omnicomplete" di VIM e rendiamola più semplice da usare.</h1>
<p>Buongiorno a tutti, se siete programmatori, sicuramente avete sentito parlare della funzione "IntelliSense®" di VisualStudio, VIM ha una funzione simile. Si chiama omnicomplete ed è divenuta "stabile" da vim 7.3.</p>
<p>Per attivare la funzione di omnicomplete è sufficiente inserire la seguente riga nel nostro .vimrc:</p>
<blockquote>
<p>filetype plugin on
set omnifunc=syntaxcomplete#Complete</p>
</blockquote>
<p>Dopodichè per attivare il menu di autocompletamento è sufficiente premere in successione le combinazioni CTRL-X e CTRL-O.</p>
<p>La funzione di completamento che vi ho proposto qui si basa sull'evidenziazione della sintassi di VIM, anche se per alcuni linguaggi esistono funzioni migliori, ma questa farà al caso nostro...</p>
<p>Consiglio inoltre di aggiungere la seguente riga:</p>
<blockquote>
<p>set completeopt+=longest</p>
</blockquote>
<p>che ci permetterà di prendere in considerazione il prefisso comune più lungo, rendendo meno tediosa la ricerca di una corrispondenza.</p>
<p>Dover premere due combinazioni di pulsanti è abbastanza fastidioso, quindi useremo uno dei tanti plugins di VIM: SuperTab.</p>
<p>Per installarlo in gentoo è sufficiente, come sempre, usare emerge:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge SuperTab</span>
</code></pre></div>
<p>Ora è sufficiente aggiungere un'altra riga al nostro carissimo .vimrc:</p>
<blockquote>
<p>let g:SuperTabDefaultCompletionType="<C-X><C-O>"</p>
</blockquote>
<p>Ora sarà sufficiente usare il tasto Tab per aprire il menu di omnicomplete.</p>
<p>Quindi per riassumere, per usare omnicomplete e SuperTab dovremmo aggiungere al nostro .vimrc:</p>
<blockquote>
<p>filetype plugin on
set omnifunc=syntaxcomplete#Complete
let g:SuperTabDefaultCompletionType="<C-X><C-O>"
set completeopt+=longest</p>
</blockquote>
<p><strong>SuperTab non è compatibile con un altro plugin di VIM: SnipMate, quindi potreste avere dei problemi.</strong></p>
<p>Questo è quanto, buon omnicompletamento!</p>
<p>Penaz.</p>Man: Coloriamo l'output dei manuali di Linux2013-07-25T00:00:00+02:002013-07-25T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-07-25:/misc/Colored_Manpages.html<p>Se abbiamo un terminale che supporta i colori perchè non colorare l'output di Man per renderlo più chiaro?</p><h1>Se abbiamo un terminale che supporta i colori perchè non colorare l'output di Man per renderlo più chiaro?</h1>
<p>Salve a tutti, oggi voglio proporvi un paio di piccoli trucchi che vi permetteranno di colorare l'output di Man, in modo da renderlo più comprensibile.</p>
<p><img alt="Output Man Colorato" src="https://penazarea.altervista.org/images/2013/07/manshot.jpg" /></p>
<p>Man è un comando conosciutissimo da tutti gli utenti linux e serve per visualizzare le pagine di aiuto, lo stile con cui vengono formattate le pagine di aiuto è processato da nroff e poi visualizzato da un pager come "Less" per esempio.</p>
<p>Utilizzando il comando</p>
<div class="codehilite"><pre><span></span><code><span class="err">nroff -man /path/file/aiuto.1 | less</span>
</code></pre></div>
<p>otterrete praticamente lo stesso risultato.</p>
<p>Vediamo come fare per colorare il nostro output.</p>
<h2>Metodo 1:</h2>
<p>Il primo metodo che vi propongo è molto semplice, è sufficiente installare "Most", su gentoo basta usare il seguente comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge most</span>
</code></pre></div>
<p>e dopodichè sarà sufficiente cambiare la variabile $PAGER con il percorso in cui avete installato most.</p>
<div class="codehilite"><pre><span></span><code><span class="err">export PAGER=/usr/bin/most</span>
</code></pre></div>
<p>se volete che la modifica sia definitiva tale comando dovrà essere inserito all'interno del vostro .bashrc o .zshrc, a seconda della console che usate.</p>
<h2>Metodo 2:</h2>
<p>Il secondo metodo è un po' più complesso, ma ve lo consiglio caldamente perchè potrete continuare ad usare "less", che ha più funzioni rispetto a most. E poi è presente in praticamente qualunque distribuzione di Linux.</p>
<p>Aggiungete quanto segue al vostro .bashrc o .zshrc</p>
<div class="codehilite"><pre><span></span><code><span class="err">export LESS_TERMCAP_mb=$'\E[01;31m' # Inizio testo lampeggiante</span>
<span class="err">export LESS_TERMCAP_md=$'\E[01;38;5;74m' # Inizio grassetto</span>
<span class="err">export LESS_TERMCAP_me=$'\E[0m' # Fine</span>
<span class="err">export LESS_TERMCAP_se=$'\E[0m' # Fine modo standout</span>
<span class="err">export LESS_TERMCAP_so=$'\E[48;5;25m' # Inizio standout</span>
<span class="err">export LESS_TERMCAP_ue=$'\E[0m' # fine sottolineato</span>
<span class="err">export LESS_TERMCAP_us=$'\E[04;38;5;146m' # Inizio sottolineato</span>
</code></pre></div>
<p>Quando riavvierete la console, automaticamente l'output sarà colorato, se ciò non accadesse sarà necessario fare qualche verifica...</p>
<p>Ovviamente se volete potete tranquillamente modificare i colori come preferite. In questo caso potete fare riferimento alla pagina di wikipedia riguardante gli "ANSI escape codes", seguendo <a href="http://en.wikipedia.org/wiki/ANSI_escape_code">questo link</a>.</p>
<h3>Verifiche da fare in caso di problemi</h3>
<p>Se l'output non si colora allora sono necessarie alcune verifiche. Iniziamo!</p>
<h4>Prima verifica:</h4>
<p>Digitate questo comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">typeset -p LESS_TERMCAP_md | cat -v</span>
</code></pre></div>
<p>Il terminale dovrebbe rispondervi con:</p>
<blockquote>
<p>typeset -x LESS_TERMCAP_md="^[[01;31m"</p>
</blockquote>
<p>E digitando quest'altro comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">typeset -p LESS</span>
</code></pre></div>
<p>Dovrebbe ritornarvi:</p>
<blockquote>
<p>typeset -x LESS="-r"</p>
</blockquote>
<p>Se ciò non accade, allora probabilmente avete inserito gli Export nel file sbagliato, controllatelo, ma il parametro "-r" non sempre è necessario...</p>
<h4>Seconda verifica:</h4>
<p>Il comando seguente:</p>
<div class="codehilite"><pre><span></span><code>echo "<span class="cp">${</span><span class="n">LESS_TERMCAP_md</span><span class="cp">}</span>azzurro<span class="cp">${</span><span class="n">LESS_TERMCAP_me</span><span class="cp">}</span>"
</code></pre></div>
<p>dovrebbe tornarvi:</p>
<blockquote>
<p><span style="color: #ff0000;"><span style="color: #00ccff;">azzurro</span> </span></p>
</blockquote>
<p>con le impostazioni che vi ho proposto. Se non accade, qualcosa non va con le impostazioni con il vostro terminale.</p>
<h4>Terza verifica:</h4>
<p>il comando seguente:</p>
<div class="codehilite"><pre><span></span><code><span class="err">bzcat /usr/share/man/man1/ls.1.bz2 | /bin/sh /usr/bin/nroff -mandoc -Tutf8 | head -n 5 | cat -v</span>
</code></pre></div>
<p>Dovrebbe scrivervi le prime righe dell'aiuto di ls, in questo modo:</p>
<div class="codehilite"><pre><span></span><code><span class="n">LS</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">User</span> <span class="n">Commands</span> <span class="n">LS</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">N</span><span class="o">^</span><span class="n">HNA</span><span class="o">^</span><span class="n">HAM</span><span class="o">^</span><span class="n">HME</span><span class="o">^</span><span class="n">HE</span>
</code></pre></div>
<p>Se invece vi ritrovate una cosa del genere:</p>
<div class="codehilite"><pre><span></span><code><span class="n">LS</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="k">User</span> <span class="n">Commands</span> <span class="n">LS</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="o">^</span><span class="p">[[</span><span class="mi">1</span><span class="n">mNAME</span><span class="o">^</span><span class="p">[[</span><span class="mi">0</span><span class="n">m</span>
</code></pre></div>
<p>La colpa è delle "sgr escape sequences", dovete disattivarle. In Zsh basta aggiungere a .zshrc la seguente riga:</p>
<blockquote>
<p>export GROFF_NO_SGR=1</p>
</blockquote>
<p>Questo è quanto, ora tutto dovrebbe essere bello colorato.</p>
<p>Buona colorazione a tutti!</p>
<p>Saluti, Penaz.</p>Polygen: Divertiamoci con un fantastico generatori di frasi2013-07-23T00:00:00+02:002013-07-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-07-23:/misc/Polygen.html<p>Scopriamo PolyGen, un generatore di frasi molto carino che sicuramente ci strapperà qualche sorriso.</p><h1>Scopriamo PolyGen, un generatore di frasi molto carino che sicuramente ci strapperà qualche sorriso.</h1>
<p>Buongiorno a tutti, oggi vi voglio presentare Polygen un programma che genera delle frasi casuali, data una definizione grammaticale.</p>
<blockquote>
<p>Formalmente è un interprete di un metalinguaggio che permette di definire linguaggi.</p>
</blockquote>
<p>Il programma in sè è molto serio, ma viene spesso usato come parodia della vita di tutti i giorni, fatta di frasi di vario genere, che vanno dall'ambiente familiare, passando per quello lavorativo, commerciale e pubblicitario, "dissacrando" uno ad uno questi ambienti.</p>
<p>Se volete scaricarlo potete recarvi sul <a href="http://www.polygen.org/">Sito ufficiale</a>, inoltre se volete, accedendo alle grammatiche sulla colonna sinistra del sito potete avere in tempo reale un assaggio di ciò che Polygen può fare.</p>
<p>Trovo molto carine le ordinanze di blocco del traffico e alcune grammatiche della categoria tecnologia, sicuramente da guardare, oltretutto sono sempre diverse dato che vengono generate in tempo reale.</p>
<p>Il metalinguaggio usato da Polygen è completamente documentato e semplice da capire, perciò potete tranquillamente creare la vostra personalissima grammatica in pochissimo tempo.</p>Conky: un monitor di sistema leggero leggero2013-07-20T00:00:00+02:002013-07-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-07-20:/misc/Conky.html<p>Presentazione di Conky, un misuratore di prestazioni leggerissimo per Linux e BSD.</p><h1>Presentazione di Conky, un misuratore di prestazioni leggerissimo per Linux e BSD.</h1>
<p><img style="float: right;" src="https://penazarea.altervista.org/images/2013/07/conkyshot.jpg" alt="Screenshot di Conky" /></p>
<p>Dopo un lungo periodo di pausa ricominciamo coi fuochi d'artificio con Conky, un completissimo monitor di sistema per X, che funziona perfettamente su Linux e BSD.</p>
<p>Diversamente da altri sistemi simili Conky usa solamente un file di testo (~/.conkyrc) per definire la struttura del monitor di sistema, ma non per questo risulta scarno o brutto da vedere; infatti tra gli effetti troviamo addirittura le trasparenze (quelle vere).</p>
<p>Tra i monitor di sistema che possiamo includere nella nostra Conky troviamo:</p>
<ul>
<li>CPU: Rappresentati tramite Grafici, Barre e percentuali</li>
<li>RAM: Sempre rappresentabili tramite Barre, Percentuali e Grafici</li>
<li>Visualizzazione dello spazio nelle partizioni</li>
<li>Temperatura dell'Hardware</li>
<li>Indirizzi IP di LAN e WLAN</li>
<li>Qualità del segnale WLAN</li>
<li>MAC dell'access point a cui siete connessi (io lo uso per capire a quale ripetitore sono connesso)</li>
<li>Status del nostro player multimediale preferito</li>
<li>Carica residua della batteria</li>
<li>Output di programmi eseguiti ad intervalli regolari</li>
<li>Molto altro ancora...</li>
</ul>
<p><strong>Dalla versione 1.10, conky ora usa una nuova sintassi per i file di configurazione, completamente incompatibile con le versioni precedenti, io ho adattato questa configurazione alla nuova versione</strong></p>
<p>Quello che vedete qui è il mio monitor di sistema che uso io, sul mio desktop KDE, contiene molte informazioni utili per sapere sempre come sta il mio portatile, il codice è presente qui sotto:</p>
<p><br />
<br /></p>
<div class="codehilite"><pre><span></span><code>conky.config = {
own_window = true,
own_window_class = 'Conky',
own_window_type = 'desktop',
own_window_hints = 'undecorated, below, sticky, skip_taskbar, skip_pager',
own_window_transparent = false,
own_window_argb_visual = true,
own_window_argb_value = 200,
background = true,
update_interval = 2,
temperature_unit = 'celsius',
double_buffer = true,
use_xft = true,
maximum_width = 400,
alignment = 'top_left',
gap_x = 50,
gap_y = 50,
default_color = 'gray',
minimum_width = 250, minimum_height = 615,
border_inner_margin = 5,
text_buffer_size = 512,
};
conky.text = [[
<span class="cp">${</span><span class="n">font</span> <span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">18</span><span class="cp">}${</span><span class="n">color</span> <span class="n">DarkSlateGrey</span><span class="cp">}</span><span class="nv">$alignc</span><span class="cp">${</span><span class="n">nodename</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">font</span> <span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}</span><span class="nv">$alignc</span> Con Kernel <span class="cp">${</span><span class="n">kernel</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>CARICO DI SISTEMA <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="nv">$alignc</span> 1': <span class="cp">${</span><span class="n">loadavg</span> <span class="mi">1</span><span class="cp">}</span> - 5': <span class="cp">${</span><span class="n">loadavg</span> <span class="mi">2</span><span class="cp">}</span> - 15': <span class="cp">${</span><span class="n">loadavg</span> <span class="mi">3</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>PROCESSORI <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="nv">$alignc</span><span class="cp">${</span><span class="n">cpugraph</span> <span class="n">cpu0</span> <span class="mi">50</span><span class="p">,</span><span class="mi">230</span><span class="cp">}</span>
<span class="nv">$alignc</span> In uso: <span class="cp">${</span><span class="n">cpu</span> <span class="n">cpu0</span><span class="cp">}</span>%
<span class="cp">${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>MEMORIA <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="nv">$alignc</span><span class="cp">${</span><span class="n">memgraph</span> <span class="mi">50</span><span class="p">,</span><span class="mi">230</span><span class="cp">}</span>
<span class="nv">$alignc</span> In uso: <span class="cp">${</span><span class="n">mem</span><span class="cp">}</span>/<span class="cp">${</span><span class="n">memmax</span><span class="cp">}</span> - (<span class="cp">${</span><span class="n">memperc</span><span class="cp">}</span>%)
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>FILE SYSTEM <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="nv">$alignr</span> Root: <span class="cp">${</span><span class="n">fs_bar</span> <span class="mi">5</span><span class="p">,</span><span class="mi">200</span> <span class="o">/</span><span class="cp">}</span>
<span class="nv">$alignr</span> Home: <span class="cp">${</span><span class="n">fs_bar</span> <span class="mi">5</span><span class="p">,</span><span class="mi">200</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">penaz</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>TEMPERATURA <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">20</span><span class="cp">}</span><span class="nv">$alignc</span><span class="cp">${</span><span class="n">acpitemp</span><span class="cp">}</span> C
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>NETWORK <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">if_up</span> <span class="n">wlp13s0b1</span><span class="cp">}</span>
<span class="nv">$alignc</span> Qualita' WiFi:<span class="cp">${</span><span class="n">wireless_link_qual_perc</span> <span class="n">wlp13s0b1</span><span class="cp">}</span> %
<span class="nv">$alignc</span> IP Corrente WLAN: <span class="cp">${</span><span class="n">addr</span> <span class="n">wlp13s0b1</span><span class="cp">}</span>
<span class="nv">$alignc</span> MAC APN: <span class="cp">${</span><span class="n">wireless_ap</span> <span class="n">wlp13s0b1</span><span class="cp">}</span><span class="nv">$else</span> <span class="nv">$alignc</span> WiFi Disattivata
<span class="nv">$endif</span>
<span class="nv">$alignc</span> IP Corrente ETH0: <span class="cp">${</span><span class="n">addr</span> <span class="n">eno1</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>BATTERIA <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">battery_bar</span> <span class="mi">5</span><span class="p">,</span><span class="mi">210</span> <span class="n">BAT0</span><span class="cp">}</span><span class="nv">$alignr</span><span class="cp">${</span><span class="n">battery_percent</span><span class="cp">}</span>%
<span class="cp">${</span><span class="n">if_match</span> <span class="s2">"${battery BAT0</span><span class="cp">}</span>"=="AC"}<span class="nv">$alignc</span> Batteria Carica <span class="nv">$else</span> Tempo Rimanente: <span class="cp">${</span><span class="n">battery_time</span> <span class="n">BAT0</span><span class="cp">}</span><span class="nv">$endif</span>
<span class="cp">${</span><span class="n">voffset</span> <span class="mi">5</span><span class="cp">}${</span><span class="n">font</span> <span class="n">Arial</span><span class="p">:</span><span class="n">bold</span><span class="p">:</span><span class="n">size</span><span class="o">=</span><span class="mi">10</span><span class="cp">}${</span><span class="n">color</span> <span class="n">Orange</span><span class="cp">}</span>IN RIPRODUZIONE <span class="cp">${</span><span class="n">color</span> <span class="n">DarkSlateGray</span><span class="cp">}${</span><span class="n">hr</span> <span class="mi">2</span><span class="cp">}</span>
<span class="cp">${</span><span class="n">if_mpd_playing</span><span class="cp">}</span>
<span class="nv">$alignc$mpd_artist</span>
<span class="nv">$alignc$mpd_title</span>
<span class="nv">$alignc</span><span class="cp">${</span><span class="n">mpd_bar</span> <span class="mi">5</span><span class="p">,</span><span class="mi">230</span><span class="cp">}</span>
<span class="nv">$else</span>
<span class="nv">$alignc</span> -----------------------------------
<span class="nv">$alignc</span> ..:Nessun Brano in riproduzione:..
<span class="nv">$alignc</span> -----------------------------------
<span class="nv">$endif</span>
]];
</code></pre></div>
<p>Lo script è diviso in 2 macrosezioni, la prima sono le impostazioni generali (conky.config), poi la sezione "conky.text" rappresenta il punto da cui inizia la vera e propria rappresentazione dell'oggetto che vogliamo costruire. Ogni oggetto costruito viene scritto in un modo che ricorda molto da vicino l'uso delle variabili negli script di Bash quindi per coloro che hanno già fatto qualche scriptino non dovrebbero esserci troppi problemi.</p>
<p>Purtroppo alcune volte Conky si avvia con il fondo "tagliato", il problema si risolve abbastanza tranquillamente impostando l'altezza minima al valore che vogliamo avere, tramite il valore</p>
<blockquote>
<p>minimum_size (larghezza) (altezza)</p>
</blockquote>
<p>Perciò se volete un monitor di sistema leggero e minimale, ottimo per Window Manager come OpenBox, Conky fa per voi. Questo monitor nello specifico consuma dallo 0.2% allo 0.7% ogni 2 secondi (l'intervallo di aggiornamento) mentre nel tempo che intercorre tra un aggiornamento e l'altro resta in IDLE.</p>
<p>Se volete scaricare Conky potete recarvi sul <a href="http://conky.sourceforge.net/">Sito Ufficiale</a>, mentre se volete qualche idea o suggerimento su come usare al meglio il programma vi consiglio <a href="http://conky.pitstop.free.fr/">Conky PitStop</a>.</p>
<p>Questo è quanto. Buon monitoraggio a tutti!</p>
<p>Penaz.</p>Un piccolo traduttore Albhed2013-06-28T00:00:00+02:002013-06-28T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-28:/coding/Albhed.html<p>Se avete giocato a Final Fantasy X o al suo seguito X-2 potrebbe esservi utile questo piccolo programma di traduzione Albhed.</p><h1>Se avete giocato a Final Fantasy X o al suo seguito X-2 potrebbe esservi utile questo piccolo programma di traduzione Albhed.</h1>
<p>Buongiorno a tutti, se avete giocato a Final Fantasy X o Final Fantasy X-2 non potete non conoscere gli Albhed, riconoscibili per la loro lingua, a prima vista incomprensibile.</p>
<p>Un mio amico mi ha chiesto se era possibile creare un traduttore bidirezionale Italiano - Albhed, dandomi i parametri su cui era basata questa "lingua". La lingua Albhed si basa su un sistema simile al <a href="http://it.wikipedia.org/wiki/ROT13">ROT-13</a> infatti ogni lettera nel linguaggio Albhed corrisponde ad un'altra lettera nell'Italiano. Con l'uso di un dizionario ed un po' di espressioni regolari è possibile costruire un traduttore veloce con pochissime righe di codice.</p>
<p>Ecco il codice completo:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="c1">#Il dizionario principale Italiano -> Albhed</span>
<span class="n">sys</span><span class="o">=</span><span class="p">{</span><span class="s2">"a"</span><span class="p">:</span><span class="s2">"y"</span><span class="p">,</span><span class="s2">"b"</span><span class="p">:</span><span class="s2">"p"</span><span class="p">,</span><span class="s2">"c"</span><span class="p">:</span><span class="s2">"l"</span><span class="p">,</span><span class="s2">"d"</span><span class="p">:</span><span class="s2">"t"</span><span class="p">,</span><span class="s2">"e"</span><span class="p">:</span><span class="s2">"a"</span><span class="p">,</span><span class="s2">"f"</span><span class="p">:</span><span class="s2">"v"</span><span class="p">,</span><span class="s2">"g"</span><span class="p">:</span><span class="s2">"k"</span><span class="p">,</span><span class="s2">"h"</span><span class="p">:</span><span class="s2">"r"</span><span class="p">,</span><span class="s2">"i"</span><span class="p">:</span><span class="s2">"e"</span><span class="p">,</span><span class="s2">"j"</span><span class="p">:</span><span class="s2">"z"</span><span class="p">,</span><span class="s2">"k"</span><span class="p">:</span><span class="s2">"g"</span><span class="p">,</span><span class="s2">"l"</span><span class="p">:</span><span class="s2">"m"</span><span class="p">,</span><span class="s2">"m"</span><span class="p">:</span><span class="s2">"s"</span><span class="p">,</span><span class="s2">"n"</span><span class="p">:</span><span class="s2">"h"</span><span class="p">,</span><span class="s2">"o"</span><span class="p">:</span><span class="s2">"u"</span><span class="p">,</span><span class="s2">"p"</span><span class="p">:</span><span class="s2">"b"</span><span class="p">,</span><span class="s2">"q"</span><span class="p">:</span><span class="s2">"x"</span><span class="p">,</span><span class="s2">"r"</span><span class="p">:</span><span class="s2">"n"</span><span class="p">,</span><span class="s2">"s"</span><span class="p">:</span><span class="s2">"c"</span><span class="p">,</span><span class="s2">"t"</span><span class="p">:</span><span class="s2">"d"</span><span class="p">,</span><span class="s2">"u"</span><span class="p">:</span><span class="s2">"i"</span><span class="p">,</span><span class="s2">"v"</span><span class="p">:</span><span class="s2">"j"</span><span class="p">,</span><span class="s2">"w"</span><span class="p">:</span><span class="s2">"f"</span><span class="p">,</span><span class="s2">"x"</span><span class="p">:</span><span class="s2">"q"</span><span class="p">,</span><span class="s2">"y"</span><span class="p">:</span><span class="s2">"o"</span><span class="p">,</span><span class="s2">"z"</span><span class="p">:</span><span class="s2">"w"</span><span class="p">,</span><span class="s2">" "</span><span class="p">:</span><span class="s2">" "</span><span class="p">}</span>
<span class="c1">#Perchè faticare per riscrivere il dizionario? Facciamolo fare a Python</span>
<span class="n">sys2</span><span class="o">=</span><span class="p">{</span><span class="n">sys</span><span class="p">[</span><span class="n">x</span><span class="p">]:</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">sys</span><span class="p">}</span>
<span class="c1"># ---- Inizio del programma ----</span>
<span class="nb">print</span> <span class="s2">"albhed Translator - By Penaz"</span>
<span class="n">valid</span><span class="o">=</span><span class="kc">False</span>
<span class="k">global</span> <span class="n">ch</span>
<span class="k">while</span> <span class="p">(</span><span class="ow">not</span> <span class="n">valid</span><span class="p">):</span>
<span class="nb">print</span> <span class="mi">90</span><span class="o">*</span><span class="s2">"-"</span>
<span class="nb">print</span> <span class="s2">"1) Italiano -> Albhed"</span>
<span class="nb">print</span> <span class="s2">"2) Albhed -> Italiano"</span>
<span class="nb">print</span> <span class="s2">"3) Esci"</span>
<span class="nb">print</span> <span class="s2">""</span>
<span class="n">ch</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">raw_input</span><span class="p">(</span><span class="s2">"Inserire l'operazione da effettuare: "</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ch</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ch</span><span class="o">==</span><span class="mi">1</span> <span class="ow">or</span> <span class="n">ch</span><span class="o">==</span><span class="mi">2</span> <span class="ow">or</span> <span class="n">ch</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">valid</span><span class="o">=</span><span class="kc">True</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span> <span class="s2">"Opzione non valida"</span>
<span class="k">if</span> <span class="n">ch</span><span class="o">!=</span><span class="mi">3</span><span class="p">:</span>
<span class="n">string</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">raw_input</span><span class="p">(</span><span class="s2">"Inserire la frase da tradurre: "</span><span class="p">))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">s2</span><span class="o">=</span><span class="s2">""</span>
<span class="nb">print</span> <span class="s2">""</span>
<span class="k">if</span> <span class="n">ch</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">string</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"\W"</span><span class="p">,</span><span class="n">x</span><span class="p">):</span> <span class="c1">#Trova tutti i caratteri che non sono lettere</span>
<span class="n">s2</span><span class="o">+=</span><span class="n">x</span> <span class="c1">#E attaccali</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">s2</span><span class="o">+=</span><span class="n">sys</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="c1">#Altrimenti traduci</span>
<span class="nb">print</span> <span class="s2">"Traduzione: "</span> <span class="o">+</span><span class="n">s2</span>
<span class="k">elif</span> <span class="n">ch</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">string</span><span class="p">:</span>
<span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s2">"\W"</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
<span class="n">s2</span><span class="o">+=</span><span class="n">x</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">s2</span><span class="o">+=</span><span class="n">sys2</span><span class="p">[</span><span class="n">x</span><span class="p">]</span>
<span class="nb">print</span> <span class="s2">"Traduzione: "</span> <span class="o">+</span><span class="n">s2</span>
<span class="k">elif</span> <span class="n">ch</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
</code></pre></div>
<p>Questo programma è estremamente grezzo, ma fa il suo lavoro.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Ancora Wizard di Installazione con Inno Setup2013-06-26T00:00:00+02:002013-06-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-26:/gratis-sul-web/InnoSetup.html<p>Esistono vari modi di far conoscere al mondo le nostre opere d'arte informatiche, oggi conosceremo da vicino Inno Setup.</p><h1>Esistono vari modi di far conoscere al mondo le nostre opere d'arte informatiche, oggi conosceremo da vicino Inno Setup.</h1>
<p>Buongiorno a tutti, in <a href="https://penazarea.altervista.org/gratis-sul-web/NSIS.html">questo articolo</a> vi ho presentato NSIS, un sistema veloce e stabile per creare i vostri installer. Ovviamente nel panorama software non esiste solo un programma per creare i nostri installer, infatti oggi vi presento Inno Setup: un sistema di installazione che eguaglia, se non addirittura supera, i più blasonati sistemi di installazione commerciali.</p>
<p>Tra le caratteristiche di Inno Setup troviamo:</p>
<ul>
<li>Supporto per tutte le edizioni di Windows: dalla 2000 alla recentissima 8;</li>
<li>Supporto a tutte le edizioni a 64 Bit</li>
<li>Supporto per la distribuzione su più dischi (disk-spanning)</li>
<li>Tipi di setup personalizzabili</li>
</ul>
<p>Ovviamente queste sono solo 4 delle quasi 20 caratteristiche salienti di Inno Setup.</p>
<p>Inno Setup può inoltre essere tranquillamente usato anche per la creazione di Installer di prodotti commerciali.</p>
<p>Se volete provare Inno Setup non vi resta che precipitarvi sul <a href="http://www.jrsoftware.org/isinfo.php">sito ufficiale</a> e scaricare la vostra copia.</p>
<p>Buona Installazione a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>Miglioramenti del sistema di Backup2013-06-24T00:00:00+02:002013-06-24T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-24:/coding/Backup2.html<p>Dopo alcuni consigli da parte di un amico, ho deciso di riprogrammare da zero il mio sistema di Backup giornaliero con Python.</p><h1>Dopo alcuni consigli da parte di un amico, ho deciso di riprogrammare da zero il mio sistema di Backup giornaliero con Python.</h1>
<p>Buongiorno a tutti dopo un paio di consigli da parte del mio amico sistemista, ho deciso di riprogrammare da zero il mio sistema di backup che avevo proposto in <a href="https://penazarea.altervista.org/coding/Backup.html">questo articolo</a> di qualche giorno fa. Che linguaggio avrei mai potuto usare se non Python?</p>
<p>Ora il nuovo sistema di backup implementa alcune nuove caratteristiche oltre a quelle della versione precedente:</p>
<ul>
<li>Controllo dello spazio sulla partizione di backup</li>
<li>Notifiche su desktop tramite Notify-Send</li>
<li>Scrittura di un log in caso di errori</li>
<li>Controllo passo per passo di tutte le procedure con uscita immediata in caso di errore.</li>
</ul>
<p>Inoltre questo programma è stato un po' una sfida, dato che volevo evitare che il numero di righe di codice crescesse a dismisura cercando di evitare l'uso di variabili inutili e altri orpelli che avrebbero reso il codice più leggibile ma anche più impattante sulla memoria e sul processore.</p>
<p>Per un conosciutissimo problema di Notify-send ho dovuto montare una soluzione posticcia per fare in modo che le notifiche vengano visualizzate; in pratica il programma restringe temporaneamente i suoi permessi (dato che parte da root) allo scopo di richiamare notify-send sullo schermo dell'utente connesso. Dato che questa operazione, se effettuata da root, non richiede l'inserimento della password è possibile automatizzarla.</p>
<p>Ecco quindi il nuovo sistema di backup:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python3</span>
<span class="c1"># Applicazione per il backup quotidiano</span>
<span class="c1"># Versione 2.0</span>
<span class="c1"># -----Imports-----</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">traceback</span>
<span class="kn">import</span> <span class="nn">Multitoolkit</span>
<span class="kn">import</span> <span class="nn">signal</span><span class="o">,</span> <span class="nn">socket</span>
<span class="kn">from</span> <span class="nn">time</span> <span class="kn">import</span> <span class="n">sleep</span>
<span class="kn">from</span> <span class="nn">syslog</span> <span class="kn">import</span> <span class="n">syslog</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="k">global</span> <span class="n">force</span>
<span class="n">force</span><span class="o">=</span><span class="kc">False</span>
<span class="c1"># Verifiche preliminari: Forzatura, Stato, ecc...</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">force</span><span class="o">=</span><span class="kc">False</span>
<span class="k">elif</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"--force"</span><span class="p">,</span><span class="s2">"-f"</span><span class="p">]:</span>
<span class="n">force</span><span class="o">=</span><span class="kc">True</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Forzatura del backup in corso"</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"--status"</span><span class="p">,</span><span class="s2">"-s"</span><span class="p">]:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">Multitoolkit</span><span class="o">.</span><span class="n">getStatus</span><span class="p">())</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
<span class="n">force</span><span class="o">=</span><span class="kc">False</span>
<span class="c1"># Prima operazione: Controllo se ho effettuato il backup con successo, se si -> Esco</span>
<span class="k">if</span> <span class="n">Multitoolkit</span><span class="o">.</span><span class="n">verify</span><span class="p">()</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
<span class="n">syslog</span><span class="p">(</span><span class="s2">"Backup gia' effettuato, chiusura"</span><span class="p">)</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">closeSocket</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="c1"># Backup non effettuato: attendo 3 minuti dall'avvio del sistema</span>
<span class="c1"># Intanto registro l'handler per la terminazione su segnale</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">connect</span><span class="p">()</span>
<span class="n">sleep</span><span class="p">(</span><span class="mi">180</span><span class="p">)</span>
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGTERM</span><span class="p">,</span><span class="n">Multitoolkit</span><span class="o">.</span><span class="n">termHandler</span><span class="p">)</span>
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGINT</span><span class="p">,</span><span class="n">Multitoolkit</span><span class="o">.</span><span class="n">termHandler</span><span class="p">)</span>
<span class="c1"># Inizio backup, notifica</span>
<span class="n">syslog</span><span class="p">(</span><span class="s2">"Inizio Backup"</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="s1">'Inizio della procedura di Backup giornaliero'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s1">'Inizio della procedura di Backup giornaliero'</span><span class="p">)</span>
<span class="c1"># Montaggio cartelle</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">Mount</span><span class="p">()</span>
<span class="c1"># Verifica dello spazio disponibile</span>
<span class="k">if</span> <span class="n">Multitoolkit</span><span class="o">.</span><span class="n">getSize</span><span class="p">()</span><span class="o"><</span><span class="mi">10</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="s2">"Lo spazio nella partizione di Backup e' inferiore al 10%"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Lo spazio nella partizione di Backup e' inferiore al 10%"</span><span class="p">)</span>
<span class="c1"># Verifica cartelle</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">verifyFolders</span><span class="p">()</span>
<span class="c1"># Inizio Backup</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">startBackup</span><span class="p">()</span>
<span class="c1"># Smontaggio dump della data e notifica finale</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">umountFolders</span><span class="p">()</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">dump</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">force</span><span class="p">:</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">notify</span><span class="p">(</span><span class="s2">"Backup Completato"</span><span class="p">)</span>
<span class="n">Multitoolkit</span><span class="o">.</span><span class="n">closeSocket</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Backup Completato"</span><span class="p">)</span>
<span class="n">syslog</span><span class="p">(</span><span class="s2">"Backup Completato"</span><span class="p">)</span>
</code></pre></div>
</td></tr></table>
<p>Il codice funziona direttamente da console digitando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">python3 daily.py</span>
</code></pre></div>
<p>Oppure è possibile creare un job di anacron anche se la riga che dovremo scrivere sarà un po' diversa da quella dell'ultima edizione:</p>
<blockquote>
<p>1 3 backup.daily DISPLAY=":0" python3 /usr/local/bin/Backup/daily.py</blockquote></p>
</blockquote>
<p><strong>Il codice è stato creato solo per pc con utente singolo, in caso sullo stesso pc fossero collegati più utenti, le notifiche potrebbero non venire visualizzate</strong></p>
<p>Il codice per il backup settimanale sarà disponibile a breve.</p>
<p>Questo è quanto, saluti a tutti!</p>
<p>Penaz.</p>Creiamo i nostri Installer con NSIS2013-06-20T00:00:00+02:002013-06-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-20:/gratis-sul-web/NSIS.html<p>Scopriamo NullSoft Scriptable Install System (NSIS), un software open source per creare installer per Windows.</p><h1>Scopriamo NullSoft Scriptable Install System (NSIS), un software open source per creare installer per Windows.</h1>
<p>Buongiorno a tutti, se siete programmatori potreste voler impacchettare la vostra meraviglia informatica e distribuirla al mondo intero, in tal caso difficilmente troverete un programma migliore di NullSoft Scriptable Install System, conosciuto ai più come NSIS.</p>
<p>NSIS è un software estremamente leggero ed efficiente, creato per avere un bassissimo impatto sul sistema su cui viene usato, inoltre difficilmente lascia files indesiderati dopo la disinstallazione.</p>
<p>Tramite la compressione LZMA, NSIS è in grado di comprimere i vostri software in maniera molto efficiente senza per questo aumentare l'impatto sul sistema.</p>
<p>Tra le tante caratteristiche troviamo un velocissimo sistema di internazionalizzazione che ci permette di distribuire il nostro installer in tutte le lingue che vogliamo, senza alcuna fatica; supporto installazione web e patching dei files. Tutto questo in un programma gratuito.</p>
<p>Se volete provarlo, non resta che recarvi sul <a href="http://nsis.sourceforge.net/Main_Page">sito ufficiale</a>.</p>
<p>Se usate l'IDE <a href="https://penazarea.altervista.org/gratis-sul-web/Eclipse.html">Eclipse</a> potete creare i vostri installer direttamente da lì con un <a href="http://nsis.sourceforge.net/EclipseNSIS_-_NSIS_plugin_for_Eclipse">apposito plugin</a>.</p>
<p>Un altro ottimo ambiente per creare i vostri installer è <a href="http://hmne.sourceforge.net/">HM NIS Edit</a>, sempre gratuito e semplice da usare; anche se un po' vecchiotto.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Eclipse: Un IDE Open Source Completissimo2013-06-16T00:00:00+02:002013-06-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-16:/gratis-sul-web/Eclipse.html<p>Scopriamo Eclipse, un completissimo IDE open source che faciliterà la gestione dei nostri progetti in qualsiasi linguaggio.</p><h1>Scopriamo Eclipse, un completissimo IDE open source che faciliterà la gestione dei nostri progetti in qualsiasi linguaggio.</h1>
<p>Buongiorno a tutti, se siete dei programmatori sicuramente sapete che cos'è un Integrated Development Environment o IDE. Un IDE è un software che aiuta il programmatore nella creazione, gestione, debugging e pubblicazione dei progetti che abbiano un codice sorgente.</p>
<p>Solitamente ogni codice di Programmazione ha un proprio IDE preferito: Java ha NetBeans, la serie .Net ha Visual Studio, per esempio. Ma Eclipse è un po' particolare, infatti supporta molti linguaggi, tramite semplici plugins che possono essere scaricati dal web ed aggiunti senza nessun problema.</p>
<p>Sul sito ufficiale è possibile trovare varie versioni del programma, complete di compilatore per Java, C, C++, Java Mobile, ecc... Scegliete quella che più si adatta alle vostre esigenze.</p>
<p>Se volete provare subito Eclipse IDE non vi resta che catapultarvi sul <a href="http://www.eclipse.org/">sito ufficiale</a> e scaricarlo subito.</p>
<p>Buona programmazione a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>GuitarCodex Plus: una guida per chi suona la chitarra2013-06-12T00:00:00+02:002013-06-12T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-12:/gratis-sul-web/GuitarCodex.html<p>Se suonate la chitarra e volete una guida per scale e accordi, GuitarCodex plus è quello che vi serve.</p><h1>Se suonate la chitarra e volete una guida per scale e accordi, GuitarCodex plus è quello che vi serve.</h1>
<p>Buongiorno a tutti, se suonate la chitarra da poco e volete imparare il giro di accordi della vostra canzone preferita, mostri del tipo "C#maj9sus" potrebbero darvi alquanti grattacapi.</p>
<p>GuitarCodex Plus è uno di quei piccolissimi programmi che possono aiutarvi in queste situazioni, infatti è sufficiente inserire l'accordo ignoto e automaticamente a vostra disposizione tutte le informazioni umane su quell'accordo, compresa l'immagine di una tastiera con segnate le note da suonare.</p>
<p>E tanto per gradire, il programma è in grado anche di rilevare il nome di un accordo dalle note che vengono suonate, basta cliccare sulla tastiera.</p>
<p>Inoltre è possibile usare GuitarCodex come ricercatore di arpeggi e scale, anche con accordature non proprio convenzionali.</p>
<p>E per finire GuitarCodex Plus fa uso della componente MIDI di Java, in modo che possiate anche ascoltare un campione dell'accordo, arpeggio o scala che volete studiare.</p>
<p>Il programma ha bisogno del <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Runtime Environment</a> per funzionare.</p>
<p>Se volete provarlo non vi resta che andare sul <a href="http://www.microtools.de/gcplus/">sito ufficiale</a> e scaricarlo, oppure provare l'applet all'interno del sito stesso.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Un piccolo sistema di Backup personalizzato2013-06-10T00:00:00+02:002013-06-10T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-06-10:/coding/Backup.html<p>Vediamo come creare un sistema di backup personalizzato ed automatizzato in Linux.</p><h1>Vediamo come creare un sistema di backup personalizzato ed automatizzato in Linux.</h1>
<p>Buongiorno a tutti, non si capisce mai l'importanza di una buona copia di sicurezza se non quando capitano incidenti che portano alla perdita di gran parte dei propri dati; ed è proprio questo che è successo a me: un momento di distrazione, si pensa di operare su una cartella invece di un'altra, ed il disastro è pronto...</p>
<p>Dopo l'incidente ho deciso di fare in modo che tali circostanze non si verifichino più e perciò ho iniziato a cercare un sistema di backup che più si adattasse alle mie esigenze, senza risultato; e allora nello spirito del programmatore folle ho deciso di crearmelo da me; ed ecco vantaggi e svantaggi del sistema che ho messo in piedi.</p>
<p><strong>Vantaggi:</strong></p>
<ul>
<li>Completamente invisibile</li>
<li>Completamente Automatizzato</li>
<li>Incrementale</li>
<li>Consistente</li>
<li>Veloce</li>
<li>Accesso Immediato ai file contenuti nel backup</li>
</ul>
<p><strong>Svantaggi:</strong></p>
<ul>
<li>Richiede molto spazio, infatti il backup non è altro che una copia 1:1 dei file importanti ed in più richiede ulteriore spazio per mantenere la consistenza</li>
<li>Richiede una configurazione particolare delle partizioni</li>
</ul>
<p><strong>Dal 24/06/2013 esiste una versione riprogrammata del sistema di backup</strong></p>
<h2>Parte I: Programmi necessari</h2>
<p>Il sistema di copia che ho messo in piedi ha alcuni requisiti particolari per garantire la consistenza e la qualità del backup:</p>
<ul>
<li>La partizione di partenza deve essere un'unità logica LVM se si vogliono usare gli snapshot LVM</li>
<li>È necessaria una seconda partizione per garantire la consistenza della copia</li>
</ul>
<p>I programmi che ho usato nel mio sistema sono:</p>
<ul>
<li>Rsync per la copia dei files una volta al giorno</li>
<li>Anacron: un piccolo programma che fa in modo che il backup venga eseguito ogni giorno</li>
<li>Tar: Per una copia di sicurezza settimanale</li>
<li>OSD_cat: per gli avvisi su schermo</li>
<li>Samba</li>
<li>Cp: per la copia dei TAR settimanali</li>
</ul>
<h2>Parte II: La struttura delle partizioni e snapshot LVM</h2>
<p>Il sistema richiede che la partizione da copiare sia un'unità logica LVM in modo da mantenere la consistenza del backup, quindi la struttura delle partizioni che ho è questa:</p>
<ul>
<li>Un volume logico Home da 300GB</li>
<li>Un volume logico Backup da 100GB</li>
<li>Un volume logico Snapshot da 7.63GB che sarà creato all'occorrenza</li>
</ul>
<p>La partizione Snapshot è una partizione particolare che tramite il sistema degli snapshot di LVM permette di "Congelare" lo stato della partizione, in modo da evitare inconsistenze dovute ai cambiamenti dei files dovuti all'utente che lavora. Quando la copia dei dati sarà terminata, si elimina la partizione. Non è necessario che la partizione dedicata allo snapshot sia grandissima, deve semplicemente poter contenere i cambiamenti che avveranno nel periodo che intercorre dalla sua creazione alla sua eliminazione.</p>
<p><strong>Gli snapshot LVM sono velocissimi da preparare, ma hanno un impatto di circa il 50% sulle prestazioni del disco fisso quando attivi. Sconsiglio di tenere lo snapshot sempre attivo.</strong></p>
<h2>Parte III: preparazione del backup giornaliero</h2>
<p>Ora vediamo il piccolo script che ho creato per effettuare la copia giornaliera dei files contenuti nella mia home, più qualche piccolo file di configurazione di sistema che, venendo modificati molto raramente, posso copiare senza mettere a rischio la consistenza del backup.</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="c1">#Avviso</span>
<span class="nb">echo</span> <span class="s2">"Inizio backup giornaliero"</span> <span class="p">|</span> osd_cat -ptop -Acenter --font<span class="o">=</span><span class="s2">"-*-times-bold-*-normal-*-20-*-*-*-*-*-*-*"</span>
<span class="c1">#Creo lo snapshot</span>
lvcreate -L7.63G -s -nSnapshot /dev/vg/HomePenaz
<span class="c1">#Monto lo snapshot in /mnt/Snapshot</span>
mount /dev/vg/Snapshot /mnt/Snapshot
<span class="c1">#Monto la partizione di backup</span>
mount /dev/vg/Backup /mnt/Backup
<span class="c1">#Inizio della copia</span>
rsync -avz --progress --exclude-from<span class="o">=</span>/usr/local/bin/Backup/exclude-list.txt /mnt/Snapshot/* /mnt/Backup/Home/
rsync -avz --progress /etc/default/grub /mnt/Backup/Sistema/grub.default
rsync -avz --progress /usr/src/linux/.config /mnt/Backup/Sistema/kernel.config
rsync -avz --progress /etc/logrotate.conf /mnt/Backup/Sistema/logrotate.conf
<span class="c1">#Fine del Backup, smonto lo snapshot</span>
umount /mnt/Snapshot
<span class="c1">#Smonto il backup</span>
umount /mnt/Backup
<span class="c1">#Rimuovo lo snapshot</span>
lvremove -f /dev/vg/Snapshot
<span class="c1">#Avviso</span>
<span class="nb">echo</span> <span class="s2">"Fine backup giornaliero"</span> <span class="p">|</span> osd_cat -ptop -Acenter --font<span class="o">=</span><span class="s2">"-*-times-bold-*-normal-*-20-*-*-*-*-*-*-*"</span>
</code></pre></div>
<p>Come è possibile notare lo script è molto breve, crea lo snapshot, monta snapshot e partizione di backup, effettua una copia dei files importanti con Rsync, smonta tutto e termina.</p>
<p>Nel primo comando di RSync potete notare la dicitura</p>
<blockquote>
<p>--exclude-from=exclude-list.txt</p>
</blockquote>
<p>Questa opzione ci permette di escludere files e cartelle dal backup, in modo da rendere più celeri le operazioni di copia, ecco un piccolo esempio di file di esclusione:</p>
<div class="codehilite"><pre><span></span><code><span class="err">*.avi</span>
<span class="err">*.flv</span>
<span class="err">*.mp4</span>
<span class="err">*.iso</span>
<span class="err">Downloads/</span>
</code></pre></div>
<p>Ho usato alcune estensioni di file molto pesanti ed ho escluso tutta la cartella dei downloads per fare un esempio.</p>
<h2>Parte IV: Programmazione del backup giornaliero</h2>
<p>Per l'esecuzione delle copie avrei voluto affidarmi al mio demone di Cron, ma purtroppo Vixie-Cron non tiene conto del fatto che il mio portatile non è acceso 24 ore su 24, perciò se accendessi il laptop troppo tardi il backup non avrebbe luogo.</p>
<p>Qui ci viene in soccorso Anacron, un piccolo programmino che verifica che un dato comando sia stato eseguito nel periodo prestabilito, se non è stato eseguito lo esegue X minuti dopo l'avvio del sistema.</p>
<p>Come Vixie-Cron usa una propria CronTab, Anacron usa una AnacronTab che troviamo in /etc/anacrontab e aggiungiamo una riga del genere:</p>
<blockquote>
<p>1 3 backup.daily sh /usr/local/bin/Backup/backup.sh</p>
</blockquote>
<p>Questo farà in modo che Anacron esegua il comando "sh /usr/local/bin/Backup/backup.sh" una volta al giorno, tre minuti dopo l'avvio del pc e conservi le proprie informazioni in un file chiamato "backup.daily" conservato in /var/spool/anacron</p>
<p>E la copia giornaliera è programmata!</p>
<h2>Parte V: Il backup su SAMBA</h2>
<p>Per aggiungere un ulteriore livello di sicurezza, ho voluto creare un altro script, da avviare una volta a settimana, che crei un backup della mia home sul disco fisso esterno, collegato tramite il protocollo SAMBA.</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="c1">#Avviso</span>
<span class="nb">echo</span> <span class="s2">"Inizio backup settimanale"</span> <span class="p">|</span> osd_cat -ptop -Acenter --font<span class="o">=</span><span class="s2">"-*-times-bold-*-normal-*-20-*-*-*-*-*-*-* -d10"</span>
<span class="c1">#Monto la cartella di backup</span>
mount /dev/vg/Backup /mnt/Backup
<span class="c1">#Monto l'hdd esterno di rete</span>
mount //xxx.xxx.xxx.xxx/USB_Storage /mnt/Snapshot -o guest
<span class="c1">#Creo il TAR da inviare al disco</span>
<span class="nb">cd</span> /home/penaz
tar -cvf Backup2.tar /mnt/Backup
<span class="c1">#Copio il TAR sul disco, dopo elimino</span>
cp /home/penaz/Backup2.tar /mnt/Snapshot/Backup2.tar
<span class="nb">cd</span> /mnt/Snapshot
rm BackupLaptop.tar
mv Backup2.tar BackupLaptop.tar
<span class="c1">#Elimino il backup dalla Home</span>
<span class="nb">cd</span> /home/penaz
rm Backup2.tar
<span class="c1">#Smonto tutto</span>
umount /mnt/Backup
umount /mnt/Snapshot
<span class="nb">echo</span> <span class="s2">"Fine backup settimanale"</span> <span class="p">|</span> osd_cat -ptop -Acenter --font<span class="o">=</span><span class="s2">"-*-times-bold-*-normal-*-20-*-*-*-*-*-*-* -d10"</span>
</code></pre></div>
<p>Ovviamente al posto di xxx.xxx.xxx.xxx va messo l'indirizzo IP del disco fisso o del server SAMBA su cui fare la copia.</p>
<p>Lo script non fa altro che montare lo share SAMBA e la partizione di backup, creare un TAR della partizione che contiene la copia di sicurezza di tutti i miei files e copiarla sullo Share Samba, eliminando quello vecchio. Per comodità ho usato ancora le cartelle /mnt/Snapshot e /mnt/Backup adattando lo script.</p>
<p>Qui ho preferito usare cp invece di rsync per 2 motivi:</p>
<ul>
<li>Rsync, se usato con la flag -a, tenta di copiare gli attributi dei files, cosa non sempre possibile su filesystem come NTFS</li>
<li>Rsync effettua alcuni controlli alla fine della copia, richiedendo più tempo</li>
</ul>
<p>Per rendere attivo la copia basta aggiungere una riga al file /etc/anacrontab:</p>
<blockquote>
<p>7 10 backup.weekly sh /usr/local/bin/Backup/sett.sh</p>
</blockquote>
<p>Istruendo l'avvio del backup ogni 7 giorni, dieci minuti dopo l'avvio del sistema e conservando le informazioni nel file backup.weekly.</p>
<h2>Considerazioni finali</h2>
<p>Il sistema è abbastanza stabile e veloce, l'unico dubbio che potrebbe sorgere è quello riguardante la possibilità che il processo giornaliero e quello settimanale collidano, dando luogo ad inconsistenze. Ma dato che la copia principale è giornaliero i files da copiare sono veramente pochi e quindi il processo giornaliero finisce in pochi secondi.</p>
<p>Non vi resta che provare questo (poco) innovativo sistema per avere a disposizione una copia di sicurezza dei vostri dati.</p>
<p>Vi auguro buon divertimento.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Fritzing: Schemi elettronici per Arduino e non solo!2013-05-29T00:00:00+02:002013-05-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-29:/gratis-sul-web/Fritzing.html<p>Conosciamo Fritzing, un software che ci permette di creare schemi elettronici collegando anche la nostra amata Arduino.</p><h1>Conosciamo Fritzing, un software che ci permette di creare schemi elettronici collegando anche la nostra amata Arduino.</h1>
<p>Se vi piace lavorare con l'elettronica in tutti i modi possibili, se adorate collegare la vostra Arduino alla macchinetta del caffè per automatizzarla oppure se volete usarla per controllare un enorme MegaZord, allora potreste aver bisogno di un piccolo aiuto nella progettazione, per districarvi dall'enorme groviglio di cavi che si potrebbe venire a creare. In questo vi aiuterà Fritzing.</p>
<p>Fritzing è un ottimo sofware open-source che vi permetterà di semplificare, e di molto, la creazione dei vostri schemi di collegamento elettronici. Il software ha come funzione principale quella di supportare designers, hobbisti, ricercatori e artistia lavorare in maniera creative con la cosiddetta "Elettronica interattiva".</p>
<p>Fritzing vi permetterà anche di documentare chiaramente ed in maniera completa i prototipi che creerete in modo da poterli condividere con gli altri, insegnare l'elettronica in classe e costruire delle PCB professionali.</p>
<p>Il programma è disponibile per le piattaforme Linux (32 e 64 bit), Windows e MacOS, oltre al classico TarBall contenente tutti i codici sorgente pronti da modificare e compilare; nel pieno spirito dell'Open-Source Software. Sul sito sono disponibili delle chiarissime istruzioni di installazione/compilazione e i requisiti di sistema.</p>
<p>Se volete iniziare ad usare il software potete scaricarlo direttamente dal <a href="http://fritzing.org">sito ufficiale</a>.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Scarichiamo i sottotitoli di Youtube con Google2SRT2013-05-26T00:00:00+02:002013-05-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-26:/misc/Google2SRT.html<p>Scarichiamo o convertiamo i sottotitoli XML di YouTube in un formato utilizzabile dai Video Player usando Google2SRT.</p><h1>Scarichiamo o convertiamo i sottotitoli XML di YouTube in un formato utilizzabile dai Video Player usando Google2SRT.</h1>
<p>Buongiorno a tutti, vi è mai capitato di scaricare un video da Youtube in lingua straniera e ritrovarvi a non poter usare i sottotitoli perchè questi ultimi non hanno un formato riconoscibile dal vostro player preferito? Bene, oggi vi presento Google2SRT, un piccolissimo software che vi permetterà di scaricare e convertire i sottotitoli nel più famoso formato SubRip (SRT).</p>
<p>L'interfaccia di Google2SRT è molto semplice e facile da usare, in cima troviamo due Radio Buttons che ci permettono di passare dalla modalità "scarica dal web" a quella "converti da XML".</p>
<p>La modalità web è sicuramente il punto di forza di Google2SRT, basta copiare e incollare l'indirizzo di YouTube (nel formato "http://www.youtube.com/watch?v=xxxxxxxx") e cliccare su "Read", nella sezione "SRT subtitles" scegliamo dove salvare il risultato, in basso scegliamo le lingue che vogliamo scaricare e poi diamo semplicemente "GO!".</p>
<p>La modalità "conversione da XML" è praticamente uguale, con l'unica differenza che invece di dover dare in pasto al programma l'indirizzo web di Youtube, dovremo nutrirlo con il file XML contenente i sottotitoli.</p>
<p>Dopo il download/conversione possiamo tranquillamente caricare il video e i sottotitoli nel nostro player preferito e goderci il frutto del nostro lavoro.</p>
<p>Se volete scaricare il programma basta andare nella sua <a href="http://sourceforge.net/projects/google2srt/?source=directory">Pagina di SourceForge</a>.</p>
<p>Il programma è disponibile per Windows, Linux e MacOS, per gli utenti di Gentoo è possibile installarlo direttamente tramite Portage.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>CommandLineFu: Impariamo alcune magie della CLI2013-05-22T00:00:00+02:002013-05-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-22:/misc/CommandLineFu.html<p>Presentazione di CommandLineFu, un sito che raggioglie piccole gemme da usare subito nella propria CLI.</p><h1>Presentazione di CommandLineFu, un sito che raggioglie piccole gemme da usare subito nella propria CLI.</h1>
<p>Buongiorno a tutti, qualche giorno fa stavo cercando una soluzione per la sparizione di un comando di Linux, probabilmente dovuta al danneggiamento della mia povera Gentoo (che cosa ho mai fatto) e mi sono imbattuto in un sito: CommandLineFu che mi ha schiaffato una lunghissima riga di comando BASH che aveva il semplice scopo di reinstallare tutti i pacchetti che avessero almeno un file mancante.</p>
<p>Spinto dalla curiosità ho continuato ad esplorare il sito di CommandLineFu, trovando dalle piccole gemme utili nella vita di tutti i giorni, come "sudo !!", fino ad enormi comandi per risolvere i più disparati problemi, o stramberie che non si potrebbe mai pensare che esistano, come "python -m SimpleHTTPServer" che permette di servire la cartella corrente all'indirizzo http://$HOSTNAME:8000.</p>
<p>Il tutto condito da un sistema di ricerca, commenti e persino un sistema di voto basato sui classici ThumbsUp/ThumbsDown, insomma:CommandLineFu è un sito che merita veramente un'occhiata se volete anche voi attingere alla fonte della saggezza della Command Line Interface.</p>
<p>Potete visitare il sito seguendo <a href="http://www.commandlinefu.com">questo link</a>.</p>
<p>Questo è quanto, saluti a tutti!</p>
<p>Penaz</p>Il mondo sta cambiando e Google lo conferma con Earth Engine2013-05-20T00:00:00+02:002013-05-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-20:/misc/Google_Earth_Engine.html<p>Scopriamo Google Earth Engine, la piattaforma di monitoraggio ambientale di Big G.</p><h1>Scopriamo Google Earth Engine, la piattaforma di monitoraggio ambientale di Big G.</h1>
<p>Buongiorno a tutti, il nostro pianeta è cambiato molto negli ultimi 20 anni, per quanto questo possa essere un periodo decisamente breve se paragonato all'età del nostro pianeta possiamo constatare che i cambiamenti sono stati radicali. Potremo trovare conferma di questo col nuovissimo Earth Engine di Google.</p>
<p>Google Earth Engine è il risultato della collaborazione di Google, Time (la famosa rivista americana), la NASA ed il servizio geologico degli Stati Uniti. Questa unione ha dato vita ad una completa piattaforma per il monitoraggio ambientale qual'è Earth Engine.</p>
<p>È possibile vedere, grazie alle mappe interattive, i cambiamenti che il mondo ha subito negli anni, tra le tante mappe messe a disposizione da Earth Engine troviamo:</p>
<ul>
<li>La crescita di Las Vegas, Nevada.</li>
<li>La deforestazione che colpisce la Foresta Amazzonica.</li>
<li>La ritirata del Ghiacciaio Columbia, Alaska.</li>
<li>L'espansione costiera di Dubai.</li>
</ul>
<p>Posso garantire che la visualizzazione di queste mappe farà pensare molti di voi lettori e spero vivamente che questa pagina sponsorizzata da Big G abbia effetti benefici sulle future decisioni in materia di "sfruttamento" della Terra.</p>
<p>Se volete visitare il sito potete seguire <a href="http://earthengine.google.org">questo link</a></p>
<p>Buona visualizzazione a tutti!</p>
<p>Penaz.</p>JavE: un programma di Disegno ASCII2013-05-19T00:00:00+02:002013-05-19T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-19:/gratis-sul-web/JavE.html<p>Immergiamoci nel magico mondo della ASCII-Art con JavE, un programma per disegnare con caratteri ASCII scritto in Java.</p><h1>Immergiamoci nel magico mondo della ASCII-Art con JavE, un programma per disegnare con caratteri ASCII scritto in Java.</h1>
<p>Buongiorno a tutti, qualche tempo fa vi ho proposto un piccolo tutorial per Gimp che vi permetteva di creare un effetto che ricordava molto da vicino l'ASCII-Art <a href="https://penazarea.altervista.org/misc/il-corso-di-gimp-parti-da-1-a-30.html">vedi la pagina dei corsi di Gimp</a>. Però la vera ASCII-Art è un po' diversa, dato che vengono usati solamente caratteri per rappresentare un'immagine. Le alternative sono perciò 2: prendete un editor di testo e fate un sacco di fatica per ottenere risultati scarsi, se siete alle prime armi; oppure usate un programma adatto allo scopo come JavE.</p>
<p>JavE (Java Ascii Versatile Editor) è un piccolo programma di disegno scritto in Java che al posto delle classiche linee e colori formati da pixel, come tutti gli altri programmi, utilizza caratteri ASCII per i vostri disegni.</p>
<p>JavE è molto semplice da usare: basta disegnare come in un normalissimo editor grafico ed il programma farà tutto il resto. JavE dispone inoltre di molti strumenti per creare tutto ciò che vi passa per la testa:</p>
<ul>
<li>Forme come rettangoli, cerchi ecc...</li>
<li>Riempimenti, anche con gradienti</li>
<li>Scritte 3D</li>
<li>E molto, molto altro.</li>
</ul>
<p>Le vostre opere d'arte verranno ovviamente salvate in formato Testo Puro (*.txt) come ogni opera di ASCII-Art che si rispetti.</p>
<p>Se volete provare JavE non vi resta che catapultarvi sul sito seguendo <a href="http://www.jave.de/">Questo Link</a>.</p>
<p>Buon Divertimento!</p>
<p>Penaz.</p>TuxGuitar & FluidSynth: Usiamo SoundFonts ancora migliori2013-05-17T00:00:00+02:002013-05-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-17:/misc/TuxGuitar_SoundFonts_2.html<p>Vediamo come usare la potenza e la leggerezza di FluidSynth per inserire SoundFont più pesanti in TuxGuitar.</p><h1>Vediamo come usare la potenza e la leggerezza di FluidSynth per inserire SoundFont più pesanti in TuxGuitar.</h1>
<p>Buongiorno a tutti, in <a href="https://penazarea.altervista.org/misc/TuxGuitar_SoundFont.html">questo articolo</a> vi ho mostrato come è possibile usare i SoundFonts per migliorare l'output di TuxGuitar, in modo da rendere un po' più realistici gli spartiti a vostra disposizione.</p>
<p>Il problema inizia a presentarsi quando il SoundFont più grande (su internet trovate dei mostri da 3GB!!) e perciò il sintetizzatore scritto in Java inizia ad occupare memoria; con ovvie conseguenze: audio scattoso o fastidiosamente in ritardo, mezze note che si perdono per strada, ecc...</p>
<p>In tal caso forse è meglio rivolgere la propria attenzione da qualche altra parte: fra i vari sintetizzatori che TuxGuitar mette a disposizione ho scelto FluidSynth perchè è leggero e cross-platform.</p>
<p>Iniziamo subito!</p>
<p>Installiamo FluidSynth (su Windows potrebbe non essere necessario), in Gentoo per esempio è sufficiente riemergere TuxGuitar con la flag FluidSynth, in altri potrebbe essere necessario installarlo separatamente o addirittura dover usare <a href="http://www.gnu.org/software/make/">GNU Make</a>.</p>
<p>Scarichiamo il soundFont che ci interessa da internet o acquistiamolo, a seconda che sia gratuito o meno.</p>
<p>Ora arriva la parte difficile: La configurazione.</p>
<p>Iniziamo aprendo TuxGuitar e andando nel menu Strumenti -> Plugin:</p>
<p><img alt="Primo passo" src="https://penazarea.altervista.org/images/2013/05/Fluid1.png" /></p>
<p>Disattiviamo tutti i plugin di output che non ci servono: in questo caso quello del sintetizzatore scritto in Java e di Gervill:</p>
<p><img alt="Secondo Passo" src="https://penazarea.altervista.org/images/2013/05/Fluid2.png" /></p>
<p>Ora selezioniamo il sintetizzatore FluidSynth e clicchiamo su configura, poi aggiungiamo all'elenco i SoundFonts che vogliamo usare:</p>
<p><img alt="Terzo Passo" src="https://penazarea.altervista.org/images/2013/05/Fluid3.png" /></p>
<p><img alt="Quarto Passo" src="https://penazarea.altervista.org/images/2013/05/Fluid4.png" /></p>
<p><img alt="Quinto Passo" src="https://penazarea.altervista.org/images/2013/05/Fluid5.png" /></p>
<p>Questo passaggio dipende dalla piattarforma che state usando; in Windows uso dsound (Corrispondente di DirectSound ®) in linux uso ALSA (Advanced Linux Sound Architecture). Se siete molto esperti, potete modificare qualche altra impostazione.</p>
<p><img alt="Sesto passo" src="https://penazarea.altervista.org/images/2013/05/Fluid6.png" /></p>
<p>Cliccate su Ok e poi su Chiudi, ora andate ancora in Strumenti > Impostazioni e cliccate su Suono, assicuratevi che come porta MIDI vi sia TG FluidSynth [NomedelSoundFont]. Se tutto è a posto il tutto dovrebbe essere già pronto all'uso, anche se vi consiglio di riavviare TuxGuitar perchè il vecchio sintetizzatore potrebbe essere ancora in memoria, rallentando il programma.</p>
<p><img alt="Settimo Passo" src="https://penazarea.altervista.org/images/2013/05/Fluid7.png" /></p>
<p>Ecco fatto, è tutto pronto! L'avvio di TuxGuitar sarà sicuramente più lento, tenete conto che all'avvio il SoundFont dovrà essere messo in RAM, portate pazienza.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Henry Attacks! Giochiamo ancora con la prospettiva2013-05-11T00:00:00+02:002013-05-11T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-11:/gratis-sul-web/Henry_Attacks.html<p>Giochiamo ancora con la prospettiva con Henry Attacks, un gioco esclusivamente riservato ai maghi della tastiera...</p><h1>Giochiamo ancora con la prospettiva con Henry Attacks, un gioco esclusivamente riservato ai maghi della tastiera...</h1>
<p>Buongiorno a tutti, in alcuni articoli precedenti vi ho proposto un paio di giochi che giocano con la prospettiva, precisamente il leggerissimo <a href="https://penazarea.altervista.org/gratis-sul-web/Orthorobot.html">OrthoRobot</a> e l'ottimo prodotto della Digipen <a href="https://penazarea.altervista.org/gratis-sul-web/Perspective.html">Perspective</a>. Oggi voglio proporvi un altro gioco piccolissimo che si basa su un principio simile: Henry Attacks.
Henry Attacks ha ben tre livelli di difficoltà che vi fanno immediatamente capire che il gioco è dedicato ai maghi della tastiera:</p>
<ul>
<li>Difficile</li>
<li>Molto Difficile</li>
<li>Impossibile</li>
</ul>
<p>Ad ogni ondata il gioco diventa sempre più difficile.
Inoltre ogni qualvolta inizierete una nuova partita il livello di difficoltà non verrà resettato, ma ricomincerà da dove l'avete lasciato (se siete morti all'ondata 35, ricomincerete il gioco dall'inizio ma dall'ondata 36).
Henry Attacks è dotato di una miriade di armi ed oggetti, tra i quali troviamo:</p>
<ul>
<li>Mitragliatori</li>
<li>Pistole Laser</li>
<li>Revolver</li>
<li>Fucili</li>
<li>Bombe</li>
</ul>
<p>Ma la caratteristica che rende unico il gioco è la possibilità di passare da una visuale bidimensionale ad una 3D per poter evitare i nemici o oltrepassare alcuni ostacoli apparentemente insormontabili.</p>
<p>Un gioco sicuramente da provare, io sono arrivato all'altezza 440, riuscirete a fare di meglio?</p>
<p>Vi lascio con il <a href="http://www.moddb.com/games/henry-attacks">link per il download</a></p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Pygame: Primitive Shooter II 0.2 beta2013-05-09T00:00:00+02:002013-05-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-09:/coding/Pygame_Shooter_02_Beta.html<p>Qualche tempo dopo la pubblicazione (e molto tempo dopo la sua creazione con pygame) ecco la nuova versione di Primitive Shooter II.</p><h1>Qualche tempo dopo la pubblicazione (e molto tempo dopo la sua creazione con pygame) ecco la nuova versione di Primitive Shooter II.</h1>
<p>Buongiorno a tutti, con molta fatica, molto impegno e poco tempo a disposizione sono riuscito a migliorare un po' il mio modesto tentativo di creare uno shooter a scorrimento verticale con tutti i crismi; ecco perciò la nuova versione di Primitive Shooter II completamente programmata in python e pygame!</p>
<p>Fra le nuove caratteristiche del gioco troviamo:</p>
<ul>
<li>Suoni con Stereo Panning.</li>
<li>Sfondo scorrevole a 3 livelli di parallasse che reagisce ai movimenti della navetta.</li>
<li>7 tipi diversi di PowerUps.</li>
<li>Battaglia col boss ogni 5 livelli.</li>
<li>Supporto per le vite e schermata di Game Over.</li>
<li>3 Tipi di Nemici: Normale, Shooter e Kamikaze.</li>
</ul>
<p>Nelle prossime pagine analizzeremo in dettaglio le caratteristiche del gioco, per poi vedere il codice sorgente finale scritto in Python e Pygame.</p>
<h2>Le Classi</h2>
<p>Per prima cosa vediamo un po' che classi abbiamo a disposizione:</p>
<table>
<thead>
<tr>
<th align="left">Classe</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Player</td>
<td align="left">La classe che rappresenta il giocatore ed i "kompanions"</td>
</tr>
<tr>
<td align="left">Enemy</td>
<td align="left">Un nemico generico, con qualche modificatore in più rispetto alla vecchia versione</td>
</tr>
<tr>
<td align="left">Bullet</td>
<td align="left">Un semplice proiettile</td>
</tr>
<tr>
<td align="left">BigBullet</td>
<td align="left">Un Proiettile più grande (e presto pi potente)</td>
</tr>
<tr>
<td align="left">PowerUp</td>
<td align="left">Un Generico PowerUp Raccoglibile</td>
</tr>
<tr>
<td align="left">Star</td>
<td align="left">Una generica stella sullo sfondo</td>
</tr>
<tr>
<td align="left">EnemyBullet</td>
<td align="left">Un proiettile lanciato dal nemico</td>
</tr>
<tr>
<td align="left">Boss</td>
<td align="left">Un grosso, enorme boss arrabbiato</td>
</tr>
</tbody>
</table>
<p>La maggior parte delle classi sono derivate direttamente da Sprite, ereditando così tutti i metodi che Pygame ci offre per velocizzare e facilitare il disegno delle immagini.</p>
<p>Primitive Shooter II fa ancora uso della Classe Vector Appositamente creata, potete trovarla in <a href="https://penazarea.altervista.org/coding/Pygame_Shooter_2.html">questo articolo</a>.</p>
<h2>Le Funzioni e i bachi conosciuti</h2>
<p>Le funzioni sono davvero poche ma essenziali:</p>
<table>
<thead>
<tr>
<th align="left">Funzione</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Shoot</td>
<td align="left">Sparo temporizzato, che ci permette di sparare senza dover massacrare la tastiera.</td>
</tr>
<tr>
<td align="left">Level</td>
<td align="left">Gestisce la creazione dei livelli, le battaglie col boss e l'aumento di difficoltà</td>
</tr>
<tr>
<td align="left">SoundInit</td>
<td align="left">Un posto separato dove tenere i suoni</td>
</tr>
<tr>
<td align="left">Stereo_Pan</td>
<td align="left">Permette di modificare il volume delle casse destra e sinistra a seconda della posizione sullo schermo dell'evento collegato al suono</td>
</tr>
</tbody>
</table>
<p>I bachi (bugs) trovati e non risolti finora sono:</p>
<ul>
<li>Sotto Windows i suoni vengono riprodotti in ritardo</li>
<li>A volte uno dei due kompanions si blocca ad un lato dello schermo, seguendo solo i movimenti verticali della navetta</li>
<li>Le stelle sullo sfondo si "appiccicano" ai lati sinistro e superiore dello schermo.</li>
<li>Se finite addosso al boss, morirete e il boss sparirà. Il gioco potrebbe non proseguire.</li>
</ul>
<h2>Un po' di parole sul Gioco in sè...</h2>
<p>Per quanto riguarda il lato "ludico" del gioco, troviamo per prima cosa una navetta che è in grado di sparare a 9 livelli di potenza diversi.</p>
<p>Successivamente troviamo 4 tipi di nemici + 1 boss:</p>
<table>
<thead>
<tr>
<th align="left">Nemico</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Normale</td>
<td align="left">La classica "Carne da cannone": un nemico inerme che si muove a caso sullo schermo. Se ci finite addosso perderete una vita però...</td>
</tr>
<tr>
<td align="left">Shooter</td>
<td align="left">Un nemico un po' più cattivo che vi lancerà addosso proiettili con lo scopo di colpirvi.</td>
</tr>
<tr>
<td align="left">Kamikaze</td>
<td align="left">Un pazzo scatenato che cercherà in tutti i modi di venirvi addosso.</td>
</tr>
<tr>
<td align="left">Shooter-Kamikaze</td>
<td align="left">Un pazzo veramente cattivo che compare di rado, vi spara addosso mentre cerca di centrarvi con la propria navetta</td>
</tr>
<tr>
<td align="left">Boss</td>
<td align="left">Un grande, grosso, enorme e resistentissimo nemico un po' pigro, non fa altro che andare da destra a sinistra sparandovi addosso.</td>
</tr>
</tbody>
</table>
<p>Inoltre troviamo ben 7 powerups diversi che permettono di facilitare la nostra battaglia:</p>
<table>
<thead>
<tr>
<th align="left">PowerUp</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Potenza</td>
<td align="left">Aumenta di una unità la potenza di fuoco della vostra navetta</td>
</tr>
<tr>
<td align="left">Velocità Cannone</td>
<td align="left">Aumenta il rateo di fuoco del vostro cannone</td>
</tr>
<tr>
<td align="left">FullPower!</td>
<td align="left">Per 20 secondi vi di massima potenza e ritmo di fuoco, per un rapido sterminio.</td>
</tr>
<tr>
<td align="left">Velocità Nave</td>
<td align="left">Aumenta la velocità della vostra nave, per movimenti più rapidi e repentini.</td>
</tr>
<tr>
<td align="left">Kompanions</td>
<td align="left">Affianca alla vostra nave altre due piccole navette per aumentare la potenza di fuoco. Dura 60 secondi.</td>
</tr>
<tr>
<td align="left">Shield</td>
<td align="left">Fa esattamente quello che dice, vi da uno scudo che vi protegge da tutto per 60 secondi</td>
</tr>
<tr>
<td align="left">Assistance</td>
<td align="left">Un piccolo soccorso dalla base missilistica più vicina, un'orda di grossi proiettili si abbatte sul campo.</td>
</tr>
</tbody>
</table>
<p>Per giocare è sufficiente una tastiera, si usano le freccette direzionali per muoversi e "Z" per sparare.</p>
<h2>Il codice sorgente</h2>
<blockquote>
<p>14000 righe di codice? Non voglio arrivare a questi livelli per avere un rettangolo che spara...</p>
</blockquote>
<p>Ecco qui di seguito il codice sorgente completo del gioco, per un totale di 822 righe:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="c1">#Imports</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">pygame.locals</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">exit</span>
<span class="kn">import</span> <span class="nn">Vector</span>
<span class="kn">from</span> <span class="nn">Vector</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">pi</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span><span class="p">,</span><span class="n">random</span>
<span class="c1">#Dichiarazioni</span>
<span class="n">GameOver</span><span class="o">=</span><span class="kc">False</span>
<span class="n">tp</span><span class="o">=</span><span class="mi">0</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="n">showtime</span><span class="o">=</span><span class="kc">False</span>
<span class="n">totime</span><span class="o">=</span><span class="mf">0.</span>
<span class="n">shieldonscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">xmove</span><span class="o">=</span><span class="mf">0.</span>
<span class="n">ymove</span><span class="o">=</span><span class="mf">1.</span>
<span class="n">render_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">enen</span><span class="o">=</span><span class="mi">1</span>
<span class="n">starlist</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">enemy_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">bullet_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">pow_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">player_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">enemy_bull_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">shtinterval</span><span class="o">=</span><span class="mf">0.5</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">1</span>
<span class="n">shieldtime</span><span class="o">=</span><span class="mf">0.</span>
<span class="n">oldshlvl</span><span class="o">=</span><span class="mi">0</span>
<span class="n">oldinterval</span><span class="o">=</span><span class="mi">0</span>
<span class="n">lev</span><span class="o">=</span><span class="mi">0</span>
<span class="n">komtimer</span><span class="o">=</span><span class="mf">0.</span>
<span class="n">kom1</span><span class="o">=</span><span class="kc">None</span>
<span class="n">kom2</span><span class="o">=</span><span class="kc">None</span>
<span class="n">kompanion</span><span class="o">=</span><span class="kc">False</span>
<span class="n">komonscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="n">fptimer</span><span class="o">=</span><span class="mi">0</span>
<span class="n">fullpower</span><span class="o">=</span><span class="kc">False</span>
<span class="n">fponscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">0</span>
<span class="n">score</span><span class="o">=</span><span class="mi">0</span>
<span class="n">pows</span><span class="o">=</span><span class="s2">""</span>
<span class="n">maxpower</span><span class="o">=</span><span class="mi">9</span>
<span class="n">enemysm</span><span class="o">=</span><span class="mi">1</span>
<span class="c1">#Classi</span>
<span class="k">class</span> <span class="nc">Player</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">player</span><span class="o">=</span><span class="kc">False</span>
<span class="n">komp</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mf">1.</span>
<span class="n">lives</span><span class="o">=</span><span class="mi">3</span>
<span class="n">shielded</span><span class="o">=</span><span class="kc">False</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">play</span><span class="p">,</span><span class="n">kom</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="n">play</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">player</span><span class="o">=</span><span class="n">play</span>
<span class="bp">self</span><span class="o">.</span><span class="n">komp</span><span class="o">=</span><span class="n">kom</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">player_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">player</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shielded</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">57</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">252</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">movex</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">global</span> <span class="n">xmove</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">if</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_LEFT</span><span class="p">]:</span>
<span class="n">xmove</span><span class="o">=</span><span class="mf">0.5</span>
<span class="k">elif</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_RIGHT</span><span class="p">]:</span>
<span class="n">xmove</span><span class="o">=-</span><span class="mf">0.5</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_RIGHT</span><span class="p">]</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_LEFT</span><span class="p">]:</span>
<span class="n">xmove</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o"><=</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">>=</span><span class="mi">460</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">global</span> <span class="n">ymove</span>
<span class="n">ymove</span><span class="o">=</span><span class="mf">1.</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">global</span> <span class="n">ymove</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span>
<span class="k">if</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_UP</span><span class="p">]:</span>
<span class="n">ymove</span><span class="o">=+</span><span class="mf">1.5</span>
<span class="k">elif</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_DOWN</span><span class="p">]:</span>
<span class="n">ymove</span><span class="o">=</span><span class="mf">0.5</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_UP</span><span class="p">]</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="n">K_DOWN</span><span class="p">]:</span>
<span class="n">ymove</span><span class="o">=</span><span class="mi">1</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">enemy_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">collide2</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">enemy_bull_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">collide</span> <span class="ow">or</span> <span class="n">collide2</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">shielded</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span><span class="p">,</span><span class="n">fullpower</span><span class="p">,</span><span class="n">oldshlvl</span><span class="p">,</span><span class="n">shtinterval</span><span class="p">,</span><span class="n">oldinterval</span><span class="p">,</span><span class="n">fptime</span>
<span class="bp">self</span><span class="o">.</span><span class="n">lives</span><span class="o">-=</span><span class="mi">1</span>
<span class="k">global</span> <span class="n">pexp_snd</span>
<span class="n">exch</span><span class="o">=</span><span class="n">pexp_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">exch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">exch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fullpower</span><span class="p">:</span>
<span class="k">if</span> <span class="n">shlvl</span><span class="o">>=</span><span class="mi">2</span><span class="p">:</span>
<span class="n">shlvl</span><span class="o">-=</span><span class="mi">2</span>
<span class="k">if</span> <span class="n">shtinterval</span><span class="o"><=</span><span class="mf">0.3</span><span class="p">:</span>
<span class="n">shtinterval</span><span class="o">+=</span><span class="mf">0.2</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">oldshlvl</span><span class="o"><=</span><span class="mi">2</span><span class="p">:</span>
<span class="n">oldshlvl</span><span class="o">-=</span><span class="mi">2</span>
<span class="k">if</span> <span class="n">oldinterval</span><span class="o"><=</span><span class="mf">0.3</span><span class="p">:</span>
<span class="n">shtinterval</span><span class="o">+=</span><span class="mf">0.2</span>
<span class="n">fptime</span><span class="o">=</span><span class="mi">0</span>
<span class="n">fullpower</span><span class="o">=</span><span class="kc">False</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">speed</span><span class="o">>=</span><span class="mf">1.4</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">speed</span><span class="o">-=</span><span class="mf">0.4</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shield</span><span class="p">()</span>
<span class="k">global</span> <span class="n">shieldtime</span>
<span class="n">shieldtime</span><span class="o">=</span><span class="mf">5.</span>
<span class="k">global</span> <span class="n">komtimer</span>
<span class="n">komtimer</span><span class="o">=</span><span class="mf">0.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lives</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o"><=</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">>=</span><span class="mi">460</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">komp</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=-</span><span class="mi">50</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">570</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">komp</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">670</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=</span><span class="mi">50</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">def</span> <span class="nf">shield</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shielded</span><span class="o">=</span><span class="kc">True</span>
<span class="k">def</span> <span class="nf">unshield</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shielded</span><span class="o">=</span><span class="kc">False</span>
<span class="c1">#---------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Enemy</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="n">waittime</span><span class="o">=</span><span class="mi">0</span>
<span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="p">()</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">150</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">d</span><span class="o">=</span><span class="mi">0</span>
<span class="n">endwait</span><span class="o">=</span><span class="kc">False</span>
<span class="n">shooter</span><span class="o">=</span><span class="kc">False</span>
<span class="n">kamikaze</span><span class="o">=</span><span class="kc">False</span>
<span class="n">energy</span><span class="o">=</span><span class="mi">1</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">speedmod</span><span class="p">,</span><span class="n">sh</span><span class="p">,</span><span class="n">km</span><span class="p">,</span><span class="n">en</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">enemy_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">((</span><span class="n">random</span><span class="p">()</span><span class="o">*</span><span class="p">(</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span><span class="o">+</span><span class="n">pi</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*=</span><span class="n">speedmod</span>
<span class="bp">self</span><span class="o">.</span><span class="n">shooter</span><span class="o">=</span><span class="n">sh</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kamikaze</span><span class="o">=</span><span class="n">km</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">=</span><span class="n">en</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">==</span><span class="s2">"flying"</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">kamikaze</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">>=</span><span class="mi">20</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o"><=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">v</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromPoints</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">),(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">))</span>
<span class="n">v</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="n">v</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">220</span><span class="p">,</span><span class="mi">225</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"waiting"</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">==</span><span class="s2">"waiting"</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">endwait</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">waittime</span><span class="o">>=</span><span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">(</span><span class="n">random</span><span class="p">()</span><span class="o">*</span><span class="mi">3</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">endwait</span><span class="o">=</span><span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">20</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">-=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">waittime</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">shooter</span><span class="p">:</span>
<span class="c1">#E' uno shooter</span>
<span class="k">global</span> <span class="n">tp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">>=</span><span class="mf">3.</span><span class="o">+</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">>=</span><span class="mi">0</span><span class="p">:</span>
<span class="n">EnemyBullet</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">bullet_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">-=</span><span class="mi">1</span>
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">20</span>
<span class="k">if</span> <span class="n">n</span><span class="o">==</span><span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="n">PowerUp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">exp_snd</span>
<span class="n">expch</span><span class="o">=</span><span class="n">exp_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">expch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">expch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">>=</span><span class="mi">490</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Bullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">dir_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">dir_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">500</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">theta</span><span class="p">,</span><span class="n">mirror</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">74</span><span class="p">,</span><span class="mi">42</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_y</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()</span>
<span class="k">if</span> <span class="n">mirror</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="o">*=</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">bullet_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_y</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=-</span><span class="mi">20</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">BigBullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">200</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">50</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">74</span><span class="p">,</span><span class="mi">42</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">bullet_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=-</span><span class="mi">100</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">PowerUp</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">powtype</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">50</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">7</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" S "</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" F "</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">27</span><span class="p">,</span><span class="mi">42</span><span class="p">,</span><span class="mi">255</span><span class="p">),(</span><span class="mi">255</span><span class="p">,</span><span class="mi">128</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="k">global</span> <span class="n">fponscreen</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fullpower</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">fponscreen</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" FP!! "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">fponscreen</span><span class="o">=</span><span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" SS "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">kompanion</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">komonscreen</span><span class="p">:</span>
<span class="k">global</span> <span class="n">komonscreen</span>
<span class="n">komonscreen</span><span class="o">=</span><span class="kc">True</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" K "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">160</span><span class="p">,</span><span class="mi">39</span><span class="p">,</span><span class="mi">134</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">6</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shieldonscreen</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">shieldonscreen</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">player</span><span class="o">.</span><span class="n">shielded</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" SH "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">57</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">252</span><span class="p">))</span>
<span class="n">shieldonscreen</span><span class="o">=</span><span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">7</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" A "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">),(</span><span class="mi">189</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">pow_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">player_list</span><span class="p">,</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="c1">#PowerUp Potenza</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fullpower</span><span class="p">:</span>
<span class="n">shlvl</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">oldshlvl</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">shlvl</span><span class="o">==</span><span class="n">maxpower</span><span class="p">:</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">2000</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="c1">#PowerUp Velocita' Cannone</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shtinterval</span>
<span class="k">global</span> <span class="n">score</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">fullpower</span><span class="p">:</span>
<span class="k">if</span> <span class="n">shtinterval</span><span class="o">></span><span class="mf">0.2</span><span class="p">:</span>
<span class="n">shtinterval</span><span class="o">-=</span><span class="mf">0.1</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">500</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">shtinterval</span><span class="o">=</span><span class="mf">0.1</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">oldinterval</span><span class="o">></span><span class="mf">0.2</span><span class="p">:</span>
<span class="n">oldinterval</span><span class="o">-=</span><span class="mf">0.1</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">500</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">oldinterval</span><span class="o">=</span><span class="mf">0.1</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="c1">#PowerUp FullPower</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="k">global</span> <span class="n">oldshlvl</span>
<span class="k">global</span> <span class="n">oldinterval</span>
<span class="k">global</span> <span class="n">fponscreen</span>
<span class="n">fponscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="k">global</span> <span class="n">shtinterval</span>
<span class="n">oldinterval</span><span class="o">=</span><span class="n">shtinterval</span>
<span class="n">shtinterval</span><span class="o">=</span><span class="mf">0.1</span>
<span class="n">oldshlvl</span><span class="o">=</span><span class="n">shlvl</span>
<span class="n">shlvl</span><span class="o">=</span><span class="n">maxpower</span>
<span class="k">global</span> <span class="n">fullpower</span>
<span class="n">fullpower</span><span class="o">=</span><span class="kc">True</span>
<span class="k">global</span> <span class="n">fptimer</span>
<span class="n">fptimer</span><span class="o">=</span><span class="mf">20.</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="c1">#PowerUp Velocita' Nave</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">speed</span><span class="o">+=</span><span class="mf">0.2</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">speed</span><span class="o">>=</span><span class="mi">2</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">speed</span><span class="o">=</span><span class="mi">2</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">500</span>
<span class="c1">#PowerUp Kompanion</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="k">global</span> <span class="n">score</span>
<span class="k">global</span> <span class="n">kompanion</span>
<span class="n">kompanion</span><span class="o">=</span><span class="kc">True</span>
<span class="k">global</span> <span class="n">komonscreen</span>
<span class="n">komonscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="k">global</span> <span class="n">kom1</span><span class="p">,</span><span class="n">kom2</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="k">global</span> <span class="n">komtimer</span>
<span class="n">komtimer</span><span class="o">=</span><span class="mf">60.</span>
<span class="n">kom1</span><span class="o">=</span><span class="n">Player</span><span class="p">((</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="kc">False</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="n">kom2</span><span class="o">=</span><span class="n">Player</span><span class="p">((</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span><span class="o">+</span><span class="mi">30</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="kc">False</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="c1">#PowerUp Shield</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">6</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">shield</span><span class="p">()</span>
<span class="k">global</span> <span class="n">shieldtime</span>
<span class="n">shieldtime</span><span class="o">=</span><span class="mf">60.</span>
<span class="n">shieldonscreen</span><span class="o">=</span><span class="kc">False</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">750</span>
<span class="c1">#PowerUp Assistance</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">7</span><span class="p">:</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">620</span><span class="p">,</span><span class="mi">40</span><span class="p">):</span>
<span class="n">BigBullet</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="mi">510</span><span class="p">)</span>
<span class="k">global</span> <span class="n">pow_sound</span>
<span class="n">pow_ch</span><span class="o">=</span><span class="n">pow_sound</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">pow_ch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">pow_ch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1"># Classe Star</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Star</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">0</span>
<span class="n">rnd</span><span class="o">=</span><span class="mi">0</span>
<span class="n">rnd2</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">mode</span><span class="p">,</span><span class="n">ry</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="o"><=</span><span class="mf">0.1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="o">=</span><span class="n">random</span><span class="p">()</span>
<span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="o"><=</span><span class="mf">0.2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="o">=</span><span class="n">random</span><span class="p">()</span>
<span class="k">if</span> <span class="n">mode</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">6</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="p">,</span><span class="mi">6</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">,</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">,</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">=</span><span class="mi">200</span>
<span class="k">elif</span> <span class="n">mode</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">5</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="p">,</span><span class="mi">5</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">102</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">,</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">,</span><span class="mi">252</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">=</span><span class="mi">100</span>
<span class="k">elif</span> <span class="n">mode</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="o">*</span><span class="mi">4</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd2</span><span class="o">*</span><span class="mi">4</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">,</span><span class="mi">255</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">rnd</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">=</span><span class="mi">50</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="mi">500</span><span class="p">,</span><span class="mi">1000</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ry</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">480</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=-</span><span class="mi">10</span>
<span class="n">starlist</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">xmove</span><span class="p">,</span><span class="n">ymove</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="n">xmove</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="n">ymove</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">></span><span class="mi">480</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1"># Classe Boss</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Boss</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">energy</span><span class="o">=</span><span class="mi">0</span>
<span class="n">movex</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">0</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">200</span><span class="p">,</span><span class="mi">50</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">147</span><span class="p">,</span><span class="mi">67</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">=</span><span class="mi">500</span>
<span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">=</span><span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">=</span><span class="mi">100</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">enemy_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">tp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="n">num</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
<span class="k">if</span> <span class="n">num</span><span class="o">==</span><span class="mi">50</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">=-</span><span class="bp">self</span><span class="o">.</span><span class="n">movex</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">>=</span><span class="mf">1.</span><span class="o">+</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">):</span>
<span class="n">EnemyBullet</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">height</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">>=</span><span class="mi">440</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">=-</span><span class="mi">1</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">=</span><span class="mi">1</span>
<span class="k">global</span> <span class="n">tp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">bullet_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">-=</span><span class="mi">1</span>
<span class="k">global</span> <span class="n">bhit_snd</span>
<span class="n">bhch</span><span class="o">=</span><span class="n">bhit_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">bhch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">bhch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">energy</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">10000</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">global</span> <span class="n">bossex_snd</span>
<span class="n">bexpch</span><span class="o">=</span><span class="n">bossex_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">bexpch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">bexpch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="k">global</span> <span class="n">showtime</span>
<span class="n">showtime</span><span class="o">=</span><span class="kc">False</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1">#Classe EnemyBullet</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">EnemyBullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">200</span>
<span class="n">movex</span><span class="o">=</span><span class="mi">0</span>
<span class="n">movey</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">v</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromPoints</span><span class="p">((</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">height</span><span class="o">/</span><span class="mi">2</span><span class="p">)))</span>
<span class="n">v</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">movey</span><span class="o">=</span><span class="n">v</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">enemy_bull_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">global</span> <span class="n">esht_snd</span>
<span class="n">eshtch</span><span class="o">=</span><span class="n">esht_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">eshtch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">eshtch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">tp</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">movex</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">movey</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1">#Funzioni</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">def</span> <span class="nf">Shoot</span><span class="p">():</span>
<span class="k">global</span> <span class="n">charge</span>
<span class="k">if</span> <span class="n">charge</span><span class="o">==</span><span class="mi">100</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="mi">122</span><span class="p">]):</span>
<span class="n">BigBullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">50</span><span class="p">)</span>
<span class="n">BigBullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">40</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">50</span><span class="p">)</span>
<span class="n">BigBullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">-</span><span class="mi">40</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">50</span><span class="p">)</span>
<span class="k">global</span> <span class="n">charge</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">time</span><span class="o">>=</span><span class="n">shtinterval</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="mi">122</span><span class="p">]):</span>
<span class="k">global</span> <span class="n">sht</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">True</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">charge</span><span class="o">-</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="mi">600</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="n">charge</span><span class="o">-=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="mi">600</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">charge</span><span class="o">=</span><span class="mf">0.1</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">global</span> <span class="n">sht</span>
<span class="k">global</span> <span class="n">time</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="n">time</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">if</span> <span class="n">sht</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="k">if</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">6</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">7</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">8</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">9</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">9</span>
<span class="k">global</span> <span class="n">sht_snd</span>
<span class="n">shtch</span><span class="o">=</span><span class="n">sht_snd</span><span class="o">.</span><span class="n">play</span><span class="p">()</span>
<span class="k">if</span> <span class="n">shtch</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">=</span><span class="n">Stereo_Pan</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">shtch</span><span class="o">.</span><span class="n">set_volume</span><span class="p">(</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="p">)</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">kom1</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">kom1</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">kom1</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">kom2</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">kom2</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">kom2</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">charge</span><span class="o">=</span><span class="mf">3.0</span><span class="p">:</span>
<span class="n">enemysm</span><span class="o">=</span><span class="mf">3.0</span>
<span class="k">if</span> <span class="n">lev</span><span class="o">%</span><span class="mi">10</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">lives</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">global</span> <span class="n">enen</span>
<span class="n">enen</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">20</span><span class="o">*</span><span class="p">(</span><span class="n">lev</span><span class="p">)):</span>
<span class="k">global</span> <span class="n">enen</span>
<span class="n">Enemy</span><span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">620</span><span class="p">),</span><span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="mi">5000</span><span class="p">,</span><span class="o">-</span><span class="mi">500</span><span class="p">),</span><span class="n">enemysm</span><span class="p">,</span><span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">20</span><span class="p">)),</span><span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">6</span><span class="p">)),</span><span class="n">enen</span><span class="p">)</span>
<span class="k">if</span> <span class="n">lev</span><span class="o">%</span><span class="mi">5</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">boss</span>
<span class="n">boss</span><span class="o">=</span><span class="n">Boss</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
<span class="k">global</span> <span class="n">showtime</span>
<span class="n">showtime</span><span class="o">=</span><span class="kc">True</span>
<span class="k">def</span> <span class="nf">SoundInit</span><span class="p">():</span>
<span class="k">global</span> <span class="n">pow_sound</span><span class="p">,</span><span class="n">pexp_snd</span><span class="p">,</span><span class="n">exp_snd</span><span class="p">,</span><span class="n">sht_snd</span><span class="p">,</span><span class="n">esht_snd</span><span class="p">,</span><span class="n">bossex_snd</span><span class="p">,</span><span class="n">bhit_snd</span>
<span class="n">pow_sound</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"pow.wav"</span><span class="p">)</span>
<span class="n">pexp_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"selfexp.wav"</span><span class="p">)</span>
<span class="n">exp_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"expl.wav"</span><span class="p">)</span>
<span class="n">sht_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"sht.wav"</span><span class="p">)</span>
<span class="n">esht_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"enemysht.wav"</span><span class="p">)</span>
<span class="n">bossex_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"bossexp.wav"</span><span class="p">)</span>
<span class="n">bhit_snd</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">mixer</span><span class="o">.</span><span class="n">Sound</span><span class="p">(</span><span class="s2">"bhit.wav"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Stereo_Pan</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">sw</span><span class="p">):</span>
<span class="n">rvol</span><span class="o">=</span><span class="nb">float</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">/</span><span class="n">sw</span>
<span class="n">lvol</span><span class="o">=</span><span class="mf">1.</span><span class="o">-</span><span class="n">rvol</span>
<span class="k">return</span> <span class="p">(</span><span class="n">lvol</span><span class="p">,</span><span class="n">rvol</span><span class="p">)</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1">#Inizio Programma</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="n">SoundInit</span><span class="p">()</span>
<span class="n">screen</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">),</span><span class="mi">0</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_caption</span><span class="p">(</span><span class="s2">"Primitive Shooter II!!!"</span><span class="p">)</span>
<span class="n">clock</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span>
<span class="n">player</span><span class="o">=</span><span class="n">Player</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">455</span><span class="p">,</span><span class="kc">True</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">PowTxt</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">font</span><span class="o">.</span><span class="n">SysFont</span><span class="p">(</span><span class="s2">"Arial"</span><span class="p">,</span><span class="mi">10</span><span class="p">)</span>
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">100</span><span class="p">):</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">screen</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">starlist</span><span class="p">:</span>
<span class="n">s</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">starlist</span><span class="o">.</span><span class="n">draw</span><span class="p">(</span><span class="n">screen</span><span class="p">)</span>
<span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYDOWN</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=-</span><span class="mi">5</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">5</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=-</span><span class="mi">5</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">5</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="n">player</span><span class="o">.</span><span class="n">move_y</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_z</span><span class="p">:</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">True</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYUP</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_z</span><span class="p">:</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="c1">#Orologio</span>
<span class="n">tp</span><span class="o">=</span><span class="n">clock</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="mi">40</span><span class="p">)</span>
<span class="c1">#Starfield</span>
<span class="k">global</span> <span class="n">totime</span>
<span class="n">totime</span><span class="o">+=</span><span class="n">tp</span>
<span class="k">if</span> <span class="n">totime</span><span class="o">></span><span class="mf">2.</span><span class="p">:</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="kc">False</span><span class="p">)</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="kc">False</span><span class="p">)</span>
<span class="n">Star</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="kc">False</span><span class="p">)</span>
<span class="c1">#Sparo Temporizzato</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">GameOver</span><span class="p">:</span>
<span class="n">Shoot</span><span class="p">()</span>
<span class="c1">#Eventuale Fullpower</span>
<span class="k">if</span> <span class="n">fullpower</span><span class="p">:</span>
<span class="k">global</span> <span class="n">fptimer</span>
<span class="n">fptimer</span><span class="o">-=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">if</span> <span class="n">fptimer</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="k">global</span> <span class="n">oldshlvl</span>
<span class="k">global</span> <span class="n">oldinterval</span>
<span class="k">global</span> <span class="n">shtinterval</span>
<span class="n">shtinterval</span><span class="o">=</span><span class="n">oldinterval</span>
<span class="n">shlvl</span><span class="o">=</span><span class="n">oldshlvl</span>
<span class="k">global</span> <span class="n">fullpower</span>
<span class="n">fullpower</span><span class="o">=</span><span class="kc">False</span>
<span class="c1">#Eventuale Kompanion</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="k">global</span> <span class="n">komtimer</span>
<span class="n">komtimer</span><span class="o">-=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">if</span> <span class="n">komtimer</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">kom1</span><span class="p">,</span><span class="n">kom2</span><span class="p">,</span><span class="n">kompanion</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">kompanion</span><span class="o">=</span><span class="kc">False</span>
<span class="c1">#Aggiornamenti di schermo</span>
<span class="n">player</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="n">kom1</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">kom2</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">draw</span><span class="p">(</span><span class="n">screen</span><span class="p">)</span>
<span class="n">ch</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">charge</span><span class="p">)</span><span class="o">+</span> <span class="s2">" %"</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">ch</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">powrec</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">150</span><span class="o">*</span><span class="p">(</span><span class="n">charge</span><span class="o">/</span><span class="mf">100.</span><span class="p">),</span><span class="mi">10</span><span class="p">))</span>
<span class="n">powrec</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="o">-</span><span class="p">((</span><span class="n">charge</span><span class="o">*</span><span class="mi">250</span><span class="p">)</span><span class="o">/</span><span class="mi">100</span><span class="p">),(</span><span class="n">charge</span><span class="o">*</span><span class="mi">250</span><span class="p">)</span><span class="o">/</span><span class="mi">100</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">powrec</span><span class="p">,(</span><span class="mi">60</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">ch2</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Score: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">score</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">ch2</span><span class="p">,(</span><span class="mi">500</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="k">for</span> <span class="n">bullet</span> <span class="ow">in</span> <span class="n">bullet_list</span><span class="p">:</span>
<span class="n">bullet</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">for</span> <span class="n">powerup</span> <span class="ow">in</span> <span class="n">pow_list</span><span class="p">:</span>
<span class="n">powerup</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">for</span> <span class="n">enemy</span> <span class="ow">in</span> <span class="n">enemy_list</span><span class="p">:</span>
<span class="n">enemy</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">enemy_list</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span>
<span class="k">global</span> <span class="n">lev</span>
<span class="n">lev</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">Level</span><span class="p">()</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">lives</span><span class="o">==</span><span class="mi">0</span> <span class="ow">or</span> <span class="n">GameOver</span><span class="p">:</span>
<span class="n">go</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Game Over"</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">go</span><span class="p">,(</span><span class="mi">320</span><span class="p">,</span><span class="mi">240</span><span class="p">))</span>
<span class="n">GameOver</span><span class="o">=</span><span class="kc">True</span>
<span class="n">ch3</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Level: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">lev</span><span class="p">)</span><span class="o">+</span><span class="s2">", Lives: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">lives</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">pow1</span><span class="o">=</span><span class="s2">""</span>
<span class="n">pow2</span><span class="o">=</span><span class="s2">""</span>
<span class="n">pow3</span><span class="o">=</span><span class="s2">""</span>
<span class="k">if</span> <span class="n">fullpower</span><span class="p">:</span>
<span class="k">global</span> <span class="n">fptimer</span>
<span class="n">pow1</span><span class="o">=</span><span class="s2">"FP: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">fptimer</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">pow1</span><span class="o">=</span><span class="s2">""</span>
<span class="k">if</span> <span class="n">player</span><span class="o">.</span><span class="n">shielded</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shieldtime</span>
<span class="n">shieldtime</span><span class="o">-=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="n">pow3</span><span class="o">=</span><span class="s2">"SH: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">shieldtime</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="k">if</span> <span class="n">shieldtime</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">unshield</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">pow3</span><span class="o">=</span><span class="s2">""</span>
<span class="k">if</span> <span class="n">kompanion</span><span class="p">:</span>
<span class="k">global</span> <span class="n">komtimer</span>
<span class="n">pow2</span><span class="o">=</span><span class="s2">"K: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="n">komtimer</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">pow2</span><span class="o">=</span><span class="s2">""</span>
<span class="n">chboss</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"BOSS: "</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">if</span> <span class="n">showtime</span><span class="p">:</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">chboss</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">50</span><span class="p">))</span>
<span class="k">global</span> <span class="n">boss</span>
<span class="n">energy</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="n">boss</span><span class="o">.</span><span class="n">energy</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">energy</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">energy</span><span class="p">,(</span><span class="mi">50</span><span class="p">,</span><span class="mi">50</span><span class="p">))</span>
<span class="n">pows</span><span class="o">=</span><span class="n">pow1</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="n">pow2</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="n">pow3</span>
<span class="k">for</span> <span class="n">bullet</span> <span class="ow">in</span> <span class="n">enemy_bull_list</span><span class="p">:</span>
<span class="n">bullet</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">ch4</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">pows</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">ch4</span><span class="p">,(</span><span class="mi">20</span><span class="p">,</span><span class="mi">470</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">ch3</span><span class="p">,</span> <span class="p">(</span><span class="mi">300</span><span class="p">,</span><span class="mi">470</span><span class="p">))</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">flip</span><span class="p">()</span>
</code></pre></div>
<h2>I Suoni e le differenze</h2>
<p>Il pacchetto di suoni che potete scaricare da <a href="https://penazarea.altervista.org/coding/SoundPack.zip">questo link</a> è stato creato con SFXR.</p>
<p><strong>Il soundPack è necessario affinchè il gioco funzioni. Basta estrarne il contenuto nella stessa cartella dove si trovano Game.py e Vector.py</strong></p>Modelli 3D gratuiti per tutti i gusti2013-05-07T00:00:00+02:002013-05-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-07:/gratis-sul-web/Modelli_3d.html<p>Se non riuscite o non avete voglia di creare i vostri modelli 3D potete provare a cercarne di gratuiti sul web...</p><h1>Se non riuscite o non avete voglia di creare i vostri modelli 3D potete provare a cercarne di gratuiti sul web...</h1>
<p>Buongiorno, non sempre è facile creare i propri modelli 3D per i propri progetti. In tal caso è possibile cercarne qualcuno sul web, ma non tutti i modelli 3D sono gratuiti oppure utilizzabili per i progetti che abbiamo in mente.</p>
<p>Perciò oggi vi propongo tre enormi archivi pieni zeppi di modelli 3D pronti all'uso nei vostri videogiochi, screenshots, video animati, ecc...</p>
<p>Il primo sito che vi propongo è <a href="http://free3d.com">Free3d</a> un sito pieno di modelli 3D in vari formati compatibili con la maggior parte dei programmi di modellazione 3D in circolazione (.obj, .3ds per esempio). Per poter scaricare i modelli 3D completi è necessaria una registrazione.</p>
<p>Il secondo sito che vi propongo un questa carrellata è <a href="http://www.3dmodelfree.com/">3DModelFree</a>, un altro archivio da cui potete scaricare altri modelli 3D gratuiti, oltre a texture varie, senza che sia necessaria alcuna registrazione.</p>
<p>E se proprio tutti questi modelli 3D non vi bastano, vi propongo anche un terzo sito con oltre 35000 modelli 3D: <a href="http://archive3d.net/">Archive3D</a>. Anche qui non è necessaria una registrazione presso il sito.</p>
<p><strong>Ogni sito ha una propria politica sul riuso delle opere in esso contenuto, leggete attentamente le informazioni sul copyright presenti solitamente in fondo alle pagine.</strong></p>
<p>Questo è quanto. Saluti e alla prossima!</p>
<p>Penaz.</p>Pygame: Primitive Shooter II !!2013-05-03T00:00:00+02:002013-05-03T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-05-03:/coding/Pygame_Shooter_2.html<p>Poco tempo dopo aver programmato Primitive Shooter, ecco Primitive Shooter II, una riprogrammazione che mi ha permesso di aggiungere alcune caratteristiche, sempre usando Pygame e Python.</p><h1>Poco tempo dopo aver programmato Primitive Shooter, ecco Primitive Shooter II, una riprogrammazione che mi ha permesso di aggiungere alcune caratteristiche, sempre usando Pygame e Python.</h1>
<p>Buongiorno, dopo poco tempo che ho creato Primitive Shooter, mi sono reso conto che la struttura del codice era poco pulita e non mi permetteva di fare le aggiunte che volevo. Perciò ho deciso di riprendere in mano Python e Pygame e di riprogrammare il tutto. Il risultato è Primitive Shooter II: un po' meno grezzo del primo, ma sempre spigoloso come un rettangolo.</p>
<p>Ecco i pochi moduli che lo compongono:</p>
<table>
<thead>
<tr>
<th align="left">Modulo</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Classe Player()</td>
<td align="left">La classe che descrive le caratteristiche del giocatore</td>
</tr>
<tr>
<td align="left">Classe Enemy()</td>
<td align="left">Il classico nemico rosso</td>
</tr>
<tr>
<td align="left">Classe Bullet()</td>
<td align="left">Un normale proiettile</td>
</tr>
<tr>
<td align="left">Classe BigBullet()</td>
<td align="left">Un Grosso Proiettile</td>
</tr>
<tr>
<td align="left">Classe PowerUp()</td>
<td align="left">Un serie di potenziatori diversi</td>
</tr>
<tr>
<td align="left">Funzione Shoot()</td>
<td align="left">Controlla il cannone e la sua potenza</td>
</tr>
</tbody>
</table>
<p>Oltre a questi vi è anche una classe esterna "Vector" per la gestione dei movimenti, lunga 65 righe di codice, che si vanno ad aggiungere alle 300 giuste giuste del gioco.</p>
<p>Vediamo le caratteristiche:</p>
<ul>
<li>Supporto per nuovi tipi di powerup: potenza fuoco, velocità fuoco, velocità nave</li>
<li>Implementazione di macchine a stati</li>
<li>Persa la schermata di game over e il supporto per le vite (devo ancora programmarlo)</li>
<li>Implementato una specie di "beam" alla R-Type.</li>
<li>Grafica quadrettosa come il suo predecessore</li>
</ul>
<p>Se volete scaricare il gioco dovete prima scaricare la classe Vector, presente nella prossima pagina e poi il file game.py ed inserirli nella stessa cartella. Per provare il gioco basta dare il comando:</p>
<div class="codehilite"><pre><span></span><code>python Game.py
</code></pre></div>
<p>Anche questo pezzo di codice è distribuito con la sola clausola "Attribuzione"</p>
<p>Diamo un'occhiata al codice della classe Vector:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sin</span><span class="p">,</span><span class="n">cos</span><span class="p">,</span><span class="n">sqrt</span>
<span class="k">class</span> <span class="nc">Vector</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="s2">"'Classe che permette la creazione e gestione dei vettori'"</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="o">=</span><span class="mf">0.</span><span class="p">,</span><span class="n">y</span><span class="o">=</span><span class="mf">0.</span><span class="p">):</span>
<span class="s2">"'Metodo di Inizializzazione, in assenza di dati, inizializza il vettore a zero'"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="s2">"'Crea un vettore per differenza di punti'"</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">FromPoints</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
<span class="s2">"'FromPoints(int,int) -> Vector'"</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="n">b</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">b</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="s2">"'Restituisce il Prodotto Scalare di due vettori'"</span>
<span class="k">def</span> <span class="nf">Scalar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">b</span><span class="p">):</span>
<span class="s2">"'Scalar(Vector,Vector) -> float)'"</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">*</span><span class="n">b</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">*</span><span class="n">b</span><span class="o">.</span><span class="n">y</span>
<span class="s2">"'Restituisce il Modulo di un vettore'"</span>
<span class="k">def</span> <span class="nf">Mod</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Mod(Vector) -> float'"</span>
<span class="k">return</span> <span class="n">sqrt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Scalar</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="s2">"'Normalizza il vettore'"</span>
<span class="k">def</span> <span class="nf">Normalize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Vector.Normalize -> Self'"</span>
<span class="n">mod</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">Mod</span><span class="p">()</span>
<span class="k">if</span> <span class="n">mod</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">/=</span><span class="n">mod</span>
<span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">/=</span><span class="n">mod</span>
<span class="k">return</span>
<span class="s2">"'Crea un vettore, dato un angolo, restituisce un versore'"</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">FromAngle</span> <span class="p">(</span><span class="n">theta</span><span class="p">):</span>
<span class="s2">"'FromAngle(theta) -> Vector'"</span>
<span class="n">v</span><span class="o">=</span><span class="n">Vector</span><span class="p">(</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">),</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">))</span>
<span class="n">v</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="n">x</span><span class="o">=</span><span class="n">v</span><span class="o">.</span><span class="n">x</span>
<span class="n">y</span><span class="o">=</span><span class="n">v</span><span class="o">.</span><span class="n">y</span>
<span class="k">del</span> <span class="n">v</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__neg__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Vector(a,b) -> Vector(-a,-b)'"</span>
<span class="k">return</span> <span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__add__</span> <span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">vec2</span><span class="p">):</span>
<span class="s2">"'Vector(a,b)+Vector(c,d) -> Vector(a+c,b+d)'"</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span> <span class="o">+</span> <span class="n">vec2</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="n">vec2</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Vector(a,b) -> Str(a,b)'"</span>
<span class="k">return</span> <span class="s2">"(</span><span class="si">%s</span><span class="s2">,</span><span class="si">%s</span><span class="s2">)"</span><span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__sub__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">vec2</span><span class="p">):</span>
<span class="s2">"'Vector(a,b)-Vector(c,d) -> Vector(a-c,b-d)'"</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">-</span><span class="n">vec2</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="n">vec2</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">scal</span><span class="p">):</span>
<span class="s2">"'Vector(a,b) * int(k) -> Vector(k*a,k*b)'"</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">*</span><span class="n">scal</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">*</span><span class="n">scal</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__div__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">scal</span><span class="p">):</span>
<span class="s2">"'Vector(a,b) / int(k) -> Vector(a/k,b/k)'"</span>
<span class="k">return</span> <span class="n">Vector</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="o">/</span><span class="n">scal</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="o">/</span><span class="n">scal</span><span class="p">)</span>
<span class="s2">"'Converte il vettore in un tupla'"</span>
<span class="k">def</span> <span class="nf">to_tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Vector.to_tuple() -> (float,float)'"</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="s2">"'Arrotonda all'intero i valori del vettore'"</span>
<span class="k">def</span> <span class="nf">int</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s2">"'Vector.int() -> Self'"</span>
<span class="k">return</span> <span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x</span><span class="p">),</span><span class="nb">round</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">y</span><span class="p">))</span>
</code></pre></div>
<p>Questa classe sarà richiamata solo quando necessario.</p>
<p>Vediamo ora il codice vero e proprio del gioco:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="c1">#Imports</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">pygame.locals</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">exit</span>
<span class="kn">import</span> <span class="nn">Vector</span>
<span class="kn">from</span> <span class="nn">Vector</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">pi</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span><span class="p">,</span><span class="n">random</span>
<span class="c1">#Dichiarazioni</span>
<span class="n">tp</span><span class="o">=</span><span class="mi">0</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">render_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">enemy_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">bullet_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">pow_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">player_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">shtinterval</span><span class="o">=</span><span class="mf">0.5</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">1</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">0</span>
<span class="c1">#Classi</span>
<span class="k">class</span> <span class="nc">Player</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">player_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o"><=</span><span class="mi">0</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">>=</span><span class="mi">460</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span>
<span class="c1">#---------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Enemy</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="n">waittime</span><span class="o">=</span><span class="mi">0</span>
<span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="p">()</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">100</span>
<span class="n">d</span><span class="o">=</span><span class="mi">0</span>
<span class="n">endwait</span><span class="o">=</span><span class="kc">False</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">enemy_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">((</span><span class="n">random</span><span class="p">()</span><span class="o">*</span><span class="p">(</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">))</span><span class="o">+</span><span class="n">pi</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">==</span><span class="s2">"flying"</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">>=</span><span class="mi">20</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o"><=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="p">(</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">220</span><span class="p">,</span><span class="mi">225</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"waiting"</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">==</span><span class="s2">"waiting"</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">endwait</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">waittime</span><span class="o">>=</span><span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">(</span><span class="n">random</span><span class="p">()</span><span class="o">*</span><span class="mi">3</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">4</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">Normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="bp">self</span><span class="o">.</span><span class="n">endwait</span><span class="o">=</span><span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><=</span><span class="mi">620</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">>=</span><span class="mi">20</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">-=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="o">=</span><span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">waittime</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">state</span><span class="o">=</span><span class="s2">"flying"</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">bullet_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">PowerUp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">Bullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">dir_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">dir_y</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">500</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">theta</span><span class="p">,</span><span class="n">mirror</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">74</span><span class="p">,</span><span class="mi">42</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_y</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromAngle</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()</span>
<span class="k">if</span> <span class="n">mirror</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="o">*=</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="n">bullet_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_x</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">dir_y</span><span class="o">*</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=-</span><span class="mi">20</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">BigBullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">200</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">50</span><span class="p">,</span><span class="mi">50</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">74</span><span class="p">,</span><span class="mi">42</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">bullet_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=</span><span class="mi">100</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">class</span> <span class="nc">PowerUp</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">powtype</span><span class="o">=</span><span class="mi">0</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">50</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" S "</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">),(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">" F "</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">27</span><span class="p">,</span><span class="mi">42</span><span class="p">,</span><span class="mi">255</span><span class="p">),(</span><span class="mi">255</span><span class="p">,</span><span class="mi">128</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">pow_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">player_list</span><span class="p">,</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="n">shlvl</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">powtype</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shtinterval</span>
<span class="n">shtinterval</span><span class="o">-=</span><span class="mf">0.1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1">#Funzioni</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="k">def</span> <span class="nf">Shoot</span><span class="p">():</span>
<span class="k">global</span> <span class="n">charge</span>
<span class="k">if</span> <span class="n">charge</span><span class="o">==</span><span class="mi">100</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="mi">122</span><span class="p">]):</span>
<span class="n">BigBullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">50</span><span class="p">)</span>
<span class="k">global</span> <span class="n">charge</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">time</span><span class="o">>=</span><span class="n">shtinterval</span> <span class="ow">and</span> <span class="nb">bool</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">key</span><span class="o">.</span><span class="n">get_pressed</span><span class="p">()[</span><span class="mi">122</span><span class="p">]):</span>
<span class="k">global</span> <span class="n">sht</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">True</span>
<span class="n">time</span><span class="o">=</span><span class="mi">0</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">0</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">global</span> <span class="n">sht</span>
<span class="k">global</span> <span class="n">time</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="n">time</span><span class="o">+=</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span>
<span class="k">if</span> <span class="n">sht</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="k">if</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">6</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">7</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">8</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">9</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span> <span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">4</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">9</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">pi</span><span class="o">/</span><span class="mi">3</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">9</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">charge</span><span class="o"><</span><span class="mi">100</span><span class="p">:</span>
<span class="k">global</span> <span class="n">charge</span>
<span class="n">charge</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="mi">20</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">charge</span><span class="o">=</span><span class="mi">100</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="c1">#Inizio Programma</span>
<span class="c1">#----------------------------------------------------------</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="n">screen</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">),</span><span class="mi">0</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_caption</span><span class="p">(</span><span class="s2">"Primitive Shooter II!!!"</span><span class="p">)</span>
<span class="n">clock</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span>
<span class="n">player</span><span class="o">=</span><span class="n">Player</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">455</span><span class="p">)</span>
<span class="n">PowTxt</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">font</span><span class="o">.</span><span class="n">SysFont</span><span class="p">(</span><span class="s2">"Arial"</span><span class="p">,</span><span class="mi">10</span><span class="p">)</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">20</span><span class="p">):</span>
<span class="n">Enemy</span><span class="p">(</span><span class="n">randint</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span><span class="mi">620</span><span class="p">),</span><span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="mi">5000</span><span class="p">,</span><span class="o">-</span><span class="mi">500</span><span class="p">))</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYDOWN</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=-</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=-</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">5</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_z</span><span class="p">:</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">True</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYUP</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_z</span><span class="p">:</span>
<span class="n">sht</span><span class="o">=</span><span class="kc">False</span>
<span class="n">screen</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="c1">#Orologio</span>
<span class="n">tp</span><span class="o">=</span><span class="n">clock</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="mi">40</span><span class="p">)</span>
<span class="c1">#Sparo Temporizzato</span>
<span class="n">Shoot</span><span class="p">()</span>
<span class="c1">#Aggiornamenti di schermo</span>
<span class="n">player</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">draw</span><span class="p">(</span><span class="n">screen</span><span class="p">)</span>
<span class="n">ch</span><span class="o">=</span><span class="n">PowTxt</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">charge</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">ch</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="k">for</span> <span class="n">bullet</span> <span class="ow">in</span> <span class="n">bullet_list</span><span class="p">:</span>
<span class="n">bullet</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">for</span> <span class="n">powerup</span> <span class="ow">in</span> <span class="n">pow_list</span><span class="p">:</span>
<span class="n">powerup</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">for</span> <span class="n">enemy</span> <span class="ow">in</span> <span class="n">enemy_list</span><span class="p">:</span>
<span class="n">enemy</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">flip</span><span class="p">()</span>
</code></pre></div>
<p>Questo è quanto, saluti a tutti e buona programmazione!</p>
<p>Penaz.</p>Cantiamo a squarciagola con UltraStar Deluxe2013-04-29T00:00:00+02:002013-04-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-29:/gratis-sul-web/UltraStar.html<p>Divertiamoci alla grande, cantando a squarciagola con UltraStar Deluxe, un clone per PC del famoso SingStar.</p><h1>Divertiamoci alla grande, cantando a squarciagola con UltraStar Deluxe, un clone per PC del famoso SingStar.</h1>
<p>Molti di voi avranno sicuramente giocato con SingStar, un gioco in cui bisogna cantare una canzone scelta, cercando di modulare la voce con l'obiettivo di "steccare" il meno possibile, oggi vi presento il suo "clone" open source: UltraStar Deluxe.</p>
<p>Fra le tante caratteristiche di questo gioiellino dell'open source che sta riscuotendo un discreto successo su SourceForge troviamo:</p>
<ul>
<li>Visualizzazione di immagini o video come sfondo</li>
<li>Possibilità di creare le proprie canzoni e di poterle condividere</li>
<li>Modalità Party che permette di far giocare da 8 a 12 giocatori, divisi in 2 o 3 squadre</li>
<li>Le "note dorate", caratteristica unica di UltraStar che permette di rovesciare le sorti del gioco.</li>
<li>Molte altre caratteristiche che non sto qui ad elencare</li>
</ul>
<p>Se volete provare a giocare ad UltraStar Deluxe non vi resta che correre sul <a href="http://ultrastardx.sourceforge.net/">sito ufficiale</a> e scaricare l'ultima versione del gioco.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Riportiamo in vita Quake con DarkPlaces2013-04-27T00:00:00+02:002013-04-27T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-27:/misc/DarkPlaces.html<p>Presentazione di DarkPlaces, un motore che vi permetterà di portare a nuova vita i vecchi episodi di Quake.</p><h1>Presentazione di DarkPlaces, un motore che vi permetterà di portare a nuova vita i vecchi episodi di Quake.</h1>
<p>Se vi piacciono i vecchi giochi come i primi episodi di Duke Nukem o Doom sicuramente non potete non ricordare Quake di IdSoftware. Se vi piace Quake, ma vorreste svecchiarne un pochino la grafica, potete provare il DarkPlaces Engine, un motore che vi permetterà di aggiungere caratteristiche moderne a questa pietra miliare del mondo videoludico.</p>
<p>Tra le tante caratteristiche di DarkPlaces Engine troviamo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">- Supporto DirectX e OpenGL</span>
<span class="err">- Impatti dei proiettili migliorati</span>
<span class="err">- Sangue migliorato</span>
<span class="err">- Supporto per texture e pacchetti ad alta risoluzione</span>
</code></pre></div>
<p>E anche qui, come negli articoli precedenti riguardanti <a href="https://penazarea.altervista.org/misc/Doomsday_Engine.html">Doom</a> e <a href="https://penazarea.altervista.org/misc/Eduke32.html">Duke Nukem</a>, il supporto per i cosiddetti HRP (High Resolution Packs) ci permette di portare la grafica di Quake ad un altro livello, soprattutto dopo aver installato il pacchettone da quasi 3GB che viene linkato nel sito di DarkPlaces.</p>
<p>Un altro prodotto decisamente da provare, per gli amanti dei vecchi giochi che vogliono far "sudare" il proprio pc. Potete trovare tutto ciò che vi serve nel <a href="https://icculus.org/twilight/darkplaces/index.html">sito ufficiale</a>.</p>
<p><strong>DarkPlaces richiede una versione originale di Quake per poter funzionare.</strong></p>
<p>Questo è quanto. Saluti a tutti!</p>
<p>Penaz.</p>Pygame: Primitive Shooter!2013-04-25T00:00:00+02:002013-04-25T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-25:/coding/Pygame_Shooter.html<p>Un piccolo progetto che ho creato nel tempo libero qualche mese fa, Primitive Shooter è uno shooter semplice creato con Python e Pygame.</p><h1>Un piccolo progetto che ho creato nel tempo libero qualche mese fa, Primitive Shooter è uno shooter semplice creato con Python e Pygame.</h1>
<p>Buongiorno a tutti, qualche mese fa ho voluto provare un po' le mie (scarse) competenze di programmazione in Python e Pygame scrivendo un piccolo shooter senza grafiche sfavillanti o effetti speciali (tutti gli elementi sono rettangoli!): grezzo, primitivo e rude; proprio come me.</p>
<p>Il gioco è completamente contenuto in 269 righe di codice, contenute a loro volta in un solo file.</p>
<p>I moduli principali sono:</p>
<table>
<thead>
<tr>
<th align="left">Modulo</th>
<th align="left">Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">Classe Player()</td>
<td align="left">Una semplice classe che rappresenta il giocatore</td>
</tr>
<tr>
<td align="left">Classe Enemy()</td>
<td align="left">Un semplice nemico, rappresentato da un quadrato rosso</td>
</tr>
<tr>
<td align="left">Classe Bullet()</td>
<td align="left">Un semplice proiettile</td>
</tr>
<tr>
<td align="left">Classe PowerUp()</td>
<td align="left">Un semplice quadratino azzurro che rappresenta un potenziatore</td>
</tr>
<tr>
<td align="left">Classe PowerBullet()</td>
<td align="left">Un Proiettile Più potente</td>
</tr>
<tr>
<td align="left">Funzione Shoot()</td>
<td align="left">Controlla il cannone e la sua potenza</td>
</tr>
<tr>
<td align="left">Funzione Level()</td>
<td align="left">Gestisce la generazione dei livelli</td>
</tr>
</tbody>
</table>
<p>Le caratteristiche supportate dal gioco sono altamente all'avanguardia:</p>
<ul>
<li>Movimento della nave e dei nemici</li>
<li>Grafica dignitosamente quadrettosa</li>
<li>Supporto per le vite</li>
<li>Supporto per i Powerup</li>
<li>Schermata finale di Game Over</li>
</ul>
<p>Se volete provare il gioco è sufficiente scaricare il codice sorgente, presente qui sotto e avviarlo con il comando:</p>
<div class="codehilite"><pre><span></span><code>python shooter.py
</code></pre></div>
<p>Primitive Shooter è, diversamente dagli altri pezzi di codice contenuti nel blog, distribuito con la sola clausola di "Attribuzione", il programma potrà tranquillamente essere modificato e rivenduto, purchè venga citato il nome dell'autore.</p>
<p>Ecco il codice sorgente del programma:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="kn">import</span> <span class="nn">pygame</span>
<span class="kn">from</span> <span class="nn">pygame</span> <span class="kn">import</span> <span class="o">*</span>
<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">exit</span>
<span class="kn">from</span> <span class="nn">random</span> <span class="kn">import</span> <span class="n">randint</span>
<span class="kn">import</span> <span class="nn">Vector</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">floor</span><span class="p">,</span> <span class="n">ceil</span>
<span class="kn">from</span> <span class="nn">Vector</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">render_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">score</span><span class="o">=</span><span class="mi">0</span>
<span class="n">empower</span><span class="o">=</span><span class="kc">False</span>
<span class="n">tp</span><span class="o">=</span><span class="mi">0</span>
<span class="n">kills</span><span class="o">=</span><span class="mi">0</span>
<span class="n">killlevel</span><span class="o">=</span><span class="mi">0</span>
<span class="n">lv</span><span class="o">=</span><span class="mi">1</span>
<span class="n">empow</span><span class="o">=</span><span class="mi">0</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">1</span>
<span class="n">lives</span><span class="o">=</span><span class="mi">3</span>
<span class="k">class</span> <span class="nc">Player</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span> <span class="o"><</span> <span class="mi">620</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span> <span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span> <span class="o"><</span> <span class="mi">460</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span> <span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_y</span>
<span class="n">collision</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">enemy_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collision</span><span class="p">:</span>
<span class="k">global</span> <span class="n">lives</span>
<span class="n">lives</span><span class="o">-=</span><span class="mi">1</span>
<span class="k">global</span> <span class="n">kills</span>
<span class="n">kills</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">pow_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="n">enemy_list</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Powerup</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">15</span><span class="p">,</span><span class="mi">15</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">73</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">234</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">pow_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="mi">2</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">>=</span><span class="mi">480</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="n">player</span><span class="p">,</span><span class="n">pow_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="n">shlvl</span><span class="o">+=</span><span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Enemy</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">destination</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">20</span><span class="p">,</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">enemy_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">620</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="mi">3</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">>=</span><span class="mi">0</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">></span><span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">-=</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span> <span class="o"><</span> <span class="bp">self</span><span class="o">.</span><span class="n">destination</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="n">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">></span><span class="mi">480</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">global</span> <span class="n">kills</span>
<span class="n">kills</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">bullets</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Group</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">PowerBullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">10</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">4</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">17</span><span class="p">,</span><span class="mi">128</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">bullets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-=</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=-</span><span class="mi">5</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">enemy_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="k">global</span> <span class="n">score</span>
<span class="k">global</span> <span class="n">kills</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">20</span>
<span class="n">kills</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">Powerup</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">10</span>
<span class="k">class</span> <span class="nc">Bullet</span><span class="p">(</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="p">):</span>
<span class="n">speed</span><span class="o">=</span><span class="mi">300</span>
<span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="p">()</span>
<span class="n">heading</span><span class="o">=</span><span class="n">Vector</span><span class="p">()</span>
<span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">dirx</span><span class="p">):</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">Sprite</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">Surface</span><span class="p">((</span><span class="mi">2</span><span class="p">,</span><span class="mi">5</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">128</span><span class="p">,</span><span class="mi">12</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">get_rect</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">=</span><span class="n">x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">=</span><span class="n">y</span>
<span class="n">bullets</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">=</span><span class="n">Vector</span><span class="o">.</span><span class="n">FromPoints</span><span class="p">((</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">),(</span><span class="n">x</span><span class="o">+</span><span class="n">dirx</span><span class="p">,</span><span class="o">-</span><span class="mi">20</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">normalize</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o"><</span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">floor</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">></span><span class="mi">0</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="n">ceil</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+=</span><span class="bp">self</span><span class="o">.</span><span class="n">move_x</span>
<span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+=</span><span class="p">(</span><span class="n">tp</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">speed</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">to_tuple</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o"><=-</span><span class="mi">5</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">collide</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">sprite</span><span class="o">.</span><span class="n">spritecollide</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">enemy_list</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">collide</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">20</span>
<span class="k">global</span> <span class="n">kills</span>
<span class="n">kills</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">n</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">15</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">Powerup</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">global</span> <span class="n">score</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">10</span>
<span class="k">def</span> <span class="nf">Shoot</span><span class="p">():</span>
<span class="k">if</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">5</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">6</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="mi">10</span><span class="p">,</span><span class="o">-</span><span class="mi">7</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="mi">10</span><span class="p">,</span><span class="mi">7</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">==</span><span class="mi">7</span><span class="p">:</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="o">-</span><span class="mi">5</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">4</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="mi">5</span><span class="p">,</span><span class="o">-</span><span class="mi">200</span><span class="p">)</span>
<span class="n">Bullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="p">,</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="mi">5</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">shlvl</span><span class="o">></span><span class="mi">7</span><span class="p">:</span>
<span class="k">global</span> <span class="n">shlvl</span>
<span class="n">shlvl</span><span class="o">=</span><span class="mi">7</span>
<span class="n">player</span><span class="o">=</span><span class="n">Player</span><span class="p">(</span><span class="mi">320</span><span class="p">,</span><span class="mi">440</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span>
<span class="n">screen</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="mi">640</span><span class="p">,</span><span class="mi">480</span><span class="p">),</span><span class="mi">0</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_caption</span><span class="p">(</span><span class="s2">"Primitive Shooter!!"</span><span class="p">)</span>
<span class="n">clock</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">time</span><span class="o">.</span><span class="n">Clock</span><span class="p">()</span>
<span class="n">f</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">font</span><span class="o">.</span><span class="n">SysFont</span><span class="p">(</span><span class="s2">"Arial"</span><span class="p">,</span><span class="mi">12</span><span class="p">)</span>
<span class="n">g</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">font</span><span class="o">.</span><span class="n">SysFont</span><span class="p">(</span><span class="s2">"Arial"</span><span class="p">,</span><span class="mi">30</span><span class="p">,</span><span class="kc">True</span><span class="p">,</span><span class="kc">True</span><span class="p">)</span>
<span class="n">gtext</span><span class="o">=</span><span class="n">g</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Game Over"</span><span class="p">,</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span><span class="kc">None</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">Level</span><span class="p">():</span>
<span class="k">global</span> <span class="n">killlevel</span>
<span class="n">killlevel</span><span class="o">=</span><span class="n">lv</span><span class="o">*</span><span class="mi">20</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="o">*</span><span class="n">lv</span><span class="p">):</span>
<span class="n">x</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">640</span><span class="p">)</span>
<span class="n">y</span><span class="o">=</span><span class="n">randint</span><span class="p">(</span><span class="o">-</span><span class="mi">5000</span><span class="p">,</span><span class="o">-</span><span class="mi">100</span><span class="p">)</span>
<span class="n">Enemy</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span>
<span class="n">Level</span><span class="p">()</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYDOWN</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=-</span><span class="mi">7</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">7</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=-</span><span class="mi">7</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">7</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_z</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">empower</span><span class="p">:</span>
<span class="n">Shoot</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">PowerBullet</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="p">(</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">width</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span><span class="n">player</span><span class="o">.</span><span class="n">rect</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">KEYUP</span><span class="p">:</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_LEFT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_RIGHT</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_x</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_UP</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_DOWN</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">move_y</span><span class="o">=</span><span class="mi">0</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_e</span><span class="p">:</span>
<span class="n">empow</span><span class="o">=</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_m</span> <span class="ow">and</span> <span class="n">empow</span><span class="o">==</span><span class="mi">1</span><span class="p">:</span>
<span class="n">empow</span><span class="o">=</span><span class="mi">2</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_p</span> <span class="ow">and</span> <span class="n">empow</span><span class="o">==</span><span class="mi">2</span><span class="p">:</span>
<span class="n">empow</span><span class="o">=</span><span class="mi">3</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_o</span> <span class="ow">and</span> <span class="n">empow</span><span class="o">==</span><span class="mi">3</span><span class="p">:</span>
<span class="n">empow</span><span class="o">=</span><span class="mi">4</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">key</span><span class="o">==</span><span class="n">K_w</span> <span class="ow">and</span> <span class="n">empow</span><span class="o">==</span><span class="mi">4</span><span class="p">:</span>
<span class="n">empower</span><span class="o">=</span><span class="kc">True</span>
<span class="n">player</span><span class="o">.</span><span class="n">image</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">255</span><span class="p">,</span><span class="mi">12</span><span class="p">,</span><span class="mi">128</span><span class="p">))</span>
<span class="n">player</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">for</span> <span class="n">bullet</span> <span class="ow">in</span> <span class="n">bullets</span><span class="p">:</span>
<span class="n">bullet</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="n">screen</span><span class="o">.</span><span class="n">fill</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">render_list</span><span class="o">.</span><span class="n">draw</span><span class="p">(</span><span class="n">screen</span><span class="p">)</span>
<span class="n">s</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">score</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">),</span><span class="kc">None</span><span class="p">)</span>
<span class="n">l</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Level "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">lv</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">),</span><span class="kc">None</span><span class="p">)</span>
<span class="n">live</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">"Lives: "</span> <span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">lives</span><span class="p">),</span><span class="kc">True</span><span class="p">,(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">),</span><span class="kc">None</span><span class="p">)</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">live</span><span class="p">,(</span><span class="mi">400</span><span class="p">,</span><span class="mi">460</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">l</span><span class="p">,(</span><span class="mi">400</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">s</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="k">for</span> <span class="n">enemy</span> <span class="ow">in</span> <span class="n">enemy_list</span><span class="p">:</span>
<span class="n">enemy</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">global</span> <span class="n">kills</span>
<span class="k">for</span> <span class="n">powerup</span> <span class="ow">in</span> <span class="n">pow_list</span><span class="p">:</span>
<span class="n">powerup</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
<span class="k">if</span> <span class="n">kills</span><span class="o">==</span><span class="n">killlevel</span><span class="p">:</span>
<span class="n">score</span><span class="o">+=</span><span class="mi">1000</span>
<span class="n">lv</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">kills</span><span class="o">=</span><span class="mi">0</span>
<span class="n">Level</span><span class="p">()</span>
<span class="k">if</span> <span class="n">lives</span><span class="o"><=</span><span class="mi">0</span><span class="p">:</span>
<span class="n">player</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="k">for</span> <span class="n">enemy</span> <span class="ow">in</span> <span class="n">enemy_list</span><span class="p">:</span>
<span class="n">enemy</span><span class="o">.</span><span class="n">kill</span><span class="p">()</span>
<span class="n">screen</span><span class="o">.</span><span class="n">blit</span><span class="p">(</span><span class="n">gtext</span><span class="p">,(</span><span class="mi">240</span><span class="p">,</span><span class="mi">200</span><span class="p">))</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">flip</span><span class="p">()</span>
<span class="k">global</span> <span class="n">tp</span>
<span class="n">tp</span><span class="o">=</span><span class="n">clock</span><span class="o">.</span><span class="n">tick</span><span class="p">(</span><span class="mi">60</span><span class="p">)</span>
</code></pre></div>
<p>Questo è quanto!</p>
<p>Buona programmazione!</p>
<p>Penaz.</p>Creiamo i nostri giochi 3D con Unity2013-04-23T00:00:00+02:002013-04-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-23:/gratis-sul-web/Unity.html<p>Ecco a voi uno strumento relativamente nuovo nel mondo del game development: Unity 3D.</p><h1>Ecco a voi uno strumento relativamente nuovo nel mondo del game development: Unity 3D.</h1>
<p>Buongiorno a tutti, oggi voglio continuare il nostro viaggio all'interno del game development con uno strumento relativamente recente, ma sempre più largamente usato grazie alla qualità che assumono i prodotti finiti e la sua facilità d'uso. Sto parlando di Unity, un motore 3D semplice da usare e molto avanzato.</p>
<p>Tra le caratteristiche salienti di Unity 3D Troviamo:</p>
<ul>
<li>Un ottimo motore grafico 3D</li>
<li>Supporto DirectX 11</li>
<li>Lightmaps avanzate</li>
<li>Una sezione dedicata ai terreni, per la massima naturalezza degli ambienti</li>
<li>Effetti di vario tipo, con sistemi particellari e altri effetti in post-processing</li>
<li>Un motore Fisico eccellente</li>
<li>Possibilità di connettività per gioco in rete/online</li>
</ul>
<p>Molto probabilmente, anche se potreste non saperlo, potreste aver giocato ad un gioco basato proprio sul motore Unity 3D, se volete provarlo non vi resta altro che fare un salto sul <a href="http://unity3d.com/">sito ufficiale</a> e scaricare la versione base, gratuita.</p>
<p>Buona programmazione a tutti!</p>
<p>Saluti e alla prossima tappa!</p>
<p>Penaz.</p>Manipoliamo i PDF con PdfTk e PyPDF2013-04-21T00:00:00+02:002013-04-21T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-21:/misc/PdfTk_PyPDF.html<p>Vediamo come dividere le diapositive di una presentazione in modo da renderle più leggibili sui lettori ebook usando Python,PyPDF e PdfTk.</p><h1>Vediamo come dividere le diapositive di una presentazione in modo da renderle più leggibili sui lettori ebook usando Python,PyPDF e PdfTk.</h1>
<p>Buongiorno a tutti, qualche tempo fa ho comprato un lettore di libri elettronici (meglio conosciuto come ebook-reader o ereader) che uso anche per esigenze di studio.
Un uso che trovo molto utile è quello di rileggere le diapositive in formato PDF in modo da velocizzare e semplificare lo studio, purtroppo molto di frequente viene adottata la forma "quattro diapositive per pagina", come potete ben immaginare ciò rende molto difficoltosa la lettura su un ereader da 6''.
Anche se il mio ereader è dotato di una funziona di zoom questa occupa gran parte del mio tempo, inoltre i metodi che usano imagemagick ritornano dei PDF di qualità pessima, perciò ho deciso di mettermi all'opera con python e un piccolo pacchetto di librerie: PyPDF.</p>
<p>L'obiettivo principale è quello di creare un PDF con le pagine già separate, ma per un difetto della libreria mi ritrovavo sempre con un documento con "n" copie dell'ultima pagina, perciò ho dovuto creare "n" file PDF (uno per ogni pagina) per poi usare PdfTk per riunirle in un unico file.
Vediamo come.</p>
<p>Iniziamo installando i pacchetti necessari, nel mio caso:</p>
<div class="codehilite"><pre><span></span><code>emerge pyPdf pdftk
</code></pre></div>
<p>Dopo l'installazione ho scritto il seguente script che cerca di ovviare alle problematiche della libreria:</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
<span class="kn">from</span> <span class="nn">pyPdf</span> <span class="kn">import</span> <span class="n">PdfFileWriter</span><span class="p">,</span><span class="n">PdfFileReader</span>
<span class="n">output</span><span class="o">=</span><span class="n">PdfFileWriter</span><span class="p">()</span>
<span class="n">input1</span><span class="o">=</span><span class="n">PdfFileReader</span><span class="p">(</span><span class="n">file</span><span class="p">(</span><span class="s2">"file.pdf"</span><span class="p">,</span><span class="s2">"rb"</span><span class="p">))</span>
<span class="n">count</span><span class="o">=</span><span class="mi">0</span>
<span class="n">numpg</span><span class="o">=</span><span class="n">input1</span><span class="o">.</span><span class="n">getNumPages</span><span class="p">()</span>
<span class="c1">#codice per lo splitting</span>
<span class="c1">#ricavo la pagina</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">numpg</span><span class="p">):</span>
<span class="n">pg</span><span class="o">=</span><span class="n">input1</span><span class="o">.</span><span class="n">getPage</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="c1">#Prima Pagina (alto sinistra)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setUpperRight</span><span class="p">((</span><span class="mf">297.61</span><span class="p">,</span><span class="mi">421</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">=</span><span class="n">file</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">count</span><span class="p">)</span><span class="o">+</span><span class="s2">".pdf"</span><span class="p">,</span><span class="s2">"wb"</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">addPage</span><span class="p">(</span><span class="n">pg</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">outputstream</span><span class="p">)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setUpperRight</span><span class="p">((</span><span class="mf">595.22</span><span class="p">,</span><span class="mi">842</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">del</span> <span class="n">output</span><span class="p">,</span> <span class="n">outputstream</span>
<span class="n">count</span><span class="o">+=</span><span class="mi">1</span>
<span class="c1">#Reset Dell'output</span>
<span class="n">output</span><span class="o">=</span><span class="n">PdfFileWriter</span><span class="p">()</span>
<span class="c1">#Seconda Pagina (Alto Destra)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerRight</span><span class="p">((</span><span class="mf">297.61</span><span class="p">,</span><span class="mi">421</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">=</span><span class="n">file</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">count</span><span class="p">)</span><span class="o">+</span><span class="s2">".pdf"</span><span class="p">,</span><span class="s2">"wb"</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">addPage</span><span class="p">(</span><span class="n">pg</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">outputstream</span><span class="p">)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerRight</span><span class="p">((</span><span class="mf">595.22</span><span class="p">,</span><span class="mi">842</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">del</span> <span class="n">output</span><span class="p">,</span> <span class="n">outputstream</span>
<span class="n">count</span><span class="o">+=</span><span class="mi">1</span>
<span class="c1">#Reset Dell'output</span>
<span class="n">output</span><span class="o">=</span><span class="n">PdfFileWriter</span><span class="p">()</span>
<span class="c1">#Terza Pagina (Basso Sinistra)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerLeft</span><span class="p">((</span><span class="mf">297.61</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setUpperRight</span><span class="p">((</span><span class="mf">595.22000</span><span class="p">,</span><span class="mi">421</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">=</span><span class="n">file</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">count</span><span class="p">)</span><span class="o">+</span><span class="s2">".pdf"</span><span class="p">,</span><span class="s2">"wb"</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">addPage</span><span class="p">(</span><span class="n">pg</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">outputstream</span><span class="p">)</span>
<span class="n">outputstream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setUpperRight</span><span class="p">((</span><span class="mf">595.22000</span><span class="p">,</span><span class="mi">842</span><span class="p">))</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerLeft</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">count</span><span class="o">+=</span><span class="mi">1</span>
<span class="k">del</span> <span class="n">output</span><span class="p">,</span> <span class="n">outputstream</span>
<span class="c1">#Reset Dell'output</span>
<span class="n">output</span><span class="o">=</span><span class="n">PdfFileWriter</span><span class="p">()</span>
<span class="c1">#Quarta Pagina (basso Destra)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerLeft</span><span class="p">((</span><span class="mf">297.61</span><span class="p">,</span><span class="mi">421</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">=</span><span class="n">file</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">count</span><span class="p">)</span><span class="o">+</span><span class="s2">".pdf"</span><span class="p">,</span><span class="s2">"wb"</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">addPage</span><span class="p">(</span><span class="n">pg</span><span class="p">)</span>
<span class="n">output</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">outputstream</span><span class="p">)</span>
<span class="n">pg</span><span class="o">.</span><span class="n">mediaBox</span><span class="o">.</span><span class="n">setLowerLeft</span><span class="p">((</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
<span class="n">outputstream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">del</span> <span class="n">output</span><span class="p">,</span> <span class="n">outputstream</span>
<span class="n">count</span><span class="o">+=</span><span class="mi">1</span>
<span class="c1">#Reset Dell'output</span>
<span class="n">output</span><span class="o">=</span><span class="n">PdfFileWriter</span><span class="p">()</span>
</code></pre></div>
<p>Questo script prende un PDF di nome "file.pdf" e lo traduce in un gran numero di PDF numerati che corrispondono alle pagine, dopodichè è sufficiente usare PdfTk per riunirle, togliendo prima dai piedi l'originale:</p>
<div class="codehilite"><pre><span></span><code>mv file.pdf Fatti/file.pdf
pdftk *.pdf finale.pdf
</code></pre></div>
<p>Questo dovrebbe essere sufficiente per creare un file chiamato "finale.pdf" con tutte le pagine separate e ordinate.</p>
<p><strong>Fate attenzione alle impostazioni della vostra shell, in alcuni casi l'ordinamento non è proprio quello che intendiamo noi; consideriamo per esempio una serie di 12 file pdf, e scriviamo nella shell:</strong></p>
<div class="codehilite"><pre><span></span><code>pdftk *.pdf
</code></pre></div>
<p><strong>a questo punto premiamo TAB e potrebbe accadere l'impensabile, invece di avere un globbing corretto come:</strong></p>
<div class="codehilite"><pre><span></span><code>pdftk <span class="m">1</span>.pdf <span class="m">2</span>.pdf <span class="m">3</span>.pdf <span class="m">4</span>.pdf <span class="m">5</span>.pdf <span class="m">6</span>.pdf <span class="m">7</span>.pdf <span class="m">8</span>.pdf <span class="m">9</span>.pdf <span class="m">10</span>.pdf <span class="m">11</span>.pdf <span class="m">12</span>.pdf
</code></pre></div>
<p><strong>potremmo ritrovarci con:</strong></p>
<div class="codehilite"><pre><span></span><code>pdftk <span class="m">1</span>.pdf <span class="m">10</span>.pdf <span class="m">11</span>.pdf <span class="m">12</span>.pdf <span class="m">2</span>.pdf <span class="m">3</span>.pdf <span class="m">4</span>.pdf <span class="m">5</span>.pdf <span class="m">6</span>.pdf <span class="m">7</span>.pdf <span class="m">8</span>.pdf <span class="m">9</span>.pdf
</code></pre></div>
<p><strong>A causa di una errata valutazione degli ordini, Attenzione!</strong></p>
<p>Alla fine della fiera togliamo dai piedi il file finale e eliminiamo tutti i pdf parziali:</p>
<div class="codehilite"><pre><span></span><code>mv finale.pdf Finali/finale.pdf<span class="p">;</span> rm *.pdf
</code></pre></div>
<p>Ed ecco il nostro bel PDF pronto per essere caricato nell'ereader alla massima qualità e senza dover fare uso dello zoom.</p>
<p>Buon Divertimento!</p>
<p>Penaz</p>Creiamo i nostri picchiaduro ad incontri con M.U.G.E.N.2013-04-19T00:00:00+02:002013-04-19T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-19:/gratis-sul-web/MUGEN.html<p>Se vi piacciono i picchiaduro ad incontri in stile Street Fighter non potete non conoscere M.U.G.E.N.</p><h1>Se vi piacciono i picchiaduro ad incontri in stile Street Fighter non potete non conoscere M.U.G.E.N.</h1>
<p>Buongiorno a tutti. Se volete creare un picchiaduro ad incontri in stile Street Fighter, non potete non conoscere M.U.G.E.N. (o Mugen), un vero e proprio framework per la creazione di questo tipo di giochi.</p>
<p>M.U.G.E.N., creato da Elecbyte nel 1999 usando il linguaggio C, permette di creare picchiaduro ad incontri semplicemente importando musiche e personaggi, con una possibilità di personalizzazione totale.</p>
<p>Con M.U.G.E.N. potrete personalizzare personaggi, menu, effetti grafici, musiche, effetti sonori e molto altro. Purtroppo M.U.G.E.N. è rimasto discontinuato per molti anni, salvo poi vedere ripreso il proprio sviluppo con il supporto per grafiche ad alta definizione con risoluzione 1920x1080 pixel e nuove opzioni per gli sfondi a 4:3 e 16:9.</p>
<p>Nel comparto dei controlli, M.U.G.E.N. consente l'uso di al massimo 7 pulsanti per ogni personaggio, con la possibilità di programmare mosse semplici, mosse speciali e super-mosse.</p>
<p>M.U.G.E.N. è disponibile per le piattaforme Linux, Windows e Ms-Dos, se volete provarlo non vi resta che recarvi sul <a href="http://www.elecbyte.com/mugen">sito ufficiale</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Impariamo VIM: Creiamo dei segnaposti2013-04-17T00:00:00+02:002013-04-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-17:/misc/VIM13.html<p>Vediamo come modificare i nostri templates ed il file .vimrc in VIM per usare dei segnaposti in modo da velocizzare la programmazione.</p><h1>Vediamo come modificare i nostri templates ed il file .vimrc in VIM per usare dei segnaposti in modo da velocizzare la programmazione.</h1>
<p>Buongiorno, come molti sanno VIM è uno degli editor a linea di comando più flessibili che ci siano; oggi vedremo come è possibile modificare le impostazioni di VIM e i templates che creiamo per creare dei "segnaposti", utilissimi per velocizzare la programmazione, per esempio.</p>
<h2>Modifichiamo il file .vimrc</h2>
<p>Le modifiche necessarie al nostro .vimrc sono queste:</p>
<div class="codehilite"><pre><span></span><code><span class="nb">nnoremap</span> <span class="sr">/<+.\{-1,}+>c/</span><span class="p">+></span>/<span class="k">e</span>
<span class="nb">inoremap</span> <span class="sr">/<+{-1,}+>c/</span><span class="p">+></span>/<span class="k">e</span>
<span class="k">match</span> ErrorMsg <span class="sr">/<+.\++>/</span>
</code></pre></div>
<p>Vediamo in dettaglio cosa significano queste tre linee alquanto criptiche:
le prime 2 linee ci permetteranno di posizionarci direttamente sul primo segnaposto disponibile e cancellarlo, entrando al contempo in modalità inserimento, così da poterlo direttamente modificare.
L'ultima riga è una piccola aggiunta che ho voluto fare per evitare di dimenticarmi qualche segnaposto importante per strada, nel caso venisse trovato un segnaposto questo verrà evidenziato con uno sfondo rosso.</p>
<p>I segnaposti saranno tutti i tag del tipo <+Segnaposto+> con qualunque cosa al posto della parola "segnaposto".</p>
<h2>Creiamo un template adatto</h2>
<p>Ora non ci resta che creare un template adatto ad essere usato con la nuova funzionalità appena inserita, possiamo usare questo se programmiamo in java, semplice e veloce da fare ed usare:</p>
<div class="codehilite"><pre><span></span><code><span class="cm">/*</span>
<span class="cm"> * <+COMMENTO_INIZIALE+></span>
<span class="cm"> */</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="err"><+</span><span class="nc">NOMECLASSE</span><span class="o">+></span><span class="p">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span> <span class="p">(</span><span class="n">String</span> <span class="o">[]</span> <span class="n">args</span><span class="p">){</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>In questo caso i segnaposti sono il commento iniziale e il nome della classe, salviamo il tutto come java.tpl nella nostra cartella dei templates e creiamo un nuovo sorgente java, appena useremo la combinazione CTRL+J verremo teletrasportati al segnaposto <+COMMENTO_INIZIALE+> pronti per scriverci sopra, appena finito ripremiamo CTRL+J e andremo al segnaposto <+NOMECLASSE+> e così via.</p>
<p>Come potete vedere VIM è veramente un programma estremamente flessibile e in grado di velocizzare veramente il vostro lavoro, se lo usate in modo corretto.</p>
<p>Buon Divertimento a tutti!
Penaz.</p>Creiamo i nostri picchiaduro a scorrimento con OpenBor2013-04-13T00:00:00+02:002013-04-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-13:/gratis-sul-web/OpenBor.html<p>Ecco a voi OpenBOR, un motore per creare i vostri picchiaduro a scrorrimento in stile Final Fight o Streets of Rage.</p><h1>Ecco a voi OpenBOR, un motore per creare i vostri picchiaduro a scrorrimento in stile Final Fight o Streets of Rage.</h1>
<p>Buongiorno a tutti, OpenBOR è un'istituzione nella creazione di giochi picchiaduro a scorrimento orizzontale.</p>
<p>Nel 2004 il Senile Team ha rilasciato il gioco Beats Of Rage, un gioco per DOS fortemente ispirato a Streets of Rage della SEGA, rilasciando successivamente un pacchetto che permetteva di creare mods per Beats Of Rage. Il gioco divenne famoso con il solo passaparola e nel 2005 venne chiesto al Senile Team di rilasciare il codice del motore di Beats Of Rage come Open Source, il Team accettò la proposta e ora il motore viene portato avanti e sviluppato da una grande comunità.</p>
<p>Il motore OpenBOR è già stato usato per vari giochi tra cui Marvel First Alliance e un remake di Final Fight, tutti di qualità eccellente.</p>
<p>Non vi resta che visitare il <a href="http://www.chronocrash.com/forum/">sito ufficiale</a> di OpenBOR, dove troverete tutti i download, le istruzioni per l'uso ed una comunità pronta ad aiutarvi in caso di difficoltà.</p>
<p>Buon Game Development!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Let's create our own scrolling brawlers with OpenBor2013-04-13T00:00:00+02:002013-04-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-13:/en/gratis-sul-web/OpenBor.html<p>Introducing OpenBOR, an engine to create your own brawlers in the style of Final Fight or Streets of Rage.</p><h1>Introducing OpenBOR, an engine to create your own brawlers in the style of Final Fight or Streets of Rage.</h1>
<p>Hello everybody, OpenBOR is a staple in the creation of brawler-style videogames.</p>
<p>In 2004 Senile Team released Beats Of Rage, a DOS game strongly inspired by SEGA's Streets Of Rage, releasing a toolkit that allowed to create mods afterwards. The game became famous by word of mouth and in 2005 Senile Team was asked if they could release the source code as Open Source, the team accepted and now the engine is worked on by a big community.</p>
<p>OpenBOR's engine has already been used for various games, including Marvel First Alliance and a Final Fight remake, all of excellent quality.</p>
<p>Now you just have to visit the <a href="http://www.chronocrash.com/forum/">official website</a>, where you'll find all the downloads, instructions to use the package and a community ready to help you in case of need.</p>
<p>Happy game development!</p>
<p>See you next time!</p>
<p>Penaz.</p>Fingiamoci chitarristi con Frets On Fire2013-04-11T00:00:00+02:002013-04-11T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-11:/gratis-sul-web/FoF.html<p>Se vi piacciono Guitar Hero e Rock Band, ma non potete giocarci per motivi vari, potete provare Frets On Fire.</p><h1>Se vi piacciono Guitar Hero e Rock Band, ma non potete giocarci per motivi vari, potete provare Frets On Fire.</h1>
<p>Buongiorno a tutti. Sicuramente ricorderete Guitar Hero, un gioco in cui vi dovevate improvvisare chitarristi e suonare sopra a vari successi più o meno conosciuti. Se non disponete di una console potete sempre provare Frets On Fire, un gioco che ne simula il funzionamento usando una semplice tastiera per PC.</p>
<p>Il gioco ha vinto la competizione "Assembly Game Development Competition" nel 2006.</p>
<p>Il gioco dispone di un piccolo tutorial spiegato dal grande Jurgen Guntherswarchzhaffenstrassen il quale vi spiegherà soprattutto l'utilità del pulsante Escape (ESC per gli amici).</p>
<blockquote>
<p>The most important is the Escape button. You will need it, when you finally realize that you suck.</p>
</blockquote>
<p>Oltre al tutorial, il gioco dispone anche di qualche canzone per iniziare a suonare subito, ma altre possono essere tranquillamente scaricate dal web.</p>
<p>Se volete provare Frets on Fire, non vi resta che visitare il <a href="http://fretsonfire.sourceforge.net/">sito ufficiale</a></p>
<p>Come se questo non bastasse, la natura Open Source di Frets on Fire ha fatto nascere molte modifiche, più o meno profonde, tra cui quella che ritengo migliore è Frets on Fire X o FoFiX, che fornisce, tra le altre caratteristiche, anche il tema MegaLight per i computer meno potenti, oltre ad estesissime possibilità di personalizzazione.</p>
<p>Se volete provare FoFiX, potete visitare la sua <a href="https://code.google.com/p/fofix/">pagina di Google Code</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>Riportiamo ai vecchi fasti Duke Nukem con Eduke322013-04-07T00:00:00+02:002013-04-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-07:/misc/Eduke32.html<p>Presentazione di EDuke32, un motore che ci permetterà di portare a nuova vita le avventure di Duke Nukem.</p><h1>Presentazione di EDuke32, un motore che ci permetterà di portare a nuova vita le avventure di Duke Nukem.</h1>
<p>Sicuramente, se ci avete giocato, ricorderete il dissacrante egomaniaco qual'è Duke Nukem, un altro gioco che ha fatto conoscere al mondo il genere dei First-Person Shooter anche se questo ha una marcata vena ironica. Se volete giocarci ancora potete tranquillamente usare l'emulatore x86 di cui vi ho parlato più volte: <a href="www.dosbox.com">DosBox</a>. Se invece non vi accontentate potete provare Eduke32.</p>
<p>Eduke32 è un vero e proprio port del motore di Duke Nukem 3D, sfruttando tutta la potenza del vostro computer e, con le impostazioni giuste, anche mettendolo un po' in difficoltà.</p>
<p>Fra le tante caratteristiche presenti in Eduke32 troviamo:</p>
<ul>
<li>Supporto per l'illuminazione dinamica per pixel</li>
<li>Ombre dinamiche</li>
<li>Supporto per i pacchetti ad alta risoluzione</li>
</ul>
<p>Quest'ultima caratteristica, insieme al renderer Polymer vi permetterà di riportare al ventunesimo secolo il grande Duke Nukem, con risultati a dir poco stupefacenti.</p>
<p>Oltre al classico Duke Nukem 3D, Eduke32 supporta pienamente anche le versioni Plutonium e Atomic, oltre ai pacchetti di espansione come Duke Nukem: Life's a Beach.</p>
<p>Non vi resta che scaricare Eduke32 dal <a href="http://www.eduke32.com/">sito ufficiale</a>.</p>
<p><strong>Per funzionare Eduke32 richiede una copia originale di Duke Nukem 3D, non mi ritengo responsabile di qualsivoglia uso illecito del software qui proposto.</strong></p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Arianne RPG: Un motore per creare RPG Multiplayer2013-04-05T00:00:00+02:002013-04-05T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-05:/gratis-sul-web/Arianne_RPG.html<p>Presentazione di Arianne RPG, un framework che vi permetterà di costruire i vostri RPG Multiplayer Online.</p><h1>Presentazione di Arianne RPG, un framework che vi permetterà di costruire i vostri RPG Multiplayer Online.</h1>
<p>Vi è mai capitato di giocare ad un qualsiasi RPG Online? Vi piacerebbe poterne creare uno in maniera semplice e veloce?</p>
<p>Se si, allora la risposta alle vostre richieste è Arianne RPG, un "Multiplayer Online Role Playing Framework" per la creazione di quei giochi di ruolo, solitamente conosciuti nella Grande Rete come RPG.</p>
<p>Arianne RPG ha due principali sotto progetti attualmente in sviluppo:</p>
<ul>
<li><strong>Stendhal</strong>, un gioco d'avventura online</li>
<li><strong>Marauroa</strong>, il motore vero e proprio.</li>
</ul>
<p>Attualmente Arianne RPG gira sotto Java, così da avere la massima portabilità possibile, ma si attiene alla politica KISS (simpaticamente tradotta in "Keep It Simple, Stupid!", "Mantienilo semplice, scemo!") togliendo dalle spalle del creatore di giochi l'intero "accrocco" di righe di codice che Java si porterebbe dietro, mantenendo una struttura molto semplice.</p>
<p>Se volete provare Arianne RPG, potete visitare il <a href="http://arianne.sourceforge.net/about.html">Sito Ufficiale</a>, provare Stendhal ed eventualmente scaricare il motore per iniziare a costruire la vostra avventura.</p>
<p>Buon Game Development a tutti!</p>
<p>Saluti e buon proseguimento.</p>
<p>Penaz.</p>Riportiamo in vita Doom Con Doomsday Engine2013-04-03T00:00:00+02:002013-04-03T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-03:/misc/Doomsday_Engine.html<p>Presentazione di Doomsday engine, un motore che permette di riportare a nuova vita Doom, Doom II e altri.</p><h1>Presentazione di Doomsday engine, un motore che permette di riportare a nuova vita Doom, Doom II e altri.</h1>
<p>Sicuramente ricorderete il caro vecchio DOOM, gioco dell'era MS-DOS che diffuse e rese famoso il genere First-Person-Shooter, se volete rivivere le stesse emozioni potete tranquillamente usare l'ottima <a href="www.dosbox.com">DosBox</a> ma c'è chi non si accontenta e vuole rivivere le stesse emozioni mettendo a dura prova il processore e la GPU del proprio computer, in questo caso ci viene in aiuto un software come DoomsDay Engine che ci permette di giocare a:</p>
<ul>
<li>Doom</li>
<li>Doom II</li>
<li>Heretic</li>
<li>Hexen</li>
<li>Hacx</li>
<li>Chex Quest</li>
</ul>
<p>Doomsday Engine implementa molte caratteristiche degli spara tutto in prima persona moderni, tra cui:</p>
<ul>
<li>Grafica 3D accelerata con OpenGL</li>
<li>Effetti Audio Posizionali 3D</li>
<li>Effetti di ombreggiatura</li>
<li>Generatori di particelle</li>
<li>Upsampling degli effetti audio</li>
<li>Uso di modelli 3D</li>
</ul>
<p>Quest'ultima caratteristica è ottima se usata insieme al supporto per le texture in alta definizione, permettendoci di portare i cari vecchi Doom e Doom2 al ventunesimo secolo, anche se richiede un po' di sforzo e una connessione ad internet veloce, oltre ad un computer abbastanza moderno.</p>
<p>Sel web si trovano molti High Resolution Pack creati da appassionati che vi permetteranno, insieme al Doomsday engine di dare una riveduta al vostro vecchio ed appassionante videogame.</p>
<p>Non vi resta che provarlo, scaricando Doomsday Engine da <a href="http://dengine.net/engine">qui</a>.</p>
<p><strong>Per funzionare, doomsday engine richiede una copia originale dei videogiochi, non mi ritengo responsabile di qualsivoglia uso illecito di Doomsday Engine</strong></p>
<p>Questo è quanto, saluti a tutti!</p>
<p>Penaz.</p>Scherzi e Easter Eggs2013-04-01T00:00:00+02:002013-04-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2013-04-01:/misc/EasterEggs.html<p>Un elenco di Scherzi e Easter Eggs per il primo giorno di aprile.</p><h1>Un elenco di Scherzi e Easter Eggs per il primo giorno di aprile.</h1>
<p>Oggi è il primo di aprile e voglio presentarvi una serie di scherzi e <a href="https://it.wikipedia.org/wiki/Easter_egg">easter eggs</a> che vi faranno sorridere.</p>
<p>Sicuramente una delle fonti più complete di scherzi ed easter eggs è Google, la cui calcolatrice supporta unità di misura alquanto particolari:</p>
<ul>
<li>Beard-Second (Tradotto Barba-Secondo, 5nm)</li>
<li>DonkeyPower (Tradotto Potenza Dell'asino, Circa 250W)</li>
<li>Tutte le unità col prefisso Hella- (tipo hellameter = 10^27 metri)</li>
</ul>
<p>Oppure troverete anche (alcuni funzionano solo nella versione americana):</p>
<ul>
<li>La dozzina del Panettiere (Baker's Dozen) = 13</li>
<li>Il numero più solitario = 1</li>
</ul>
<p>Inoltre se fate certi tipi di ricerche su Google, avrete delle strane reazioni da parte del motore di ricerca:</p>
<ul>
<li>Se Cercate "anagramma", google vi suggerirà di cercare "arma magna", cioè l'anagramma di anagramma!</li>
<li>Se cerchi "Do A Barrel Roll" la pagina farà un giro di 360°</li>
<li>Se cerchi "recursion" (ricorsione) google ti chiederà ricorsivamente se stai cercando "ricorsione"</li>
<li>Se cercate "binary" il numero dei risultati sarà scritto in binario</li>
</ul>
<p>Potrete trovare l'elenco completo nella pagina di <a href="https://en.wikipedia.org/wiki/List_of_Google%27s_hoaxes_and_easter_eggs">Wikipedia dedicata</a>.</p>
<p>Le easter eggs invece sono dei pezzi di codice estranei introdotti dai programmatori nei propri programmi, solitamente scherzosi o divertenti.</p>
<p>Potete trovare un completissimo motore di ricerca per easter eggs su <a href="http://www.eeggs.com/">eeggs.com</a>.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>D-Fend Reloaded: Una piccola interfaccia per DosBox2013-03-30T00:00:00+01:002013-03-30T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-30:/misc/DFend_Reloaded.html<p>Presentazione di D-Fend Reloaded, il frontend che rende l'uso di DosBox una vera passeggiata.</p><h1>Presentazione di D-Fend Reloaded, il frontend che rende l'uso di DosBox una vera passeggiata.</h1>
<p>Avete mai provato ad usare <a href="http://www.dosbox.com/">DosBox</a>? Con tutte le sue impostazioni testuali è sicuramente un programma abbastanza complicato da usare e richiede sempre una fase di preparazione abbastanza lunga per montare la cartella del gioco e poi avviarlo. Bene. In soccorso ci viene D-Fend Reloaded, un frontend per DoxBox che ci renderà la vita molto più facile, generando configurazioni per noi e "nascondendo" tutto ciò che ci può essere di difficile dello stesso DosBox: configurazioni, montaggi e quant'altro.</p>
<p>Fra le caratteristiche salienti troviamo:</p>
<ul>
<li>Possibilità di creazione di profili personalizzati per ogni gioco</li>
<li>Ricerca dei giochi</li>
<li>Supporto Multilingua</li>
<li>Setup Automatic</li>
</ul>
<p>Se volete provare D-Fend Reloaded vi basta visitare il <a href="dfendreloaded.sourceforge.net">sito ufficiale</a>.</p>
<p>Buon Retrogaming a Tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Impariamo Blender con un completissimo WikiBook2013-03-28T00:00:00+01:002013-03-28T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-28:/gratis-sul-web/Blender_WikiBook.html<p>Da WikiBooks ecco a voi un completissimo libro che vi permetterà di imparare Blender. Gratuitamente.</p><h1>Da WikiBooks ecco a voi un completissimo libro che vi permetterà di imparare Blender. Gratuitamente.</h1>
<p>Buongiorno a tutti, oggi voglio presentarvi un libro che sarà la vostra (forse unica) guida nel mondo della modellazione 3D con il famoso software Open Source Blender, il suo titolo è <strong>Blender 3D: Noob To Pro.</strong></p>
<p>Il libro è principalmente una serie molto completa di tutorials riguardanti lo stesso Blender, ordinati in difficoltà crescenti. Un vero e proprio compagno che vi prenderà per mano e vi accompagnerà nel fantastico mondo della modellazione tridimensionale partendo dai principi della <strong>computer graphics</strong> e dall'interfaccia fino ad arrivare alle operazioni di <strong>scripting avanzato.</strong></p>
<p>Tra i tanti argomenti vi sono:</p>
<ul>
<li>Scorciatoie da tastiera (come dico sempre: "Blender va usato con una mano sul mouse ed una sulla tastiera")</li>
<li>Meshes e modalità modifica</li>
<li>Cameras</li>
<li>Estrusione</li>
<li>Materiali</li>
<li>Textures</li>
<li>Luci</li>
<li>Rendering</li>
<li>Animazione</li>
<li>Effetti particellari</li>
</ul>
<p>E molto molto altro ancora, tra cui anche come programmare un'eventuale aggiunta al programma (Blender è scritto in C, C++ e Python) fino ad arrivare ad usi avanzati del nuovissimo motore per videogiochi, usando proprio Python per le operazioni più particolari.</p>
<p>Non vi resta che andare su WikiBooks e navigare all'interno del libro seguendo <a href="https://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro">questo link</a>.</p>
<p>È inoltre possibile scaricare una versione in PDF del libro per la consultazione Offline.</p>
<p>Se invece siete già esperti di Blender, la natura del WikiBook vi consentirà di dare il vostro contributo al libro.</p>
<p>Buon Divertimento!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>PokerTH: Una simulazione del Texas Hold'em Open Source2013-03-26T00:00:00+01:002013-03-26T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-26:/gratis-sul-web/PokerTH.html<p>Presentazione di PokerTH, un'ottima simulazione del famoso gioco di carte Texas Hold'Em.</p><h1>Presentazione di PokerTH, un'ottima simulazione del famoso gioco di carte Texas Hold'Em.</h1>
<p>Buongiorno a tutti, mai giocato a Texas Hold'em? È un gioco di carte, basato sui punti del poker, che si basa molto più sulla fortuna e la capacità di bluffare del suo lontano cugino "5 Draw Poker". Se volete provare l'ebrezza di una partita a Texas Hold'Em senza dover per forza tirar su una "bisca clandestina" o andare al casino, potete provare PokerTH.</p>
<p>PokerTH è una simulazione del Texas Hold'Em completamente open source e gratuita, con supporto per partite contro bots controllati dal Computer o contro i vostri amici tramite web.</p>
<p>Sicuramente da provare, è scaricabile gratuitamente dal <a href="http://www.pokerth.net/">sito ufficiale</a>, recentemente rinfrescato e rinnovato. Il gioco è anche disponibile per terminali mobili basati su Android.</p>
<p><strong>PokerTH è creato per far divertire, e non per "montare giri di scommesse". Non mi ritengo assolutamente responsabile per qualsivoglia uso illecito o illegale fatto di PokerTH</strong></p>
<p>Buon Divertimento a tutti!</p>
<p>Penaz.</p>Usiamo i SoundFont per migliorare o riparare TuxGuitar2013-03-24T00:00:00+01:002013-03-24T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-24:/misc/TuxGuitar_SoundFont.html<p>Vediamo come usare i SoundFont per migliorare l'output audio di TuxGuitar in modo che risulti più realistico.</p><h1>Vediamo come usare i SoundFont per migliorare l'output audio di TuxGuitar in modo che risulti più realistico.</h1>
<p>A volte capita, a seconda della scheda audio i midi cambiano di tonalità, ma solitamente c'è qualche difetto; il basso si sente troppo, la batteria è troppo piatta o la chitarra elettrica assomiglia vagamente ad un'anatra a cui viene "tirato il collo", a volte addirittura l'audio non si sente per nulla. Per fortuna esistono dei file, chiamati SoundFont che ci permettono di variare l'output della scheda audio, avendo un sonoro più realistico.</p>
<p>TuxGuitar è un ottimo lettore di tablature per chitarra che usa le caratteristiche di sintetizzazione del suono della nostra scheda audio per simulare gli strumenti, purtroppo anche qui il sintetizzatore lascia alquanto a desiderare ma per fortuna anche TuxGuitar supporta nativamente i SoundFont. A volte i SoundFont potrebbero essere fondamentali per avere un output sonoro da parte dello stesso TuxGuitar.</p>
<p>Su internet esistono moltissimi soundfont, gratuiti o a pagamento, per esempio sul Wiki Alsa è disponibile per il download il SoundFont principale usato nelle schede della Serie SoundBlaster Live (emu10k1), potete scaricarlo da <a href="http://alsa.opensrc.org/8MBGMSFX.SF2">qui</a>.</p>
<p>Ora vediamo come possiamo usare un qualsiasi SoundFont all'interno di TuxGuitar, iniziamo aprendo TuxGuitar:</p>
<p><img alt="Primo Passaggio" src="https://penazarea.altervista.org/images/2013/03/SF-1.jpg" /></p>
<p>Successivamente andiamo in Strumenti ? Plugin per poter modificare le impostazioni predefinite del sintetizzatore:</p>
<p><img alt="Secondo Passaggio" src="https://penazarea.altervista.org/images/2013/03/SF-2.jpg" /></p>
<p>Selezioniamo il plugin "Java Sound API Plugin" e clicchiamo su Configura:</p>
<p><img alt="Terzo Passaggio" src="https://penazarea.altervista.org/images/2013/03/SF-3.jpg" /></p>
<p>Nella finestra che apparirà è sufficiente cliccare su "Use Custom SoundBank" e cliccare sulla cartella, per poi navigare verso il SoundFont (con estensione *.SF2) che abbiamo scaricato:</p>
<p><img alt="Quarto Passaggio" src="https://penazarea.altervista.org/images/2013/03/SF-4.jpg" /></p>
<p>Dopodiché Clicchiamo su Ok, Chiudiamo tutto e riavviamo TuxGuitar, se tutto è andato per il verso giusto dovreste riuscire a sentire un cambiamento nel suono sintetizzato dal programma. Nel caso non vi piacesse il suono potete cambiare il SoundFont usato ripercorrendo tutti i passaggi precedenti oppure tornare al sintetizzatore predefinito scegliendo "Use Default SoundBank" all'ultimo passaggio.</p>
<p><strong>Mi è capitato più di una volta che l'output di Tuxguitar fosse completamente assente, in gran parte dei casi il problema è dovuto alla mancanza di informazioni per creare i suoni desiderati. L'uso di un SoundFont risolve questo tipo di problemi.</strong></p>
<p>E con questo ho Finito.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Nitronic Rush: Un ottimo Survival Racing Game2013-03-22T00:00:00+01:002013-03-22T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-22:/gratis-sul-web/NitroniRush.html<p>Presentazione di un ottimo Survival Racing Game: Nitronic Rush, usate tutte le abilità della vostra auto per sopravvivere!</p><h1>Presentazione di un ottimo Survival Racing Game: Nitronic Rush, usate tutte le abilità della vostra auto per sopravvivere!</h1>
<p>Buongiorno a tutti, oggi vi voglio presentare un racing game un po' atipico: Nitronic Rush.</p>
<p>Nitronic Rush è un Survival Racing Game, ancora una volta creato da studenti del Digipen Institure of Technology, in cui il vostro obiettivo non è arrivare per primi (infatti sarete da soli) ma quello di sopravvivere a tutti gli ostacoli che la città virtuale vi tirerà addosso usando tutte le abilità che la vostra auto ha da offrirvi tra cui la possibilità di volare, saltare, correre sui muri o sul soffitto (se la velocità è sufficiente).</p>
<p>Il gioco dispone, ad oggi, di una modalità storia, una modalità arcade, una modalità challenge ed una modalità stunt, oltre a varie mappe create dalla comunità. E come se tutto non bastasse vi è la difficilissima modalità hardcore che culmina con il fiammeggiante "Nitro Tunnel", riuscirete a superarlo? (Il mio record personale è 3 minuti 18 secondi e 49 centesimi). Inoltre sono attualmente disponibili 4 veicoli di cui uno (precisamente il commander) vi ricorderà molto da vicino la DeLorean DMC-12 della celeberrima trilogia di "Ritorno al Futuro". Se non avete visto "Ritorno al Futuro" allora andate dietro la lavagna per 15 minuti e poi guardatevi la trilogia tutta d'un fiato :D</p>
<p>Vi Lascio con il <a href="http://nitronic-rush.com/">link per scaricarlo gratuitamente</a>:</p>
<p><strong>Vi Consiglio di tener d'occhio il sito <a href="http://survivethedistance.com/">SurviveTheDistance.com</a>, in cui il team che ha creato Questo gioco sta lavorando al suo "seguito spirituale"</strong></p>
<p><strong>Aggiornamento: Ora distance è stato rilasciato su Steam</strong></p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Perspective: Un altro gioco basato sulla prospettiva2013-03-20T00:00:00+01:002013-03-20T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-20:/gratis-sul-web/Perspective.html<p>Dagli studenti della Digipen, ecco Perspective: un gioco in cui la prospettiva conta nella risoluzione dei problemi.</p><h1>Dagli studenti della Digipen, ecco Perspective: un gioco in cui la prospettiva conta nella risoluzione dei problemi.</h1>
<p>Appassionati di puzzle games, eccoci di nuovo qui, oggi parliamo di Perspective, un gioco creato da alcuni studenti del Digipen Institute of Technology.</p>
<p>Similmente ad <a href="https://penazarea.altervista.org/gratis-sul-web/Orthorobot.html">OrthoRobot</a>, in Perspective dovrete muovervi in uno spazio tridimensionale che cambierà a seconda della prospettiva, permettendo al vostro personaggio di passare da una parte all'altra della stanza. Sicuramente un gioco che riuscirà a tenerci incollati alla poltrona fino alla fine, distruggendo completamente la nostra normale percezione di 3D e 2D.</p>
<p>Potrete saltare tra piattaforme che stanno ai lati opposti della stanza senza alcun problema, anche se oltre alla "prospettiva" vi saranno altri ostacoli, come piattaforme che non potrete toccare, pena una brutta fine del vostro povero personaggio.</p>
<p>Ora non vi resta che provarlo, vi lascio con un video di gameplay e con il <a href="http://games.digipen.edu/games/perspective#.WTcOEhiUzQ0">Link per scaricarlo</a>, oltre ad un <a href="http://www.youtube.com/watch?v=SS4r9Fq3beU">Video Youtube</a></p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Love: Un framework per la creazione di videogiochi 2D2013-03-18T00:00:00+01:002013-03-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-18:/gratis-sul-web/Love.html<p>Love è un framework che ci permette di programmare i nostri giochi 2D usando il linguaggio lua.</p><h1>Love è un framework che ci permette di programmare i nostri giochi 2D usando il linguaggio lua.</h1>
<p>Buongiorno a tutti, oggi vi voglio presentare Love (in realtà il nome sarebbe Löve), un piccolo framework che vi permetterà di programmare facilmente i vostri giochi usando il linguaggio LUA.</p>
<p>Se avete il pallino della programmazione allora potrete programmare i vostri videogiochi 2D con una facilità disarmante, se invece non siete dei programmatori la facilità con cui creerete il vostro primo gioco 2D sarà solamente impressionante :D</p>
<p>Il linguaggio usato è <a href="http://www.lua.org/">lua</a>, solitamente usato per estendere altri programmi. In questo caso Love lo usa per la sua facilità di lettura e scrittura. Un esempio molto semplice, derivante direttamente dal <a href="http://www.love2d.org/wiki/Main_Page">Wiki Ufficiale</a> è il seguente:</p>
<div class="codehilite"><pre><span></span><code><span class="kr">function</span> <span class="nc">love</span><span class="p">.</span><span class="nf">draw</span><span class="p">()</span>
<span class="n">love</span><span class="p">.</span><span class="n">graphics</span><span class="p">.</span><span class="nb">print</span><span class="p">(</span><span class="s1">'Hello World!'</span><span class="p">,</span> <span class="mi">400</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
<span class="kr">end</span>
</code></pre></div>
<p>Questo programma creerà una finestra di dimensione 800x600 pixel nera e vi scriverà dentro "Hello World" in bianco, semplice, no?</p>
<p>Oltre al wiki esiste anche un fornitissimo <a href="http://love2d.org/forums/">Forum</a> ed un <a href="http://en.irc2go.com/webchat/?net=OFTC&room=love">canale IRC</a>, comunque tutte queste informazioni sono disponibili sul <a href="http://love2d.org/">Sito Ufficiale</a>.</p>
<p>Se volete provarlo non vi resta che precipitarvi sul <a href="http://love2d.org/">Sito Ufficiale</a> e procedere al download!</p>
<p>Buon divertimento a tutti!</p>
<p>Il viaggio continua!</p>
<p>Penaz.</p>Orthorobot: Un gioco tra 2D e 3D2013-03-16T00:00:00+01:002013-03-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-16:/gratis-sul-web/Orthorobot.html<p>Riempiamo il gap tra il 2D ed il 3D con OrthoRobot, un eccezionale puzzle game basato sulla prospettiva.</p><h1>Riempiamo il gap tra il 2D ed il 3D con OrthoRobot, un eccezionale puzzle game basato sulla prospettiva.</h1>
<p>Buongiorno a tutti gli appassionati di puzzle-game, ma anche agli altri :D . Oggi vi voglio presentare un fantastico gioco basato sulla prospettiva, in cui il vostro obiettivo sarà far arrivare il robottino dall'inizio fino alla parte verde del percorso, che rappresenta il traguardo: Orthorobot.</p>
<p>In Orthorobot la strada non sempre risulta percorribile, o almeno non a prima vista, basta infatti ruotare la visuale con il mouse per effettuare il cosiddetto "warping" e passare da una visuale tridimensionale ad una bidimensionale, che vi permetterà di oltrepassare buchi nel percorso altrimenti insormontabili.</p>
<p>Per aggiungere un po' di pepe, oltre a 16 livelli uno più difficile dell'altro (secondo il sito ufficiale sono "l'uno più frustrante dell'altro") in Orthorobot potrete cercare di fare nuovi record, raccogliendo tutte le monete ed effettuando il minor numero possibile di mosse e "warp".</p>
<p>Vi lascio con un <a href="http://www.youtube.com/embed/VYoKezEJoic">video di gameplay su youtube</a> ed il <a href="http://stabyourself.net/orthorobot/">link per il download</a></p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Gettext: lo strumento di traduzione dei programmi open2013-03-13T00:00:00+01:002013-03-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-13:/misc/Gettext.html<p>Non è necessario essere programmatori per dare il proprio contributo nella scena dell'open source software, scopriamo GNU Gettext.</p><h1>Non è necessario essere programmatori per dare il proprio contributo nella scena dell'open source software, scopriamo GNU Gettext.</h1>
<p>Ci sono molte persone estremamente volenterose che vorrebbero dare una mano a vari progetti open source, ma purtroppo non hanno le conoscenze di programmazione necessarie per il debug o il miglioramento dei programmi proposti dalla comunità open source, ma ci sono altri modi per contribuire: uno di questi è l'internazionalizzazione dei programmi stessi. Uno strumento molto usato nel campo open source è sicuramente GNU Gettext.</p>
<p>In realtà Gettext non è un unico strumento, ma un insieme di strumenti, volti all'internazionalizzazione dei software, ed essendo stato progettato per permettere la traduzione dell'intero OS GNU, Gettext è compatibile con un gran numero di linguaggi: C, C++, Object C, Python, GNU CLisp, Emacs Lisp, Bash, GNU Smalltalk, Java, GNU awk, Pascal, WxWidgets, YCP, Tcl, PHP, Pike, ed molti altri che non sto qui a citare.</p>
<p>Per quanto possa sembrare complicato in realtà l'uso è abbastanza semplice, la difficoltà più grossa è fatta dal programmatore, il quale dovrà usare Gettext all'interno del proprio programma, mentre il traduttore dovrà solamente far derivare un file <em>.po dal template creato dal programmatore, il quale ha estensione </em>.pot, il file *.po avrà una struttura simile alla seguente:</p>
<blockquote>
<h1>: /src/saluta.c:15</h1>
<p>msgid "Salve! Mi chiamo Giovanni\n"</p>
<p>msgstr "Salve! Mi chiamo Giovanni\n"</p>
</blockquote>
<p>Ora non resta che tradurre, manualmente o tramite appositi programmi, la stringa <em>msgstr</em> ottenendo:</p>
<blockquote>
<h1>: /src/saluta.c:15</h1>
<p>msgid "Salve! Mi chiamo Giovanni\n"</p>
<p>msgstr "Hi! My name is Giovanni\n"</p>
</blockquote>
<p>Successivamente sarà possibile compilare il file <em>.po in un file </em>.mo pronto per essere distribuito insieme al pacchetto proposto dallo sviluppatore, la lingua giusta sarà scelta automaticamente leggendo la variabile d'ambiente LANGUAGE.</p>
<p>Se volete vedere una breve introduzione a GNU Gettext, potete visitare la <a href="https://www.gnu.org/software/gettext/">Pagina Ufficiale</a>.</p>
<p>Questo è quanto, buona traduzione a tutti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Smover: Il Codice Sorgente2013-03-10T00:00:00+01:002013-03-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-10:/coding/Smover_Sources.html<p>Dopo alcune operazioni di pulizia e di commento del codice, ecco i sorgenti dei due files principali di Smover</p><h1>Dopo alcune operazioni di pulizia e di commento del codice, ecco i sorgenti dei due files principali di Smover</h1>
<p>Buongiorno a tutti, come promesso qualche tempo fa in questo articolo, oggi vi mostro i sorgenti che hanno portato a quel mostro di Frankenstein della programmazione quale è Smover.</p>
<p>Ricordo che Smover è stato creato con un un proposito molto semplice: Riordinare le mie cartelle. Ciò avviene tramite un filtro che permette di spostare file con diversa estensione in cartelle specifiche.</p>
<p>Per esempio tutti i PDF in Documenti/PDF, tutti gli mp3 e ogg in Documenti/Musica, eccetera.</p>
<p><strong>Update 2016:</strong> Sicuramente c'è un modo migliore di fare ciò, ma questo è ciò che sapevo fare ai tempi, ed ho fatto virtù della mia ignoranza</p>
<p>Cominciamo col cuore pulsante del programma, quello che fa la maggior parte del lavoro: il parser di configurazione. Quello che fa non è altro che leggere il file ext.conf e tradurne il contenuto in righe "move" all'interno del file batch "move.bat".</p>
<p>Il sorgente python è stato in seguito "congelato" e reso eseguibile tramite py2exe.</p>
<p>E proseguiamo con un altro pezzo importante del programma, Mover.</p>
<p>Questo pezzo effettua alcune operazioni importanti per la buona riuscita dei trasferimenti. Non fa altro che prendere in input il percorso completo della cartella da "Smuovere" per poi copiare, avviare e infine eliminare il file move.bat al suo interno.</p>
<p>Il repository completo per il programma si trova <a href="https://github.com/Penaz91/Smover">qui</a></p>
<p>Questo è quanto, buona codifica a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Smover - Smuoviamo i nostri files2013-03-04T00:00:00+01:002013-03-04T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-03-04:/coding/Smover.html<p>Un po' di Python, Un po' di AutoHotkey e un po' di Batch ed ecco Smover, un piccolo insieme di script che ho creato per riordinare in fretta le mie (disorganizzatissime) cartelle.</p><h1>Un po' di Python, Un po' di AutoHotkey e un po' di Batch ed ecco Smover, un piccolo insieme di script che ho creato per riordinare in fretta le mie (disorganizzatissime) cartelle.</h1>
<p>Ecco a tutti un esempio (abbastanza terrificante) di "programmazione fusion", ho deciso di creare questo Mostro di Frankenstein (programmato in circa 30 minuti) della programmazione informatica per rendere più veloce e meno tedioso il riordinamento dei files all'interno del mio PC, perennemente disordinato.</p>
<p>Il programma è costituito di 4 parti principali:</p>
<ul>
<li>Il file di configurazione <strong>ext.conf </strong>che mi permette di configurare le opzioni di spostamento</li>
<li>Il parser di configurazione, che traduce tutto ciò che è scritto in ext.conf</li>
<li>Il file <strong>move.bat</strong> generato dal parser, il vero e proprio esecutore delle operazioni di spostamento</li>
<li>L'eseguibile <strong>Mover0.0.1.exe</strong> che permette di far funzionare lo spostamento su ogni cartella</li>
</ul>
<p>Il file ext.conf contiene delle righe simili a questa:</p>
<blockquote>
<p>*.pdf|C:\Users\Utente\Documenti</p>
</blockquote>
<p>Dove:</p>
<ul>
<li><strong> *.pdf </strong>è il pattern sul quale il programma si baserà per gli spostamenti, in questo caso si intendono tutti i file PDF</li>
<li><strong> | </strong> è una<strong> </strong>barra verticale, che funge da separatore</li>
<li><strong>C:\Users\Utente\Documenti</strong> è il percorso in cui i files indicati nel pattern dovranno essere spostati.</li>
</ul>
<p>Il file di configurazione di Smover supporta un pattern per riga, è inoltre possibile filtrare i files in maniera diversa, per esempio:</p>
<blockquote>
<p>Fattura*.pdf|C:\Users\Utente\Documenti\Fatture</p>
</blockquote>
<p>Dirà al programma di spostare tutti i file il cui nome inizia per "Fattura" all'interno della cartella Fatture in Documenti.</p>
<p>Non vi resta che provare il tutto, scaricandolo da <a href="https://github.com/Penaz91/Smover/releases/download/0.0.1/Smover.7z">qui</a></p>
<p>Le istruzioni per l'installazione, l'uso, la configurazione e la disinstallazione sono comprese nell'archivio, scritte all'interno del file Readme.txt.</p>
<p>Quando avrò ripulito e commentato decentemente i sorgenti sarò lieto di fornirveli.</p>
<p><strong>Per esigenze di spazio e di velocità di navigazione, ho compresso il tutto in un archivio 7z. Se non riuscite ad aprirlo, procuratevi il programma <a href="http://www.7-zip.org">7Zip</a></strong></p>
<p><strong>Il programma, come tutti quelli che fornisco qui, è distribuito così com'è, senza alcuna garanzia di corretto funzionamento, perciò non mi ritengo responsabile di danni provocati da questo programma.</strong></p>
<p>Buona Movimentazione a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>
<p>Aggiornamento: Perchè non ho usato solo Python? Ai tempi non avevo grande esperienza in Python, in più mi sembrava interessante vedere come vari codici di programmazione potessero interagire tra loro fino alla creazione di qualcosa che assomigli ad un progetto completo.</p>Creiamo i nostri strategici in tempo reale con Stratagus2013-02-28T00:00:00+01:002013-02-28T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-28:/gratis-sul-web/Stratagus.html<p>Presentazione di Stratagus, uno motore appositamente creato per la costruzione di giochi strategici in tempo reale.</p><h1>Presentazione di Stratagus, uno motore appositamente creato per la costruzione di giochi strategici in tempo reale.</h1>
<p>Buongiorno, continuiamo il nostro viaggio nel game-development con la presentazione di Stratagus, un ottimo motore con cui potrete creare i vostri giochi di genere strategico in tempo reale.</p>
<p>Stratagus supporta molte caratteristiche, tra cui:</p>
<ul>
<li>Gioco tramite Wireless e Lan</li>
<li>Gioco contro Bot controllati dal PC</li>
</ul>
<p>Qui a lato uno screenshot di un gioco creato con questo motore, come è possibile vedere sono presenti tutti gli elementi base di ogni buon strategico in tempo reale: raccolta di risorse, combattimenti, torri, navi; tutto completamente personalizzabile fin nei più piccoli dettagli.</p>
<p>Se volete usare questo motore è sufficiente scaricarlo dal sito ufficiale, seguendo <a href="http://stratagus.com/index.shtml">questo link</a></p>
<p>Se invece volete semplicemente verificare le potenzialità del motore, anche se non siete programmatori, potete sempre provare uno dei giochi creati usando Stratagus, basta accedere alla sezione <a href="http://stratagus.com/games.shtml">Games</a></p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Stampiamo i PDF con blocco stampa, usando GhostView2013-02-26T00:00:00+01:002013-02-26T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-26:/misc/GhostView.html<p>Alcuni documenti PDF hanno il blocco stampa abilitato per vari motivi. Con GhostView è possibile stamparli</p><h1>Alcuni documenti PDF hanno il blocco stampa abilitato per vari motivi. Con GhostView è possibile stamparli</h1>
<p>A volte capita di avere necessità di stampare un documento in PDF, ma appena apriamo il documento e cerchiamo di stamparlo ci accorgiamo che il pulsante "Stampa" è oscurato, in questo caso non è necessario lasciarsi prendere dalla disperazione ma possiamo usare GhostView.</p>
<p>GhostView è un'interfaccia per GhostScript che ci permette di leggere i documenti PostScript e PDF, inoltre GhostView ignora completamente i Flag di blocco stampa, permettendoci di stampare il documento senza problemi o di esportarne una copia a sua volta stampabile senza alcun problema.</p>
<p>Potete scaricare il programma da qui: <a href="http://pages.cs.wisc.edu/~ghost/">Link</a></p>
<p>Buona stampa!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Rimettiamo in sesto windows, togliendo programmi dallo startup2013-02-24T00:00:00+01:002013-02-24T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-24:/misc/Startup_Windows.html<p>Alcuni piccoli consigli per rimuovere i programmi inutili che partono nella fase di startup del computer e migliorarne la velocità.</p><h1>Alcuni piccoli consigli per rimuovere i programmi inutili che partono nella fase di startup del computer e migliorarne la velocità.</h1>
<p>Succede: appena installato, Windows è fresco, veloce e reattivo; ma dopo qualche tempo il computer fa sempre più fatica a partire e il tempo che intercorre tra la pressione del pulsante di accensione e il momento in cui vi mettete a lavorare si dilata inesorabilmente.</p>
<p>La colpa è soprattutto dei programmi che partono all'avvio del pc, i cosiddetti "Startup Programs" che potrebbero essere in parte danneggiati o semplicemente in gran numero. Potete ovviare al problema in molti modi. Per prima cosa operate un aggiornamento di tutti i programmi presenti sul vostro PC.</p>
<p>Se volete provare a disabilitare manualmente i programmi all'avvio di Windows potete semplicemente usare l'utility <strong>MSConfig</strong> compresa all'interno di ogni PC Windows, anche se vi consiglio di usare un'utility più specifica tipo <a href="http://technet.microsoft.com/en-us/sysinternals/bb963902.aspx">Autoruns</a>, sempre di Microsoft.</p>
<p>Il programma è abbastanza intuitivo, ma per un uso avanzato vi consiglio di leggere l'articolo scritto proprio dal creatore del programma su Windows IT Pro Magazine, potete vederlo seguendo questo <a href="http://www.windowsitpro.com/article/registry2/autoruns-44089">Link</a></p>
<p>Ora non vi serve altro che sapere quali programmi potete togliere senza danneggiare il sistema, se non conoscete a memoria tutti i programmi di Windows allora potete far riferimento a quello che io considero l'elenco più completo di "Startup Programs" di windows, questo elenco contiene moltissimi programmi che potrebbero partire all'avvio del vostro PC, oltre a nomi di possibili malware non individuati dalla vostra suite di sicurezza, suddivisi per categorie: Necessari, Non Necessari/Sconsigliati, A Scelta dell'utente, Assolutamente non necessari/Dannosi.</p>
<p>Potete raggiungere l'elenco seguendo questo <a href="http://www.pacs-portal.co.uk/startup_search.php">Link</a></p>
<p>Se avete fatto tutto, il tempo di startup dovrebbe già essere migliorato, altrimenti potete mettere in atto ancora qualche strategia:</p>
<ul>
<li>Aggiornate di Driver, soprattutto di scheda video e audio</li>
<li>Disabilitate i suoni di sistema, se danneggiati possono bloccare l'avvio o lo spegnimento del sistema</li>
<li>Fate una scansione approfondita con antivirus e antispyware aggiornati, un malware attivo potrebbe rallentare il vostro PC.</li>
<li>Disabilitate qualche servizio di sistema che non viene mai usato</li>
<li>Fate una pulizia ed una deframmentazione del disco fisso.</li>
</ul>
<p>Il segreto per un PC sempre performante è la costanza, effettuate le operazioni che vi ho suggerito fin dall'inizio ed almeno una volta ogni 2 settimane, così da evitare "il lavoraccio" quando il pc inizierà ad arrancare, usate se possibile l'utilità "Operazioni Pianificate".</p>
<p>Buona Pulizia!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Abbattiamo un po' di non-morti su GunGirl22013-02-16T00:00:00+01:002013-02-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-16:/gratis-sul-web/GunGirl2.html<p>Se vi piacciono i giochi 2D in cui orde di non-morti cercano di distruggervi, dovete provare GunGirl 2.</p><h1>Se vi piacciono i giochi 2D in cui orde di non-morti cercano di distruggervi, dovete provare GunGirl 2.</h1>
<p>Buongiorno, oggi vi propongo un ottimo videogioco a piattaforme in cui dovete abbattere una marea di zombies e salvare il mondo dall'invasione. Il gioco non ha una gran trama dietro, semplicemente il mondo viene invaso da esseri non-morti mentre voi ve ne state beati a dormire, ma questa mancanza viene ampiamente compensata dal gameplay fluido e divertente. Il gioco ha una durata media di ben otto ore di puro divertimento splatter ed ha qualche accenno di missione secondaria e 5 armi potenziabili in 3 livelli (più una segreta), 9 tipologie di nemici comuni (più altre che non sono rivelate nel sito, ma che troverete giocando) che rendono il tutto decisamente più interessante.</p>
<p>Il gioco purtroppo è in lingua inglese, ma abbastanza comprensibile.</p>
<p>Se volete provarlo potete scaricarlo dal <a href="http://www.gungirl2.com/">Sito Ufficiale</a></p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Usiamo Blender per creare i nostri giochi 3D2013-02-14T00:00:00+01:002013-02-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-14:/gratis-sul-web/Blender_GameDev.html<p>Il famoso programma di modellazione di superfici Blender contiene anche un efficace motore per videogiochi.</p><h1>Il famoso programma di modellazione di superfici Blender contiene anche un efficace motore per videogiochi.</h1>
<p>Buongiorno. Molti conoscono il potentissimo modellatore di superfici 3D Blender, un software che dimostra la potenza dell'open source in maniera egregia. Il software, un po' complicato da usare all'inizio, vi permette di creare tutti gli elementi necessari a creare ottimi videogiochi tridimensionali che possono essere caricati in potenti motori come <a href="https://penazarea.altervista.org/gratis-sul-web/Ogre.html">OGRE</a> o <a href="https://penazarea.altervista.org/gratis-sul-web/IRRlicht.html">IRRlicht</a>. Ma non tutti sanno che all'interno di Blender esiste un potente game engine che vi permette di creare buoni videogiochi 3D sul posto. Il motore usa python come linguaggio di scripting e necessita di un po' di apprendimento per un uso efficace.</p>
<p>Potete trovare qualche tutorial sul sito ufficiale di Blender, basta seguire questo <a href="http://www.blender.org/education-help/tutorials/game-engine/">tutorial</a></p>
<p>Potete inoltre scaricare Blender da <a href="http://www.blender.org/download/get-blender/">Questo Indirizzo</a></p>
<p>Vi auguro un buon divertimento; il nostro viaggio nel game-development non è ancora terminato, continuerò a proporvi strumenti gratuiti per dare sfogo alla vostra creatività.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Let's use Blender to create our own 3D games2013-02-14T00:00:00+01:002013-02-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-14:/en/gratis-sul-web/Blender_GameDev.html<p>Blender, the famous surface modelling software contains also a game engine.</p><h1>Blender, the famous surface modelling software contains also a game engine.</h1>
<p>Hello everybody. Many know the powerful 3D surface modeller that goes by the name of Blender, a software that demonstrates the power of open source really well. The software, pretty complicated to use at the beginning, allows you to create all the necessary stuff to craft nice 3D videogames, such stuff can then be loaded in powerful engines like <a href="https://penazarea.altervista.org/en/gratis-sul-web/Ogre.html">OGRE</a> or <a href="https://penazarea.altervista.org/en/gratis-sul-web/IRRlicht.html">IRRlicht</a>. Not everybody knows that inside Blender there is a powerful game engine that will let you create good videogames right on the spot. The engine uses Python as a scripting language and needs some learning to be used well.</p>
<p>You can find some tutorials on Blender's website, you just need to follow this <a href="http://www.blender.org/education-help/tutorials/game-engine/">tutorial</a></p>
<p>Also you can download Blender from <a href="http://www.blender.org/download/get-blender/">This link</a></p>
<p>Have fun everybody, our trip in the world of game development is not over yet, I'll keep on showing free tools to unleash your creativity.</p>
<p>See you in the next post!</p>
<p>Penaz.</p>Pygame - Impariamo a programmare videogiochi per davvero2013-02-02T00:00:00+01:002013-02-02T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-02:/misc/Pygame.html<p>Presentazione di PyGame, un wrapper delle librerie SDL per Python. Un ottimo strumento per iniziare a programmare videogiochi per davvero.</p><h1>Presentazione di PyGame, un wrapper delle librerie SDL per Python. Un ottimo strumento per iniziare a programmare videogiochi per davvero.</h1>
<p>Buongiorno, continuiamo il nostro viaggio nel game-development esplorando PyGame.</p>
<p>PyGame non è altro che un wrapper per le librerie SDL (Simple DirectMedia Layer) per Python.</p>
<p>Python è un linguaggio molto carino, eccone le caratteristiche salienti:</p>
<ul>
<li><strong>Multipiattaforma:</strong> un listato di python può essere eseguito su qualunque sistema operativo (Windows, Linux, MacOS) senza dover essere modificato.</li>
<li><strong>Interpretato</strong> ma non per questo "lento", infatti python prende in prestito alcuni "trucchi" dai linguaggi compilati, in modo da rendere l'esecuzione più veloce. Alcune varianti come PyPy o Psyco usano un vero e proprio compilatore</li>
<li><strong>Multiparadigma</strong> diversamente da linguaggi come C, ProLogic che seguono un solo paradigma, con python è possibile usare diversi paradigmi di programmazione come quello procedurale (C) o logico (ProLogic).</li>
<li><strong>A tipizzazione dinamica:</strong> non sempre è possibile definire in anticipo il tipo che una variabile assumerà, in python il problema non si presenta in quanto una variabile assumerà il suo tipo quando verrà usata, è comunque possibile usare Python con I tipi di C tramite CPython, dando la possibilità di una tipizzazione statica.</li>
<li><strong>A tipizzazione forte</strong>: quando una variabile assume un proprio tipo, questo non può essere cambiato. Secondo questa definizione Python è sicuramente a tipizzazione forte, quando ogni variabile ha assunto un proprio tipo, l'interprete controlla che non si eseguano operazioni "proibite" (che senso ha sommare un numero con una stringa?)</li>
</ul>
<p>Pygame si inserisce come modulo e permette di gestire la libreria grafica SDL e creare dai semplici giochini fino a cose molto più complesse.</p>
<p>Per programmare potete usare un qualsasi editor di testo, oppure un IDE come Eclipse o ancora IDLE, un editor già incluso nel pacchetto di installazione.</p>
<p>Sul <a href="http://www.pygame.org/news.html">Sito Ufficiale</a> potrete scaricare il pacchetto, inoltre troverete guide e moltissimi esempi sull'argomento.</p>
<p>Non vi resta che iniziare.</p>
<p>Buon Divertimento a tutti!</p>
<p>Saluti e al prossimo post.</p>
<p>Penaz.</p>Pygame - Learn to code games for real2013-02-02T00:00:00+01:002013-02-02T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-02-02:/en/misc/Pygame.html<p>Introducing PyGame, a python wrapper for SDL. A nice tool to start coding videogames for real.</p><h1>Introducing PyGame, a python wrapper for SDL. A nice tool to start coding videogames for real.</h1>
<p>Greetings everybody, let's continue our trip in the world of game development by taking a look at PyGame.</p>
<p>PyGame is nothing else than a wrapper around SDL (Simple DirectMedia Layer) libraries, on Python.</p>
<p>Python is a really nice language, here are some of its features:</p>
<ul>
<li><strong>Cross-Platform:</strong> a python code listing can be executed in any operating system (Windows, Linux, MacOS) without needing any editing.</li>
<li><strong>Interpreted</strong> but not "slow", python uses some tricks coming from compiled languages to make the execution faster. Some variants like PyPy or Psyco use a Just-in-time compiler.</li>
<li><strong>Multiparadigm</strong> differently from C and ProLogic, which only follow a certain paradigm, Python supports procedural programming (C-style) as well as logic programming (ProLogic).</li>
<li><strong>Dynamic Typing:</strong> it's not always possible to know a variable type in advance, there is no such issue in Python since the variable will get its type when used, and it's still possible to use C types via CPython, allowing for static typing.</li>
<li><strong>Strong Typing</strong>: when a variable has a type, that type can't be changed. According to this definition, Python is strongly typed, when a variable has gotten its own type, the interpreter checks for illegal operations (trying to sum a string to an integer doesn't quite make sense)</li>
</ul>
<p>Pygame is a module that allows to manage SDL and create anything from simple little games to stuff a lot more complex.</p>
<p>To code you can use any text editor, or an IDE like Eclipse or IDLE, an editor included in the Python package.</p>
<p>On the <a href="http://www.pygame.org/news.html">Official Website</a> you can download the package, as well as find lots of tutorials, guides and examples.</p>
<p>Now you just need to start coding.</p>
<p>Have fun everybody!</p>
<p>See you in the next post.</p>
<p>Penaz.</p>IRRlicht - Un altro motore grafico opensource da provare2013-01-31T00:00:00+01:002013-01-31T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-31:/gratis-sul-web/IRRlicht.html<p>Presentazione di IRRLicht, un motore di rendering 3d completamente Open Source estremamente leggero, veloce e completo di tutte le funzioni per creare giochi che non invidiano nulla a quelli commerciali.</p><h1>Presentazione di IRRLicht, un motore di rendering 3d completamente Open Source estremamente leggero, veloce e completo di tutte le funzioni per creare giochi che non invidiano nulla a quelli commerciali.</h1>
<p>Buongiorno, prosegue il nostro viaggio all'interno del mondo del Game Development e oggi diamo un'occhiata ad IRRLicht, un motore di rendering 3d in tempo reale "veloce come un fulmine".</p>
<p>Le caratteristiche di rilievo sono:</p>
<ul>
<li>Rendering ad alte prestazioni con Direct3D e OpenGL</li>
<li>Enorme libreria interna di materiali estensibile</li>
<li>Sistema particellare</li>
<li>environment mapping</li>
<li>2 renderers software indipendenti dalla piattaforma e dai drivers</li>
<li>Importazione diretta di molti formati di modello (.obj, .3ds, .dae, .b3d, ....)</li>
<li>Importazione diretta di molti formati di textures (.bmp, .png, .psd, ......)</li>
<li>Matematica 3d Ottimizzata</li>
<li><a href="http://irrlicht.sourceforge.net/features/">Molto altro</a></li>
</ul>
<p>Questo motore è cross-platform, cioè è compatibile con molti sistemi operativi, tra cui Windows, Linux e MacOS. Il motore è compatibile con molti linguaggi, grazie ai numerosi wrapper per C#.NET, FreeBasic, VB.NET e altri linguaggi .NET e non.</p>
<p>Sul <a href="http://irrlicht.sourceforge.net/">sito ufficiale</a> potete trovare l'SDK per iniziare subito ad usare questo fantastico motore oltre ad una nutrita sezione tutorial per iniziare facilmente.</p>
<p>Questo è tutto, Buon Divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>IRRlicht - Another open source engine to try out2013-01-31T00:00:00+01:002013-01-31T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-31:/en/gratis-sul-web/IRRlicht.html<p>Introducing IRRLicht, a 3D rendering engine that is completely Open Source, extremely lightweight, fast and complete of all the features you need to create videogames just like the ones you can buy.</p><h1>Introducing IRRLicht, a 3D rendering engine that is completely Open Source, extremely lightweight, fast and complete of all the features you need to create videogames just like the ones you can buy.</h1>
<p>Hello, let's continue our voyage in the world of Game Development and today we take a look at IRRLicht, a 3d real time rendering engine that is "light-fast".</p>
<p>Some features are:</p>
<ul>
<li>High performance rendering with Direct3D and OpenGL</li>
<li>Huge and extensible library of materials</li>
<li>Particle System</li>
<li>Environment mapping</li>
<li>2 Software renderers that are indipendent from the platforms and the drivers</li>
<li>Direct Import of many model formats (.obj, .3ds, .dae, .b3d, ....)</li>
<li>Direct Import of many texture formats(.bmp, .png, .psd, ......)</li>
<li>Optimized 3D math</li>
<li><a href="http://irrlicht.sourceforge.net/features/">Much more</a></li>
</ul>
<p>This engine is cross-platform, that means it works on many Operating systems, including Windows, Linux and MacOS. The engine is compatible with many languages, thanks to numerous wrappers for C#.NET, FreeBasic, VB.NET and other .NET and non-.NET languages.</p>
<p>On the <a href="http://irrlicht.sourceforge.net/">IRRLicht Website</a> you can find the SDK to start using the engine immediately as well as an extensive tutorials section to start up easily.</p>
<p>That's all for today, have fun everybody!</p>
<p>See you at the next post!</p>
<p>Penaz.</p>OGRE - Un motore grafico opensource per i nostri progetti2013-01-29T00:00:00+01:002013-01-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-29:/gratis-sul-web/Ogre.html<p>Presentazione di OGRE, un motore di rendering OpenSource estremamente popolare con tutte le caratteristiche che servono per creare i vostri videogiochi 3d.</p><h1>Presentazione di OGRE, un motore di rendering OpenSource estremamente popolare con tutte le caratteristiche che servono per creare i vostri videogiochi 3d.</h1>
<p>Buongiorno, continuiamo il nostro viaggio all'interno del Game Development con un motore di Rendering Tridimensionale Open Source: OGRE. OGRE vi permetterà di creare i vostri giochi 3d utilizzando una valanga di strumenti; ovviamente dovete conoscere un po' di programmazione avanzata in C++ per poterlo usare proficuamente, ma quando lo avrete imparato vi saprà dare grandi soddisfazioni.</p>
<p>Tra le caratteristiche di OGRE troviamo:</p>
<ul>
<li>Supporto direct3D e OpenGL</li>
<li>Supporto per pixel/vertex shader</li>
<li>Possibilità di caricamento delle texture da JPG, PNG e formati meno comuni come Texture Volumetriche</li>
<li>Sistemi di particelle</li>
<li><a href="http://www.ogre3d.org/about/features">Molto altro</a></li>
</ul>
<p>Sul <a href="http://www.ogre3d.org/">Sito Ufficiale</a> di OGRE potete trovare i download dell'SDK per Visual C++.net 2008 e 2010, oltre che le versioni compatibili con iOS, MacOS e MinGW. Tra le vecchie versioni potete trovare anche quella compatibile con il vecchio Visual C++ 2005.</p>
<p>Sul fondo della pagina di download degli SDK, potete trovare anche dei wrapper per i linguaggi di programmazione Java e Python, anche se i migliori risultati in termini prestazionali si ottengono con C++.</p>
<p>Questo è quanto. Buon Divertimento!</p>
<p>Penaz</p>OGRE - An opensource 3D engine for our projects2013-01-29T00:00:00+01:002013-01-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-29:/en/gratis-sul-web/Ogre.html<p>Introducing OGRE, a really popular Open source rendering engine, with all the features you need to create 3D videogames.</p><h1>Introducing OGRE, a really popular Open source rendering engine, with all the features you need to create 3D videogames.</h1>
<p>Greetings, let's keep going with our trip in the world of Game Development with a 3D rendering engine which is also Open Source: OGRE. OGRE will let you create your own 3D games using a whole lot of tools; obviously you need to know a bit of advanced C++ programming to use it well, but after learning it, this program will give you huge satisfaction.</p>
<p>Among OGRE's features we find:</p>
<ul>
<li>Support for direct3D and OpenGL</li>
<li>Vertex/Pixel shader support</li>
<li>Loading textures from JPG, PNG and lesser known formats like Volumetric Textures</li>
<li>Particle systems</li>
<li><a href="http://www.ogre3d.org/about/features">Much more</a></li>
</ul>
<p>On the <a href="http://www.ogre3d.org/">official Website</a> you can find downloads for the SDK compatible with Visual C++.net 2008 and 2010, as well as versions compatible with iOS, MacOS and MinGW. Among the old versions you can find the one that works with the old Visual C++ 2005.</p>
<p>On the bottom of the SDK download page, you can find various wrappers for Java and Python, even though the best results are obtained with C++, performance-wise.</p>
<p>That's all, have fun!</p>
<p>Penaz</p>Construct - Un altro strumento per creare i nostri videogiochi2013-01-21T00:00:00+01:002013-01-21T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-21:/gratis-sul-web/Construct.html<p>Presentazione di construct, un semplice strumento che potete usare per creare i vostri videogiochi 2D.</p><h1>Presentazione di construct, un semplice strumento che potete usare per creare i vostri videogiochi 2D.</h1>
<p>Buongiorno, oggi per continuare la nostra avventura nel game-development vi presento construct-classic: un ottimo motore per la creazione di videogiochi in 2 dimensioni. Il motore era commercializzato da Scirra che ora si è concentrata su Construct2, la nuova versione dell'applicativo. Invece di tenersi stretta i diritti sul programma l'azienda ha deciso di fornire alla comunità i sorgenti del primo construct, fornendo anche una pagina dedicata nel proprio sito.</p>
<p>Il vantaggio primario di questo applicativo è la facilità d'uso, infatti è possibile creare interi videogiochi senza dover scrivere una singola linea di codice, infatti il programma si basa su una logica ad eventi, del tipo:</p>
<blockquote>
<p>Viene premuto spazio? Spara</p>
<p>il proiettile colpisce il personaggio X - il personaggio X muore e il proiettile sparisce</p>
</blockquote>
<p>molto semplice da usare e soprattutto divertente.</p>
<p>Perfetto per chiunque abbia intenzione di approcciarsi al mondo della programmazione videoludica senza doversi seppellire in un monte di libri riguardanti programmazione, design dei livelli, teoria del divertimento, programmazione missilistica, teoria delle stringhe o il più conosciuto "Creare un universo in 10 semplici passi - edizione compatta".</p>
<p>Decisamente da provare.</p>
<p>Potete scaricare construct da <a href="http://www.scirra.com/construct-classic">questo link</a></p>
<p>Non vi resta che gettarvi a capofitto nel mondo della creazione di videogiochi!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Creiamo gratis le nostre avventure grafiche2013-01-17T00:00:00+01:002013-01-17T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-17:/gratis-sul-web/AvventureGrafiche.html<p>Presentazione di uno strumento per la creazione di avventure grafiche in maniera facile e veloce.</p><h1>Presentazione di uno strumento per la creazione di avventure grafiche in maniera facile e veloce.</h1>
<p>Buongiorno a tutti, oggi vi presento uno strumento che vi permetterà di creare le vostre avventure grafiche (ricordate Monkey Island?) in maniera semplice e veloce.</p>
<p>Lo strumento in questione si chiama Adventure Game Studio ed è disponibile gratuitamente presso <a href="http://www.adventuregamestudio.co.uk/">Questo sito</a>. Prendete i vostri elementi grafici, create la vostra storia e lasciate che il programma faccia il resto.</p>
<p>Sul sito sono disponibili anche videogiochi che dimostrano le potenzialità di questo programma, inoltre troverete il forum in cui potrete chiedere chiarimenti di qualunque tipo. Non vi resta che provarlo!</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti!</p>
<p>Penaz.</p>Alcuni strumenti per creare i vostri giochi in stile RPG2013-01-09T00:00:00+01:002013-01-09T00:00:00+01:00Penaztag:penazarea.altervista.org,2013-01-09:/gratis-sul-web/RPG_Dev.html<p>Presentazione di alcuni strumenti per poter creare in poco tempo i vostri RPG (giochi di ruolo) in maniera semplice e veloce e con strumenti gratuiti.</p><h1>Presentazione di alcuni strumenti per poter creare in poco tempo i vostri RPG (giochi di ruolo) in maniera semplice e veloce e con strumenti gratuiti.</h1>
<p>Buongiorno, oggi vi voglio presentare alcuni programmi che vi permetteranno di creare i vostri RPG-Games in maniera semplice e veloce.</p>
<p>Iniziamo con OHRRPGCE (Official Hamster Republic Role Playing Game Construction Engine), dietro a questo lungo ed impronunciabile acronimo si cela uno strumento veramente completo per la creazione di RPG in 2 dimensioni. Il sito propone il download del software, oltre ad una serie di tutorial per impararne l'uso, documentazione, script di esempio e molto molto altro. Potete provarlo seguendo questo <a href="http://rpg.hamsterrepublic.com/ohrrpgce/Main_Page">Link</a></p>
<p>Un altro valido strumento di creazione di RPG è RPGtoolkit, che vi permette di creare ottimi RPG in maniera abbastanza semplice. Il programma è supportato da un'estesa comunità e sul sito sono presenti molti contributi giocabili che vi permettono di farvi un'idea della potenza di questo strumento. Potete provarlo visitando la <a href="http://rpgtoolkit.net/home/">pagina ufficiale</a>.</p>
<p>L'ultimo link che vi voglio proporre è il link al Wiki di Sphere RPG Engine, dove potete trovare tutte le informazioni necessarie per iniziare ad usare questo potentissimo motore per la creazione di RPG. Sul Wiki sono presenti molti tutorial, documentazioni, news e molto altro. Non vi resta che provarlo: basta seguire questo <a href="http://spheredev.org/wiki/Main_Page">Link</a></p>
<p>Vi Auguro buon Divertimento!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Game Editor: Un'alternativa Open a GameMaker2012-12-18T00:00:00+01:002012-12-18T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-18:/gratis-sul-web/GameEditor.html<p>Presentazione di Game Editor, un'ottima alternativa a GameMaker. OpenSource e Gratuita se create giochi sotto licenza GPLv3.</p><h1>Presentazione di Game Editor, un'ottima alternativa a GameMaker. OpenSource e Gratuita se create giochi sotto licenza GPLv3.</h1>
<p>Buongiorno, oggi vi presento Game Editor, un'alternativa estremamente completa e gratuita al più famoso GameMaker. Game Editor è completamente gratuito ma ha una limitazione: potete usarlo solamente per creare videogiochi rilasciati sotto licenza GPLv3, in caso contrario sarete costretti ad acquistare una licenza <a href="http://game-editor.com/License">leggete l'informativa sulla licenza</a>.</p>
<p>Se volete creare videogiochi opensource il problema non si pone.</p>
<p>Come GameMaker, con Game Editor potete creare i vostri videogames senza dover scrivere alcuna riga di codice, il programma dispone di un'interfaccia molto semplice e veloce da imparare, comunque esistono molte guide su internet. Basta cercare con un qualsiasi motore di ricerca.</p>
<p>Potete scaricare Game Editor seguendo questo <a href="http://sourceforge.net/projects/game-editor/?source=directory">Link</a></p>
<p>Il programma è compatibile con Windows e Linux.</p>
<p><strong>Alcuni utenti ravvisano un allarme da parte del proprio antivirus la presenza di un cavallo di Troia (Trojan Horse), una scansione su <a href="www.virustotal.com">VirusTotal</a> non ha rilevato nulla di anomalo.</strong></p>
<p>Grazie per aver letto e ci vediamo alla prossima!</p>
<p>Penaz</p>Enigma: Un ottimo puzzle-game da provare2012-12-16T00:00:00+01:002012-12-16T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-16:/gratis-sul-web/Enigma.html<p>Presentazione di Enigma, un videogioco ispirato ad Oxyd per Atari, in cui dovrete accoppiare le pietre di colore uguale. Facile? Naa...</p><h1>Presentazione di Enigma, un videogioco ispirato ad Oxyd per Atari, in cui dovrete accoppiare le pietre di colore uguale. Facile? Naa...</h1>
<p>Buongiorno, se volete un puzzle-game che ricordi la vecchia gloria Oxyd per Atari o Rock'n'roll per l'Amiga non potete non provare Enigma.</p>
<p>Lo scopo principale del gioco è quello di accoppiare le pietre con all'interno lo stesso colore nel minor tempo possibile.</p>
<p>A sbarrarci la strada ci saranno porte, cancelli, nemici e trappole di ogni tipo e dovremo spremere per bene le nostre meningi per poterne venire fuori. Enigma è un vero e proprio mind-bender fatto come si deve.</p>
<p>Il gioco è rilasciato sotto licenza GPL e potete scaricarlo gratis da <a href="http://www.nongnu.org/enigma/">questo link</a></p>
<p>Oltretutto potete anche creare i vostri livelli ed aggiungerne di nuovi al gioco.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Creiamo videgiochi senza saper programmare con GameMaker2012-12-14T00:00:00+01:002012-12-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-14:/misc/GameMaker.html<p>Presentazione di Game Maker, uno strumento che ci permetterà di creare i nostri primi videogames senza dover per forza saper programmare.</p><h1>Presentazione di Game Maker, uno strumento che ci permetterà di creare i nostri primi videogames senza dover per forza saper programmare.</h1>
<p>Salve a tutti! Oggi vi voglio presentare uno strumento che vi permetterà di creare i vostri primi videogames senza dover scrivere una sola linea di codice. Il programma in questione si chiama Game Maker e lo potete scaricare dal sito di <a href="http://www.yoyogames.com/gamemaker/windows">YoYoGames</a>. Esistono più versioni di Game Maker quella più interessante ve l'ho appena linkata; l'altra, non meno interessante, è la versione Studio disponibile in versioni Free, Standard, Pro, Master Collection che si differenziano a seconda delle limitazioni di funzionalità. Trovo che la versione Lite che vi ho proposto sia più che sufficiente per iniziare la vostra esperienza nel campo del game-development.</p>
<p>Nel caso vogliate andare più a fondo Game Maker è dotato di un proprio linguaggio, chiamato GML (Game Maker Language) che vi permetterà di controllare ogni singolo aspetto della vostra nuova creatura. La curva di apprendimento è abbastanza veloce e con qualche tutorial vi ritroverete presto a scrivere a più non posso e senza alcuna difficoltà.</p>
<p>Come supporto vi propongo il link dell' informatissima comunità italiana di Game Maker: <a href="http://gamemakeritalia.it/portale/">Game Maker Italia</a>, farcita di tutorial, guide, consigli e news sul programma oltre che una marea di videogiochi creati con questo programma.</p>
<p>Non vi resta che provare a dare vita alle vostre idee.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Conosciamo WxMaxima, un tool per tutti i matematici2012-12-13T00:00:00+01:002012-12-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-13:/gratis-sul-web/WxMaxima.html<p>Installiamo WxMaxima, un ottimo ambiente matematico per Windows e Linux, perfetto per studi alle scuole superiori o università.</p><h1>Installiamo WxMaxima, un ottimo ambiente matematico per Windows e Linux, perfetto per studi alle scuole superiori o università.</h1>
<p>Maxima è un ottimo ambiente matematico, discendente di Macsima il leggendario ambiente matematico creato negli anni '60 dal MIT, il ramo Maxima è stato mantenuto in vita dal 1982 fino al 2001, ora è disponibile come software Open Source.</p>
<p>WxMaxima non è altro che un ambiente grafico per Maxima, basato su WxWidgets che permette di avere tutto a disposizione senza per forza dover imparare a memoria tutti i comandi che questo applicativo ci mette a disposizione.</p>
<p>L'installazione sotto Windows non è assolutamente diversa da quelle che conosciamo già, mentre sotto linux potrebbe risultare un po' più difficile.</p>
<p>Se possedete gentoo linux potete emergere direttamente WxMaxima dal Portage, cosa assolutamente importante è avere un interprete lisp che solitamente viene emerso insieme a Maxima.</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge wxmaxima</span>
</code></pre></div>
<p>I problemi più grossi si presentano quando l'emerge fallisce; solitamente a causa proprio dell'interprete lisp predefinito (gcl se non sbaglio), in tal caso avete più vie con le quali cambiare l'interprete usato, io solitamente uso CLisp:</p>
<ol>
<li><strong>Emergere Maxima con la USE flag CLisp temporanea</strong>: è il metodo più semplice, ma al prossimo aggiornamento Gentoo tenterà di emergere Maxima con l'interprete predefinito. Basta semplicemente dare:</li>
</ol>
<div class="codehilite"><pre><span></span><code><span class="err">USE=clisp emerge maxima</span>
</code></pre></div>
<div class="codehilite"><pre><span></span><code><span class="err">emerge wxmaxima</span>
</code></pre></div>
<ol>
<li><strong>Emergere Maxima con la USE Flag CLisp stabile:</strong> il metodo richiede un attimo più di tempo, ma funzionerà fino alla fine dei tempi (o del vostro computer), basta eseguire questa operazione, da root:</li>
</ol>
<div class="codehilite"><pre><span></span><code><span class="err">echo "sci-mathematics/maxima clisp" >> /etc/portage/package.use</span>
</code></pre></div>
<div class="codehilite"><pre><span></span><code><span class="err">emerge wxmaxima</span>
</code></pre></div>
<p>Importantissimo usare le due parentesi angolari (>>) così da <strong>aggiungere</strong> <em>sci-mathematics/maxima clisp</em> al file /etc/portage/package.use, altrimenti tutto il contenuto ne risulterà sovrascritto e potrebbero verificarsi problemi per quanto riguarda il sistema.</p>
<p>Dopo aver installato basta avviare WxMaxima ed inserire la nostra funzione nella forma:</p>
<blockquote>
<p>f(x) := x²+1</p>
</blockquote>
<p>dopo aver premuto Shift+Invio potremo operare su f(x) come vorremo.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Giochi online gratis2012-12-12T00:00:00+01:002012-12-12T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-12:/gratis-sul-web/giochi-online-gratis.html<p>Presentazione di alcuni link a siti in cui potrete giocare a giochi online, perfetti se avete un po' di tempo morto da perdere.</p><h1>Presentazione di alcuni link a siti in cui potrete giocare a giochi online, perfetti se avete un po' di tempo morto da perdere.</h1>
<p>Buongiorno a tutti, oggi voglio consigliarvi un paio di links che potete usare per giocare ad alcuni giochini molto semplici che vi permetteranno di riempire eventuali "tempi morti" come per esempio le pause pranzo lavorative quando fuori nevica e volete mangiare in ufficio.</p>
<p>Il primo link è <a href="http://www.miniclip.com/games/it/#">MiniClip</a> un sito ricco di giochini molto ben fatti e suddivisi per categorie, troverete cloni di vecchie glorie del mondo videoludico ma anche giochi con meccaniche totalmente nuove. Sicuramente da provare, inoltre il sito è completamente tradotto in italiano così i non anglofoni non dovranno preoccuparsi. Io personalmente vi consiglio di provare <a href="http://www.miniclip.com/games/bloxorz/it/">Bloxorz</a>, un puzzle-game in cui dovrete guidare un blocco di dimensione 2x1 unità attraverso vari terreni fino a raggiungere il traguardo; un vero e proprio mind-bender.</p>
<p>L'altro link che voglio proporvi è <a href="https://www.newgrounds.com/">Newgrounds</a> che offre un sacco di giochi in Flash, oltre a video (sempre in Flash) come cartoni animati e molto altro.</p>
<p><strong>Il materiale all'interno di NewGrounds, data la grande mole di dati, è scarsamente controllato perciò potrebbero esserci giochi o video classificabili come NSFW (Not Safe For Work). Uomo avvisato...</strong></p>
<p>Ricordo che i giochi sono creati con Adobe Flash, quindo potreste aver bisogno di installare <a href="get.adobe.com/it/flashplayer/">Flash Player</a> o <a href="get.adobe.com/shockwave/">Shockwave</a> Player a seconda del videogioco. Inoltre ricordo che Flash è un applicativo preso di mira molto spesso da Pirati Informatici perciò: Antivirus e antispyware aggiornati ed eventualmente un buon firewall oltre ad aggiornare sempre gli stessi player che avete scaricato; se li avete installati con le impostazioni predefinite l'aggiornamento sarà automatico.</p>
<p>Questo è tutto per oggi, nei prossimi giorni vi proporrò qualche strumento per <strong>creare i vostri videogames. </strong>Restate Sintonizzati!</p>
<p>Buon Divertimento!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>MPD4Skype - Uno script di "Now Playing" per skype ed MPD2012-12-11T00:00:00+01:002012-12-11T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-11:/coding/mpd4skype-uno-script-di-now-playing-per-skype-ed-mpd.html<p>Un piccolo pezzettino di codice che ho creato per fare in modo che nel cosiddetto "Mood Text" di Skype compaia la canzone che state ascoltando con MPD.</p><h1>Un piccolo pezzettino di codice che ho creato per fare in modo che nel cosiddetto "Mood Text" di Skype compaia la canzone che state ascoltando con MPD.</h1>
<p>Buongiorno; dopo varie ricerche su internet ho notato l'assenza di uno script che permetta di collegare Music Player Daemon (mpd) con Skype, similmente a quello che si può fare con Amarok. Allora nel pieno spirito del programmatore pazzo, ho deciso di scrivermelo da me ed ecco il risultato.</p>
<p>Per funzionare è necessario aver installato Skype4Py e Python-MPD nel proprio PC.</p>
<p>Il codice è abbastanza breve ed ha un minimo di gestione delle eccezioni, lo cito qui nel caso voleste darci una rapida occhiata.</p>
<div class="codehilite"><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="c1">#LICENSE: MIT</span>
<span class="n">status</span><span class="o">=</span><span class="p">{}</span>
<span class="kn">import</span> <span class="nn">Skype4Py</span>
<span class="kn">import</span> <span class="nn">mpd</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="c1">#Connessione ad mpd</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">server</span><span class="o">=</span><span class="n">mpd</span><span class="o">.</span><span class="n">MPDClient</span><span class="p">()</span>
<span class="n">server</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s2">"127.0.0.1"</span><span class="p">,</span><span class="mi">6600</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Impossibile connettersi ad mpd"</span><span class="p">)</span>
<span class="n">quit</span><span class="p">()</span>
<span class="c1">#Connessione a Skype</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">skype</span><span class="o">=</span><span class="n">Skype4Py</span><span class="o">.</span><span class="n">Skype</span><span class="p">(</span><span class="n">Transport</span><span class="o">=</span><span class="s1">'x11'</span><span class="p">)</span>
<span class="n">skype</span><span class="o">.</span><span class="n">Attach</span><span class="p">()</span>
<span class="n">oldmood</span><span class="o">=</span><span class="n">skype</span><span class="o">.</span><span class="n">CurrentUserProfile</span><span class="o">.</span><span class="n">_GetMoodText</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Impossibile connettersi a Skype"</span><span class="p">)</span>
<span class="n">quit</span><span class="p">()</span>
<span class="c1">#Ricavo la canzone corrente</span>
<span class="k">def</span> <span class="nf">doit</span><span class="p">():</span>
<span class="k">global</span> <span class="n">t</span>
<span class="n">t</span><span class="o">=</span><span class="n">threading</span><span class="o">.</span><span class="n">Timer</span><span class="p">(</span><span class="mf">5.0</span><span class="p">,</span><span class="n">doit</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">oldstatus</span><span class="o">=</span><span class="n">status</span>
<span class="k">global</span> <span class="n">status</span>
<span class="n">status</span><span class="o">=</span><span class="n">server</span><span class="o">.</span><span class="n">status</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Arresto del monitor di status"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Impossibile ricavare lo status dal server"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">if</span> <span class="n">status</span><span class="o">!=</span><span class="n">oldstatus</span><span class="p">:</span>
<span class="n">song</span><span class="o">=</span><span class="n">server</span><span class="o">.</span><span class="n">currentsong</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">artist</span><span class="o">=</span><span class="n">song</span><span class="p">[</span><span class="s1">'artist'</span><span class="p">]</span>
<span class="n">title</span><span class="o">=</span><span class="n">song</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span>
<span class="n">toprint</span><span class="o">=</span><span class="s2">"(music) "</span><span class="o">+</span> <span class="n">title</span> <span class="o">+</span> <span class="s2">" - "</span> <span class="o">+</span> <span class="n">artist</span>
<span class="k">if</span> <span class="p">(</span><span class="n">status</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span><span class="o">==</span><span class="s2">"pause"</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">status</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span><span class="o">==</span><span class="s2">"stop"</span><span class="p">):</span>
<span class="n">toprint</span><span class="o">=</span><span class="n">oldmood</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">toprint</span><span class="o">=</span><span class="s2">"(music) "</span><span class="o">+</span><span class="n">song</span><span class="p">[</span><span class="s1">'file'</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Arresto del monitor di status"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Impossibile ricavare il titolo della canzone"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">skype</span><span class="o">.</span><span class="n">CurrentUserProfile</span><span class="o">.</span><span class="n">_SetMoodText</span><span class="p">(</span><span class="n">toprint</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Arresto del monitor di status"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Impossibile settare lo stato di skype"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">doit</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Programma Arrestato"</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
<span class="n">quit</span><span class="p">()</span>
</code></pre></div>Rendiamo la ricerca di VIM più flessibile2012-12-05T00:00:00+01:002012-12-05T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-05:/misc/VIM12.html<p>Il sistema di ricerca del testo di VIM potrebbe risultare molto stringente per alcuni, vediamo come modificarne il comportamento. E in più scopriamo come abilitare la ricerca incrementale.</p><h1>Il sistema di ricerca del testo di VIM potrebbe risultare molto stringente per alcuni, vediamo come modificarne il comportamento. E in più scopriamo come abilitare la ricerca incrementale.</h1>
<p>Il sistema di ricerca del testo di VIM effettua una ricerca all'interno del vostro documento evidenziando i risultati che vi possono interessare, il problema per alcuni è che la ricerca è case-sensitive, cioè distingue le maiuscole dalle minuscole. Senza porsi grossi problemi possiamo modificare questo comportamento.</p>
<p>Apriamo il nostro file di configurazione di VIM:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vim .vimrc</span>
</code></pre></div>
<p>e aggiungiamo la seguente riga:</p>
<blockquote>
<p>set ignorecase</p>
</blockquote>
<p>questa riga farà in modo che VIM ignori la distinzione maiuscole e minuscole, perciò cercando "bob" verranno evidenziati "bob" "BOB" "Bob" "BoB" eccetera.</p>
<p>Un'altra opzione interessante da aggiungere è:</p>
<blockquote>
<p>set smartcase</p>
</blockquote>
<p>che va a sovrapporsi alla precedente quando cerchiamo un testo digitando delle lettere maiuscole, per esempio cercando "bob" il programma evidenzierà "BOB", "bob", "Bob" eccetera... Ma se cercheremo "boB" il programma evidenzierà solo "boB" (con l'ultima lettera maiuscola).</p>
<p>Un'altra funzione che vi consiglio di aggiungere al vostro .vimrc è:</p>
<blockquote>
<p>set incsearch</p>
</blockquote>
<p>che vi permetterà di abilitare la ricerca incrementale nel documento, ciò farà in modo che mentre digitate il programma cerchi in automatico la prima occorrenza corrispondente in modo da ridurre drasticamente il numero di caratteri digitati: Efficienza in puro stile VIM!</p>
<p>Per ora è tutto.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>e4rat - Una piccola ottimizzazione per ext42012-12-03T00:00:00+01:002012-12-03T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-12-03:/misc/e4rat.html<p>Presentazione di e4rat, un piccolo strumento per migliorare la velocità di avvio del vostro sistema.</p><h1>Presentazione di e4rat, un piccolo strumento per migliorare la velocità di avvio del vostro sistema.</h1>
<p>Buongiorno a tutti, oggi vi voglio presentare e4rat (Ext4 - reduce access times), un piccolo strumento che vi permette di migliorare la velocità di avvio della vostra linux-box riallocando i file usati in modo da ridurre il ritardo provocato dalla ricerca degli stessi nel disco fisso.</p>
<p>Il programma ha 3 componenti: e4rat-collect, e4rat-realloc ed e4rat-preload.</p>
<p>Per usarlo basta seguire queste semplici istruzioni:</p>
<p>Per prima cosa configuriamo il kernel con le seguenti opzioni attive:</p>
<div class="codehilite"><pre><span></span><code><span class="err">-> General setup</span>
<span class="err"> [*] Auditing support</span>
<span class="err"> [*] Enable system-call auditing support</pre></span>
</code></pre></div>
<p>dopo aver installato e4rat inserite all'interno della command line di grub:</p>
<div class="codehilite"><pre><span></span><code><span class="err">init=/sbin/e4rat-collect</span>
</code></pre></div>
<p>se all'interno della vostra command line avete il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">ro</span>
</code></pre></div>
<p>potreste doverlo sostituire con</p>
<div class="codehilite"><pre><span></span><code><span class="err">rw</span>
</code></pre></div>
<p>per permettere a e4rat-collect di scrivere il proprio log.</p>
<p>Attendete l'avvio del sistema, accedete al vostro account ed eventualmente aprite il vostro browser web e file manager. In tutto avete 120 secondi per scegliere cosa dovrà essere ottimizzato.</p>
<p>Quando i 120 secondi sono trascorsi possiamo iniziare con il secondo passo. Entriamo nella tty1 con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">CTRL+ALT+F1</span>
</code></pre></div>
<p>accediamo come root e passiamo al runlevel 1 con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">init 1</span>
</code></pre></div>
<p>e ora diamo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">e4rat-realloc /var/lib/e4rat/startup.log</span>
</code></pre></div>
<p>Il programma provvederà a riposizionare i files in maniera più contigua. Vi consiglio di eseguirlo più volte fin quando il programma stesso non vi dirà che non sono possibili ulteriori ottimizzazioni.</p>
<p>Per finire inseriamo stabilmente in grub la linea:</p>
<div class="codehilite"><pre><span></span><code><span class="err">init=/sbin/e4rat-preload</span>
</code></pre></div>
<p>Nonostante il caricamento del kernel risulti un po' più lungo del solito a causa del precaricamento dei files nella page cache, il mio portatile ha guadagnato circa 15 secondi nel tempo grub - desktop passando da 1:13 a 0:59.</p>
<p><strong>Dato che il programma citato in questo articolo serve ad ottimizzare i tempi di accesso al disco fisso, i possessori di dischi SSD ne ricaveranno ben poco vantaggio.</strong></p>
<p><strong>e4rat funziona solamente con dischi formattati col filesystem ext4</strong></p>
<p>Questo è tutto!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Come calibrare la batteria del nostro laptop2012-11-29T00:00:00+01:002012-11-29T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-29:/misc/Calibrazione_Batteria.html<p>Vediamo come migliorare l'autonomia del nostro notebook ricalibrando manualmente la batteria.</p><h1>Vediamo come migliorare l'autonomia del nostro notebook ricalibrando manualmente la batteria.</h1>
<p>Quando avete appena comprato il vostro notebook, la durata della batteria è al massimo e potete lavorare abbastanza tranquillamente per 3 o 4 ore, ma già dopo 6 mesi l'indicatore della batteria del vostro sistema operativo non segnerà più la carica effettiva e dopo qualche tempo ancora avrete un'autonomia di poche decine di minuti.</p>
<p>Questo accade a causa del cosiddetto <a href="https://it.wikipedia.org/wiki/Batteria_ricaricabile#Effetto_memoria">Effetto Memoria</a>, questo accade soprattutto quando si collega l'alimentatore con la batteria ancora parzialmente carica ma, come sappiamo, non è possibile usare un notebook come useremmo un cellulare, se il portatile si spegne rischiamo di perdere i nostri dati.</p>
<p>Vediamo come possiamo ricalibrare la batteria e riportarla ad una condizione di "quasi nuovo":</p>
<ul>
<li>Troviamo un modo per scaricare completamente la batteria<ul>
<li>In Windows Conviene attivare la modalità provvisoria tenendo premuto F8 durante l'avvio in modo da mostrare il menu di scelta.</li>
<li>Sotto Linux conviene disabilitare tutte le gestioni dell'energia</li></li>
</ul>
</li>
<li>Ora lasciamo acceso il portatile staccato dalla presa di corrente fino a quando non si spegnerà da solo per mancanza di energia.</li>
<li>Collegate il portatile alla presa di corrente e lasciatelo caricare, quando la carica sarà completa lasciatelo attaccato un altro paio d'ore. (Alcuni suggeriscono una carica complessiva di 24 ore)</li>
<li>Per un risultato migliore ripetete una seconda volta tutti i passaggi precedenti.</li>
</ul>
<p>Ora, se tutto è andato per il meglio, la batteria dovrebbe tornare a funzionare correttamente. In caso contrario conviene procedere alla sostituzione della stessa.</p>
<p><strong>Le batteria colpite dall'effetto memoria sono le batterie Nichel-Cadmio (Ni-Cd) e, in misura minore quelle al Nichel-MetalIdruro (Ni-MH), le batterie al litio (Li-Ion) sono teoricamente immuni da tale effetto</strong></p>
<p>Nel caso vogliate sapere che batteria monta il vostro portatile potete semplicemente smontarla e leggere l'etichetta, se siete sotto linux potete dare, da Root:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cat /proc/acpi/battery/BAT0/info</span>
</code></pre></div>
<p>E leggere la linea "battery type", nel mio caso:</p>
<div class="codehilite"><pre><span></span><code><span class="err">battery type: Li</span>
</code></pre></div>
<p>Il mio portatile usa una batteria agli ioni di litio, perciò non dovrei avere problemi di effetto memoria.</p>
<p>Buon Proseguimento!</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>TAGAP - Pinguini, Pallottole e Pillole!2012-11-27T00:00:00+01:002012-11-27T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-27:/gratis-sul-web/Tagap.html<p>Oggi vi presento TAGAP, il gioco apocalittico riguardante i pinguini. Un ottimo shooter 2D con un'ottima grafica e un ottimo audio.</p><h1>Oggi vi presento TAGAP, il gioco apocalittico riguardante i pinguini. Un ottimo shooter 2D con un'ottima grafica e un ottimo audio.</h1>
<p>Se avete voglia di sparare un po', allora TAGAP è sicuramente il gioco che fa per voi. TAGAP (The Apocalyptic Game About Penguins) è uno sparatutto bidimensionale con un'ottima grafica e un ottimo sonoro, programmato da PenguinDT. Vi ritroverete nei panni di Pablo, un super pinguino cibernetico che si ribella al dottor Glowenko, suo creatore, per poter salvare il mondo da apocalisse certa, fermando l'armata di pinguini comandata da Pedro, un altro pinguino cibernetico. Avrete a disposizione molti power-up che vi permetteranno di aumentare la vostra salute, rallentare il tempo, aumentare il rateo o la potenza di fuoco delle vostre armi.</p>
<p>Voglio inoltre avvisarvi di TAGAP 2, il seguito naturale del primo episodio dove dovrete combattere sempre nei panni di Pablo per fermare una nuova apocalisse, ma questa volta al vostro fianco ci sarà Pedro; comportando molte novità nel gioco.</p>
<p>Pedro vi darà supporto aereo ogni volta che ne avrete bisogno se state giocando da soli, oppure potrà essere controllato da un secondo giocatore nella super adrenalinica modalità split-screen!</p>
<p>Il tutto condito da nuove mosse (come lo scivolamento), più pillole, nuove armi e nemici più grandi.</p>
<p>Potete trovare entrambi i giochi sul <a href="http://www.tagap.net/">sito ufficiale</a></p>
<p>PenguinDT sta lavorando alacremente al terzo capitolo della saga, con un nuovo motore ad alta definizione, perciò tenete d'occhio il sito ufficiale!</p>
<p>Per gli utenti Linux: secondo il <a href="http://appdb.winehq.org">database di Wine</a> il gioco funziona, in ogni caso consiglio di usare <a href="http://wiki.winehq.org/winetricks">WineTricks</a> per installare eventuali DLL mancanti.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Creiamo i nostri suoni in stile 8bit con SFXR2012-11-23T00:00:00+01:002012-11-23T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-23:/gratis-sul-web/sfxr.html<p>Presentazione di SFXR, un programmino che vi permette di creare effetti sonori ad 8 bit per i vostri videogiochi.</p><h1>Presentazione di SFXR, un programmino che vi permette di creare effetti sonori ad 8 bit per i vostri videogiochi.</h1>
<p>Se state programmando un piccolo videogioco (per esempio per partecipare al famoso <a href="http://www.ludumdare.com/">Ludum Dare</a>) e volete creare degli effetti sonori a 8 bit in pochi secondi allora avrete sicuramente bisogno di un programma come SFXR.</p>
<p>Il programma è stato creato proprio in occasione del decimo Ludum Dare (Dicembre 2007) nel quale si ha pochissimo tempo per creare un videogioco (circa 48 ore) e offre un modo molto veloce per avere effetti sonori di base.</p>
<p>Il programma può creare suoni di salto, powerup, sparo, pickup, esplosioni, colpi e selezioni. Il tutto a 8 bit! Inoltre ogni suono può essere personalizzato a fondo cambiando i valori dei controlli avanzati. Non manca una funzione per generare un suono completamente casuale, alcune volte saltano fuori degli effettini niente male.</p>
<p>Lo trovate seguendo questo <a href="http://www.drpetter.se/project_sfxr.html">Link</a></p>
<p>Per la felicità degli utenti linux il programma funziona bene sotto Wine, ma se volete una versione potete usare il codice sorgente ed usare make per installarlo dato che usa SDL e GTK2. Se avete debian esiste un pacchetto precompilato.</p>
<p>Il programma esporta gli effetti sonori in wav così che possiate comprimerli come meglio vi sembra.</p>
<p>Ne Esiste anche una versione online che si chiama BFXR, se volete usarla potete seguire questo <a href="http://www.bfxr.net/">Link</a>. Anche quest'ultima versione è scaricabile ma avete bisogno di Adobe AIR per utilizzarla (lo trovate <a href="https://get.adobe.com/it/air/">qui</a>).</p>
<p>Purtroppo il supporto per Linux da parte di Adobe AIR è stato interrotto, perciò non vi posso garantire il suo funzionamento sotto tale sistema operativo.</p>
<p>Gli utenti MAC non sono lasciati da soli, esiste infatti un port per MAC ce si chiama CFXR, lo potete trovare seguendo questo <a href="http://thirdcog.eu/apps/cfxr">link</a>.</p>
<p>Come vedete ce n'è per tutti i gusti e per tutti li OS.</p>
<p>Con questo vi lascio e vi auguro buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>OpenHexagon - Oggi il gioco lo voglio esagonale2012-11-22T00:00:00+01:002012-11-22T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-22:/gratis-sul-web/OpenHexagon.html<p>Oggi vi presento un ottimo clone per PC del famoso Super Hexagon: OpenHexagon.</p><h1>Oggi vi presento un ottimo clone per PC del famoso Super Hexagon: OpenHexagon.</h1>
<blockquote>
<p>Sei un triangolo</p>
<p>I poligoni ti vogliono far fuori</p>
<p>Impara l'arte della rotazione</p>
<p>Sei pronto ad una vera sfida?</p>
</blockquote>
<p>Oggi vi presento un clone del famoso <a href="http://superhexagon.com/">Super Hexagon</a> partorito dalla geniale mente di Terry Cavanagh (creatore di <a href="http://thelettervsixtim.es/">VVVVVV</a> che vi consiglio vivamente di provare): OpenHexagon.</p>
<p>Programmato dall'italianissimo Vittorio Romeo, ha anticipato sul tempo l'uscita di Super Hexagon per PC; ma sembra che il buon Terry l'abbia presa bene: <a href="http://www.freeindiegam.es/2012/11/open-hexagon-vittorio-romeo/">link</a></p>
<p>Io lo definirei un "Gioco che provoca una forte dipendenza", ottimi sottofondi musicali, ottima grafica e molto divertente da giocare.</p>
<p>Inoltre è completamente personalizzabile, con pochissima fatica potete aggiungere le vostre canzoni, creare i vostri livelli e le vostre combinazioni di colori!</p>
<p>Per gli utenti Linux/Unix/Mac: Il gioco funziona perfettamente sotto Wine, oltre ad esservi una versione nativa Linux. La versione 2 si discosta ancora di più dal gioco originale, introducendo alcune meccaniche come la rotazione istantanea di 180 gradi.</p>
<p>Vi lascio con il <a href="https://www.youtube.com/watch?v=5CKJ4ulHO28">trailer trailer ufficiale</a>, Saluti da Penaz!</p>Diamo un secondo nome al nostro sito con Dot.Tk2012-11-19T00:00:00+01:002012-11-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-19:/misc/DotTk.html<p>Presentazione del servizio Dot.TK che vi permette di avere a vostra disposizione un dominio con estensione .tk assolutamente gratis.</p><h1>Presentazione del servizio Dot.TK che vi permette di avere a vostra disposizione un dominio con estensione .tk assolutamente gratis.</h1>
<p>Buongiorno, oggi vi voglio presentare Dot.TK, un servizio che vi offre assolutamente gratis un dominio con estensione .tk.</p>
<p>Tutto questo ha però delle limitazioni:</p>
<ul>
<li><strong>Dovete avere già uno spazio internet</strong> di qualunque tipo, anche gratuito.</li>
<li>Tale spazio internet <strong>deve ricevere almeno 25 visite ogni 90 giorni</strong>, pena la disattivazione del dominio .tk</li>
</ul>
<p>Pensandoci bene non sono limitazioni molto stringenti.</p>
<p>Inoltre Dot.TK fornisce anche un proprio servizio di URL-Shortening con cui potrete accorciare URL molto lunghi con indirizzi facili da ricordare.</p>
<p>E come se questo non bastasse, Dot.TK offre anche TKm<strong>a</strong>i<strong>lias</strong> un serivizio che vi permette di creare delle email pseudonime in maniera del tutto gratuita.</p>
<p>Per chi dispone di un pc Windows esiste l'applicazione Tk-IT! che vi permette di rinominare un determinato url in due click.</p>
<p>Potete raggiungere il sito seguendo questo <a href="http://www.dot.tk">Link</a></p>
<p>E con questo è tutto.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz</p>Eliminare una shell extension dal menu contestuale2012-11-19T00:00:00+01:002012-11-19T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-19:/misc/ShellExt.html<p>Vediamo come è possibile eliminare una shell extension dal menu contestuale di windows agendo sul registro di sistema.</p><h1>Vediamo come è possibile eliminare una shell extension dal menu contestuale di windows agendo sul registro di sistema.</h1>
<p>A volte capita, installate un programma ma i gusti cambiano, lo disinstallate e la sua shell extension resta all'interno del menu contestuale. Solitamente questo problema è risolvibile con un semplice riavvio del pc. Se questo non accade allora vediamo come eliminarla manualmente. Basta un click sulla miniatura per vedere l'immagine intera.</p>
<p><strong>Questa procedura richiede la modifica del registro di sistema di Windows 7, il che potrebbe portar a malfunzionamenti del sistema. Settate un punto di ripristino e fate un backup del registro di sistema e dei vostri dati.</strong></p>
<p>Io non mi assumo alcuna responsabilità di danni provocati a cose, animali o persone derivanti dall'uso di questo piccolo tutorial[/warning]</p>
<p>Come potete vedere ho installato <a href="http://notepad-plus-plus.org/">Notepad++</a> nel mio sistema.</p>
<p><img alt="Menu Contestuale" src="https://penazarea.altervista.org/images/2012/11/Regedit1.png" /></p>
<p>Ma il problema si presenta dopo la disinstallazione, infatti se uso la shell extension evidenziata mi appare l'avviso :</p>
<p><img alt="Errore" src="https://penazarea.altervista.org/images/2012/11/Regedit7.png" /></p>
<p>Allora usiamo Start - Esegui (Scorciatoria: WIN + R) e diamo regedit:</p>
<p><img alt="Finestra Esegui" src="https://penazarea.altervista.org/images/2012/11/Regedit5.png" /></p>
<p>Dopo aver risposto affermativamente alla richiesta del Controllo Account Utente spostiamoci in <code>HKEY_CLASS_ROOT/*/shellex/ContextMenuHandlers/</code></p>
<p><img alt="Regedit parte 1" src="https://penazarea.altervista.org/images/2012/11/Regedit4.png" /></p>
<p>Ed eliminiamo la voce che si riferisce alla voce che crea problemi, nel mio caso ANotepad++64:</p>
<p><img alt="Regedit parte 2" src="https://penazarea.altervista.org/images/2012/11/Regedit3.png" /></p>
<p>Le modifiche saranno immediate, chiudiamo regedit e ammiriamo il risultato del nostro lavoro:</p>
<p><img alt="Risultato" src="https://penazarea.altervista.org/images/2012/11/Regedit2.png" /></p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Impariamo VI (Improved) - Alcuni plugin consigliati2012-11-12T00:00:00+01:002012-11-12T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-12:/misc/VIM11.html<p>Un quartetto di plugins che mi sento di consigliarvi per migliorare la vostra esperienza con l'editor VIM.</p><h1>Un quartetto di plugins che mi sento di consigliarvi per migliorare la vostra esperienza con l'editor VIM.</h1>
<p>Oltre alle varie funzionalità di configurazione, come ho già detto VIM contiene un vero e proprio linguaggio di scripting che vi permette di fare veramente di tutto.</p>
<p>Se non avete voglia di programmarvi un plugin da voi, oppure non siete ancora guru di VIM potete scaricare una miriade di plugins già pronti.</p>
<p>Il nostro sito di riferimento sarà il <a href="http://www.vim.org/scripts/index.php">Sito ufficiale di VIM, sezione scripts</a></p>
<p>Il primo plugin che vi voglio proporre è <a href="http://www.vim.org/scripts/script.php?script_id=1697">Surround</a> che vi permette di aggiungere, sostituire e togliere velocemente i tag che circondano una certa parola, utile per tutti i linguaggi di programmazione, soprattutto html. Per un aiuto su come si usa usate il comando:</p>
<blockquote>
<p>:help surround</p>
</blockquote>
<p>Il secondo è invece <a href="http://www.vim.org/scripts/script.php?script_id=1658">NERDTree</a> che vi permette di aprire files, directories ed esplorare il vostro filesystem direttamente da VIM. Per un aiutino usate il comando:</p>
<blockquote>
<p>:help nerdtree</p>
</blockquote>
<p>Il terzo è <a href="http://www.vim.org/scripts/script.php?script_id=273">TagList</a> che vi permette di avere a vostra disposizione una visuale d'insieme del vostro codice. Da provare. Per un aiutino usate:</p>
<blockquote>
<p>:help taglist</p>
</blockquote>
<p>Il quarto ed ultimo, ma non per importanza è <a href="http://www.vim.org/scripts/script.php?script_id=2540">SnipMate</a>, un piccolo script che raccoglie al suo interno una miriade di snippets di codice solitamente usati in C, Python ed altri linguaggi. Molto utile in alternativa o insieme alla soluzione proposta in <a href="https://penazarea.altervista.org/misc/VIM9.html">questo articolo</a> che ho pubblicato qualche tempo fa. Per accedere al file di aiuto basta usare il comando:</p>
<blockquote>
<p>:help snipmate</p>
</blockquote>
<p>In tutte le pagine degli script sono inserite le informazioni di installazione.</p>
<p>Piccole note: non tutti i plugins funzionano in modalità compatibile (una modalità che rende VIM compatibile al 99.9% con il vecchio VI) inoltre alcuni plugins hanno bisogno di qualche aggiunta nel vostro .vimrc. I comandi da aggiungere per essere sicuri che tutti e 4 i plugin funzionino senza problemi sono:</p>
<blockquote>
<p>set nocp</p>
<p>filetype plugin on</p>
<p>filetype indent on</p>
</blockquote>
<p>Questo è quanto, buona scrittura (o programmazione) a tutti!</p>
<p>Penaz</p>Crittografia Asimmetrica (a chiave pubblica) con OpenSSL2012-11-11T00:00:00+01:002012-11-11T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-11:/misc/AsymCripto.html<p>Vediamo come utilizzare OpenSSL per cifrare i nostri files usando un algoritmo di crittografia a chiave asimmetrica.</p><h2>Vediamo come utilizzare OpenSSL per cifrare i nostri files usando un algoritmo di crittografia a chiave asimmetrica.</h2>
<p>In <a href="https://penazarea.altervista.org/misc/VIM10.html">questo articolo</a> abbiamo visto come sia possibile cifrare facilmente i nostri files di testo con VI tramite un algoritmo di cifratura simmetrico. Gli algoritmi simmetrici hanno un punto debole: la trasmissione della chiave; è necessario accordarsi preventivamente sulla password da usare o trovare un modo per trasmetterla in maniera sicura. È per questo motivo che è stata inventata la crittografia asimmetrica.</p>
<p>La crittografia asimmetrica utilizza, al posto di una sola chiave unica condivisa, una coppia di chiavi:</p>
<ul>
<li>Una chiave pubblica, che deve essere condivisa affinché la crittografia abbia buon fine e con cui verranno cifrati i files diretti a voi.</li>
<li>Una chiave privata, che verrà usata da voi per decifrare il file inviatovi.</li>
</ul>
<p>Le due chiavi sono strettamente legate, ma è virtualmente impossibile risalire alla chiave privata partendo dalla chiave pubblica.</p>
<p>Ecco un esempio per chiarire il funzionamento:</p>
<blockquote>
<p>Alice deve inviare a Bob un messaggio cifrato, Bob ha già condiviso in passato la sua chiave pubblica con Alice, perciò ad Alice basterà cifrare il messaggio con la chiave pubblica di Bob.</p>
<p>Quando Bob riceverà il messaggio userà la propria chiave privata per decifrarlo.</p>
</blockquote>
<p>Ora usiamo <a href="https://www.openssl.org/">OpenSSL</a> per la cifratura vera e propria dei nostri FIles. Apriamo il terminale.</p>
<p>Iniziamo creando la nostra chiave privata con il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">openssl genrsa -out miachiave.privata 2048</span>
</code></pre></div>
<p>che produrrà una chiave privata da 2048 bit. Ovviamente non ce ne facciamo nulla se non abbiamo una chiave pubblica da condividere, per cui ora estraiamo la chiave pubblica da quella privata:</p>
<div class="codehilite"><pre><span></span><code><span class="err">openssl rsa -in miachiave.privata -pubout &gt; miachiave.pubblica</span>
</code></pre></div>
<p>Il parametro -pubout fa in modo che openSSL generi la chiave pubblica in uscita. Questa è la chiave che andrà condivisa e con cui verranno cifrati i messaggi che vi verranno inviati.</p>
<p>Per criptare un file basta usare il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">openssl rsautl -encrypt -inkey miachiave.pubblica -pubin -in doc.txt -out doc.txt.cfr</span>
</code></pre></div>
<p>Questa usa la chiave pubblica per cifrare il file doc.txt e mandando in uscita il file doc.txt.cfr. Se provate ad aprire quest'ultimo vedrete che le informazioni in esso contenute sono illeggibili.</p>
<p>Per decriptare il file basta usare il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">openssl rsautl -decrypt -inkey miachiave.privata -in doc.txt.cfr -out doc.txt</span>
</code></pre></div>
<p>che userà la nostra chiave privata per decifrare il messaggio.</p>
<p><strong>Provate a decifrare il messaggio usando la stessa chiave pubblica con cui è stato cifrato</strong></p>
<p>Ora passiamo ai limiti della Crittografia Asimmetrica.</p>
<p>Il primo è sicuramente la protezione della chiave privata, se questa viene condivisa è un guaio. Un piccolo trucco consiste nell'aggiungere l'opzione -des3 durante la creazione della chiave privata. Questo comando la cifrerà con l'algoritmo simmetrico TripleDES, usate una password e sarete mediamente al sicuro.</p>
<div class="codehilite"><pre><span></span><code><span class="err">openssl genrsa -des3 -out miachiave.privata.cifrata 2048</span>
</code></pre></div>
<p>Ogni volta che farete un'operazione che coinvolga la chiave privata, vi verrà chiesta la password.</p>
<p>Il secondo limite è il fatto che la chiave di cifratura deve essere più grande del file cifrato.</p>
<p>Il problema è facilmente risolvibile, cifrate il vostro grosso file con la cifratura simmetrica e poi usate la cifratura asimmetrica per cifrare la password.</p>
<p>E con questo è tutto. Saluti!</p>
<p>Penaz</p>Verifichiamo la nostra tracciabilità su internet2012-11-10T00:00:00+01:002012-11-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-10:/misc/Panopticlick.html<p>Presentazione del servizio Panopticlick, che vi permette di vedere quali informazioni il vostro browser web trasmette ai siti internet.</p><h1>Presentazione del servizio Panopticlick, che vi permette di vedere quali informazioni il vostro browser web trasmette ai siti internet.</h1>
<p>Quanto siete unici nel web? Molto.</p>
<p>Ogni browser trasmette ai siti web una serie di informazioni che contribuiscono a creare una vera e propria "impronta digitale", tra cui:</p>
<ul>
<li>Motore e versione del browser</li>
<li>Dettagli dei plugins</li>
<li>Javascript abilitato/disabilitato</li>
<li>Font di sistema</li>
<li>Fuso orario</li>
</ul>
<p>Ovviamente queste informazioni dicono tutto e niente, tali informazioni permettono solo di identificare il singolo browser tra tanti e le abitudini di navigazione dell'internauta che lo usa, anche se non si sa precisamente chi sia, ma se un'eventuale spia riuscisse ad arrivare ai vostri dati personali e riuscisse a collegarli al browser?</p>
<p>La possibilità è estremamente remota, praticamente nulla per un internauta mediamente attento; ma non si sa mai.</p>
<p>Volete sapere quanto è unico il vostro browser? Potete usare il servizio <a href="https://panopticlick.eff.org/">Panopticlick</a> di <a href="http://www.eff.org">EFF</a> che vi dirà in pochi secondi quanto unico è il vostro browser.</p>
<p>Un modo utile per ridurre l'unicità del nostro browser è usare <a href="https://www.torproject.org/">TOR</a>, che rallenta un po' la connessione. Ma per la privacy si fa anche questo.</p>
<p><strong>Usare TOR con i programmi di file sharing è totalmente inutile in quanto questi programmi inviano con i pacchetti anche l'ip del richiedente.</strong></p>
<p><strong>Niente azioni illegali!</strong></p>
<p>Buona navigazione!</p>
<p>Penaz</p>HTTPs in tutti i siti, per Firefox, Chrome e Opera2012-11-09T00:00:00+01:002012-11-09T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-09:/misc/HttpsEverywhere.html<p>Presentazione di un'estensione per Firefox e Chrome che forza i siti che visitate ad usare il protocollo HTTPs, se supportato.</p><h1>Presentazione di un'estensione per Firefox e Chrome che forza i siti che visitate ad usare il protocollo HTTPs, se supportato.</h1>
<p>Se siete maniaci della sicurezza, allora siete nel posto giusto, un modo per evitare che dei terzi spiino le vostre abitudini online è sicuramente quello di criptare la comunicazione col sito tramite il protocollo HTTP over SSL, conosciuto anche come <a href="https://it.wikipedia.org/wiki/HTTPS">HTTPS</a></p>
<p>Il fatto è che non tutti i siti usano questo protocollo, anche se supportato; un aiuto arriva dalla <a href="http://www.eff.org">Electronic Frontier Foundation (EFF)</a> con un estensione che ci permetterà di forzare i siti ad usare il protocollo Https, ove supportato.</p>
<p>L'estensione si chiama Https Everywhere ed è disponibile per Firefox in versione stabile e per Google Chrome in versione beta.</p>
<p>La potete trovare <a href="https://www.eff.org/https-everywhere">qui</a></p>
<p>Buona navigazione sicura!</p>
<p>Penaz</p>Impariamo VI (Improved) - Criptare i files2012-11-08T00:00:00+01:002012-11-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-11-08:/misc/VIM10.html<p>Con VIM è facilissimo rendere illeggibili le informazioni contenute nei nostri documenti di testo. Vediamo Come.</p><h1>Con VIM è facilissimo rendere illeggibili le informazioni contenute nei nostri documenti di testo. Vediamo Come.</h1>
<p>Ogni tanto potrebbe essere utile scambiare velocemente informazioni criptate, con VI è molto semplice.</p>
<p>VI usa un sistema di <a href="https://it.wikipedia.org/wiki/Crittografia_simmetrica">crittografia simmetrica</a>, quindi è necessario che troviate un modo sicuro di trasmettere la password al vostro interlocutore.</p>
<p>Iniziamo avviando VIM:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi prova</span>
</code></pre></div>
<p>Ora scriviamo il nostro testo:</p>
<blockquote>
<p>[a]</p>
<p>Questo è un testo segretissimo!!!</p>
<p>[ESC]</p>
</blockquote>
<p>Ora diamo il comando per criptare il nostro file:</p>
<blockquote>
<p>:X</p>
</blockquote>
<p>Vim ci risponderà prontamente:</p>
<blockquote>
<p>enter encryption key:</p>
</blockquote>
<p>Provvediamo ad inserire la nostra password:</p>
<blockquote>
<p>enter encryption key: <strong>*</strong></p>
<p>[ENTER]</p>
</blockquote>
<p>Vim ci chiederà di inserire nuovamente la password</p>
<blockquote>
<p>enter same key again: <strong>*</strong></p>
<p>[ENTER]</p>
</blockquote>
<p>Ora il nostro file è stato criptato, basta salvarlo ed il gioco è fatto:</p>
<blockquote>
<p>:x</p>
</blockquote>
<p><strong>Il comando di crittografia è molto simile a quello di salvataggio, ricordate che se volete criptare un file dovete inserire la X maiuscola, mentre se volete salvare usate la minuscola</strong></p>
<p>Se qualcuno tentasse di aprire il file con un qualsiasi editor diverso da VIM:</p>
<div class="codehilite"><pre><span></span><code><span class="err">nano prova</span>
</code></pre></div>
<p>Si ritroverebbe:</p>
<blockquote>
<p>VimCrypt~01!ÃO^Ü]â ä^Ú¡ð|Ï õ~¤ÁJ.^ÉÚypêÃ^Ï>|1`^Vá#^Á</p>
</blockquote>
<p>Mentre un utente di VIM si ritroverebbe davanti una richiesta come questa:</p>
<blockquote>
<p>need encryption key for "prova"</p>
<p>Enter Encryption Key:</p>
</blockquote>
<p>Basta inserire la nostra password e riavremo il testo in chiaro.</p>
<p><strong>La gestione delle password di VIM è molto peculiare, se sbagliate la chiave non avrete alcun messaggio di "password errata" ma verrà visualizzato il testo decriptato con quella chiave, ovviamente incomprensibile.</strong></p>
<p>Questo è tutto.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Impariamo VI (Improved) - Le Abbreviazioni2012-10-27T00:00:00+02:002012-10-27T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-27:/misc/VIM9.html<p>Impariamo come usare la funzione di abbreviazione di VIM per inserire piccoli snippet di codice, indirizzi completi e molto altro.</p><h1>Impariamo come usare la funzione di abbreviazione di VIM per inserire piccoli snippet di codice, indirizzi completi e molto altro.</h1>
<p>Se siete dei programmatori sicuramente vi servirete di uno snippet manager di qualche tipo. Gli <a href="http://it.wikipedia.org/wiki/Snippet">Snippets</a> sono delle porzioni di codice che solitamente vengono rilasciati a fini didattici, noi possiamo gestirli direttamente con VIM senza alcun problema tramite le funzioni di abbreviazione. Vediamo come.</p>
<p>Come esempio ho voluto prendere una porzione di codice usata in pygame, precisamente l'event loop e l'aggiornamento dello schermo dove tutti gli eventi vengono catturati, click del mouse, pressioni sulla tastiera, ecc...</p>
<p>Il codice d'esempio sarà:</p>
<div class="codehilite"><pre><span></span><code><span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
</code></pre></div>
<p>Ora creiamo nella nostra home il file abbreviations.vim nel quale andremo ad inserire questo testo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">:iabbrev eventloop for event in pygame.event.get():<CR><TAB>if event.type==QUIT:<CR><TAB>exit()<CR><BS><BS>pygame.display.update()</span>
</code></pre></div>
<p>Ad una prima occhiata il codice sembra molto complesso ma segue sempre la stessa struttura:</p>
<div class="codehilite"><pre><span></span><code><span class="err">:iabbrev <parola chiave> <sequenza completa></span>
</code></pre></div>
<p>In questo caso la parola chiave è eventloop a cui verrà sostituito tutto il codice d'esempio. Ora non ci resta che capire i significato dei tag compresi tra parentesi angolari, ecco una piccola tabella che sarà sicuramente d'aiuto:</p>
<table>
<thead>
<tr>
<th align="left">Tag</th>
<th align="left">Azione</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><CR></td>
<td align="left">Simula la pressione del tasto invio</td>
</tr>
<tr>
<td align="left"><TAB></td>
<td align="left">Simula la pressione del tasto tab</td>
</tr>
<tr>
<td align="left"><BS></td>
<td align="left">Simula la pressione del tasto backspace</td>
</tr>
</tbody>
</table>
<p>Questi sono solo una minima parte, potete vederli tutti digitando il comando</p>
<blockquote>
<p>:help key-codes</p>
</blockquote>
<p>all'interno dell'editor.</p>
<p>Salviamo il file delle abbreviazioni.</p>
<p>Ora apriamo il nostro file di configurazione .vimrc con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vim .vimrc</span>
</code></pre></div>
<p>E aggiungiamo alla fine del file la riga:</p>
<blockquote>
<p>source abbreviations.vim</p>
</blockquote>
<p>Un'alternativa altrettanto valida sarebbe stata quella di scrivere il comando direttamente nel file .vimrc, ma usando questo metodo si può categorizzare meglio la nostra configurazione, senza perdite di funzionalità.</p>
<p>Salviamo anche .vimrc e riapriamo VIM, entriamo in modalità inserimento con</p>
<blockquote>
<p>[i]</p>
</blockquote>
<p>e digitiamo</p>
<blockquote>
<p>eventloop</p>
</blockquote>
<p>quando premeremo spazio o invio vedremo la scritta "eventloop" sostituita dal codice:</p>
<div class="codehilite"><pre><span></span><code><span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span>
<span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span>
<span class="n">exit</span><span class="p">()</span>
<span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">update</span><span class="p">()</span>
</code></pre></div>
<p>Esattamente quello che volevamo.</p>
<p>Se vogliamo aggiungere nuove abbreviazioni basta inserirle nel file abbreviations.vim con lo stesso stile, una per riga, ecco per esempio le prime due righe del mio abbreviations.vim:</p>
<div class="codehilite"><pre><span></span><code><span class="p">:</span><span class="n">iabbr</span> <span class="n">pygameframework</span> <span class="kn">import</span> <span class="nn">pygame</span><span class="o"><</span><span class="n">CR</span><span class="o">></span><span class="kn">from</span> <span class="nn">pygame</span> <span class="kn">import</span> <span class="o">*<</span><span class="n">CR</span><span class="o">></span><span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="nb">exit</span><span class="o"><</span><span class="n">CR</span><span class="o">></span><span class="n">pygame</span><span class="o">.</span><span class="n">init</span><span class="p">()</span><span class="o"><</span><span class="n">CR</span><span class="o">></span><span class="n">screen</span><span class="o">=</span><span class="n">pygame</span><span class="o">.</span><span class="n">display</span><span class="o">.</span><span class="n">set_mode</span><span class="p">((</span><span class="n">x</span><span class="p">,</span><span class="n">x</span><span class="p">),</span><span class="mi">0</span><span class="p">,</span><span class="mi">32</span><span class="p">)</span><span class="o"><</span><span class="n">CR</span><span class="o">></span><span class="k">while</span> <span class="bp">True</span><span class="p">:</span><span class="o"><</span><span class="n">CR</span><span class="o">><</span><span class="n">T</span> <span class="n">AB</span><span class="o">></span><span class="c1">#Inserire qui il codice<CR>pygame.display.update()</span>
<span class="p">:</span><span class="n">iabbr</span> <span class="n">pygameeventloop</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">pygame</span><span class="o">.</span><span class="n">event</span><span class="o">.</span><span class="n">get</span><span class="p">():</span><span class="o"><</span><span class="n">CR</span><span class="o">><</span><span class="n">TAB</span><span class="o">></span><span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">type</span><span class="o">==</span><span class="n">QUIT</span><span class="p">:</span><span class="o"><</span><span class="n">CR</span><span class="o">><</span><span class="n">TAB</span><span class="o">></span><span class="nb">exit</span><span class="p">()</span><span class="o"><</span><span class="n">CR</span><span class="o">><</span><span class="n">BS</span><span class="o">></span>
</code></pre></div>
<p>Se usate saggiamente le abbreviazioni possono risparmiarvi molte righe di codice e una marea di tempo.</p>
<p>Al contrario di molti altri editor, VIM effettua la sostituzione solo dopo aver ricevuto uno spazio o invio, quindi se avete un'abbreviazione del tipo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">:iabbrev addr Via Garibaldi,8 20100 Milano (MI)</span>
</code></pre></div>
<p>VI non effettuerà sostituzioni sulle parole address, addressing, addressed ecc... Ma solo su addr seguito da uno spazio o da invio.</p>
<p>Se volete avere a disposizione un vero gestore di snippet, potete installare uno dei tantissimi plugin dedicati, basta cercare!</p>
<p>Buone Abbreviazioni a Tutti!</p>
<p>Penaz</p>Gestire i video dei PVR su Linux e Windows2012-10-26T00:00:00+02:002012-10-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-26:/misc/PVR_Video.html<p>Vediamo come convertire i video registrati dai nostri PVR in modo da renderli visualizzabili dal nostro PC.</p><h1>Vediamo come convertire i video registrati dai nostri PVR in modo da renderli visualizzabili dal nostro PC.</h1>
<p>Se anche voi, come me, avete un PVR (personal video recorder) che registra su chiavetta USB, molto probabilmente vorrete elaborare i filmati per togliere la pubblicità o ricomprimerli.</p>
<p>Il problema si presenta quando i PVR spezzano i video per rispettare le specifiche FAT32 (massimo 4GB per ogni file) infatti molte volte può succedere che solo il primo spezzone sia riproducibile mentre gli altri spezzoni sono solo degli ammassi di bit.</p>
<p>Oltre alla semplice linea di comando vi servirà un editor video, eccone alcuni gratuiti:</p>
<ul>
<li>OpenShot</li>
<li>PiTiVi</li>
<li>VLMC</li>
<li>Cinelerra-CV</li>
<li>Movie Maker</li>
</ul>
<p>Vediamo come fare con Windows:</p>
<p>Apriamo il menu start, selezioniamo esegui e diamo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cmd</span>
</code></pre></div>
<p>In modo da aprire il prompt dei comandi, prendiamo nota dei nomi dei file da concatenare, poi entriamo nella directory dove si trovano i files con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cd Nome_Directory</span>
</code></pre></div>
<p>E diamo la concatenazione con il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">copy /b file1.mpd + file2.mpg + file3.mpg filecompleto.mpg</span>
</code></pre></div>
<p><strong>Il flag /b sta per "binary" e permette di concatenare file binari</strong></p>
<p>E ora chiudiamo il prompt dei comandi con un semplice</p>
<div class="codehilite"><pre><span></span><code><span class="err">exit</span>
</code></pre></div>
<p>Ora possiamo usare il nostro video editor preferito per editare filecompleto.mpg.</p>
<p>Ora vediamo come fare con Linux:</p>
<p>Apriamo la shell e usiamo il comando cat (che sta per con<strong>cat</strong>enate) e con un po' di ridirezione il gioco è fatto:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cat file1mpg file2.mpg file3.mpg >> filecompleto.mpg</span>
</code></pre></div>
<p><strong>È importante usare la doppia parentesi angolare, infatti rischiamo di dare a bash un comando diverso da quello che vogliamo.</strong></p>
<p>> è una ridirezione semplice, prende l'input a sinistra del segno > e lo scrive nell'output a destra invece che nell'output standard, con questo comando ci potremmo ritrovare con il file di uscita uguale all'ultimo file in ingresso.</p>
<p>>> è un'altro tipo di ridirezione, comunemente conosciuto come "append", prende ogni file di sinistra e lo aggiunge alla fine dell'output di destra.</p>
<p>Ora possiamo prendere il nostro filecompleto.mpg e modificarlo con in nostro software di video editing preferito.</p>
<p>Un'alternativa alla linea di comando per Windows e Linux è sicuramente AviDemux che supporta la concatenazione automatica dei video, basta solo rispondere affermativamente alla domanda di concatenare i files.</p>
<p>Potete scaricare AviDemux da qui: <a href="http://fixounet.free.fr/avidemux/">link</a></p>
<p>L'interfaccia è decisamente semplice e oltretutto potete convertire direttamente il video nel vostro formato preferito.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Gestione dei log con logrotate2012-10-24T00:00:00+02:002012-10-24T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-24:/misc/logrotate.html<p>Vediamo come fare qualche modifica di base alla configurazione di LogRotate, un piccolo programma che ci permette di comprimere ed eliminare i log più vecchi.</p><h1>Vediamo come fare qualche modifica di base alla configurazione di LogRotate, un piccolo programma che ci permette di comprimere ed eliminare i log più vecchi.</h1>
<p>Buongiorno, qualche giorno fa, dando un'occhiatina alla mio /var/log/portage ho preso un po' di paura, devo dire che 3.4GB di logs in poco più di 5 mesi di vita della mia gentoo-box sono tantini, allora ho deciso di modificare la configurazione di logrotate, in modo da far "ruotare" anche questi log.</p>
<p>Vediamo le modifiche che ho fatto al mio /etc/logrotate.conf:</p>
<div class="codehilite"><pre><span></span><code><span class="err">/var/log/portage/*.log {</span>
<span class="err"> monthly</span>
<span class="err"> rotate 3</span>
<span class="err"> nocreate</span>
<span class="err"> compress</span>
<span class="err"> ifempty</span>
<span class="err"> olddir /var/log/portage/old</span>
<span class="err"> su root</span>
<span class="err"> noshred</span>
<span class="err">}</span>
</code></pre></div>
<p>La prima riga:</p>
<blockquote>
<p>/var/log/portage/*.log {</p>
</blockquote>
<p>indica a logrotate di prendere in considerazione tutti i log nella cartella /var/log/portage.</p>
<p>La seconda riga:</p>
<blockquote>
<p>monthly</p>
</blockquote>
<p>Indica al programma di "ruotare" i log ogni mese, in modo da avere la cartella sempre ben pulita.</p>
<p>La terza riga:</p>
<blockquote>
<p>rotate 3</p>
</blockquote>
<p>Indica di conservare le ultime 3 rotazioni, i log più vecchi di 3 mesi saranno perciò eliminati.</p>
<p>La quarta riga:</p>
<blockquote>
<p>nocreate</p>
</blockquote>
<p>evita la creazione di un nuovo log vuoto al posto di quello appena ruotato.</p>
<p>La quinta e sesta riga:</p>
<blockquote>
<p>compress
ifempty</p>
</blockquote>
<p>sono abbastanza auto-esplicative, indicano a logrotate di comprimere i log considerati e di ruotare anche i log vuoti.</p>
<p>Le ultime tre righe:</p>
<blockquote>
<p>olddir /var/log/portage/old
su root
noshred</p>
</blockquote>
<p>Indicano che i vecchi log devono essere spostati in /var/log/portage/old, l'operazione deve essere effettuata come root ed eliminare normalmente i files, senza sovrascriverli con shred; cosa che ritengo inutile dato che l'unico che usa il portatile sono io.</p>
<p>Ora un bel:</p>
<blockquote>
<p>logrotate -d /etc/logrotate.conf</p>
</blockquote>
<p>per controllare e un:</p>
<blockquote>
<p>logrotate -f /etc/logrotate.conf</p>
</blockquote>
<p>per forzare la prima rotazione. Godetevi la vostra cartella bella pulita! Io personalmente sono sceso da 3.4GB a 236MB.</p>
<p>Attenzione: Se impostate</p>
<blockquote>
<p>rotate 0</p>
</blockquote>
<p>i log verranno eliminati senza essere compressi</p>
<p>Buona rotazione!</p>
<p>Penaz</p>Parallelizzare la decompressione dei distfiles in Gentoo2012-10-23T00:00:00+02:002012-10-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-23:/misc/lbunzip_gentoo.html<p>Una piccola modifica al make.conf della vostra gentoo e possiamo usare un decompressore parallelo, per quello sprint in più che non guasta mai.</p><h1>Una piccola modifica al make.conf della vostra gentoo e possiamo usare un decompressore parallelo, per quello sprint in più che non guasta mai.</h1>
<p>Buongiorno, oggi voglio proporre una piccola modifica che vi permetterà di accelerare i vostri emerge di qualche secondo. Vediamo come:</p>
<p>Iniziamo installando un'utility di decompressione parallela, io uso lbzip2:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge lbzip2</span>
</code></pre></div>
<p>Ora l'unica cosa che dobbiamo fare è una piccola modifica al nostro make.conf e inserire:</p>
<blockquote>
<p>PORTAGE_BUNZIP2_COMMAND="lbunzip2 -n#"</p>
</blockquote>
<p>Dove al posto di # inseriremo il numero di core a nostra disposizione (compresi anche quelli generati dalla tecnologia HyperThreading).</p>
<p>Salviamo ed abbiamo finito! D'ora in poi i nostri pacchetti dovrebbero venir decompressi con lbzip2.</p>
<p>Ecco la differenza sul mio pc nella decompressione del sorgente di Thunderbird (circa 100MB):</p>
<div class="codehilite"><pre><span></span><code><span class="err">time bunzip2 thund.tar.bz2</span>
</code></pre></div>
<p>E questo è il risultato</p>
<blockquote>
<p>bunzip2 thund.tar.bz2 21.14s user 0.41s system 99% cpu 21.603 total</p>
</blockquote>
<p>Ed ora con lbunzip2:</p>
<div class="codehilite"><pre><span></span><code><span class="err">time lbunzip2 thund.tar.bz2</span>
</code></pre></div>
<p>Ottenendo:</p>
<blockquote>
<p>lbunzip2 thund.tar.bz2 26.59s user 1.07s system 387% cpu 7.134 total</p>
</blockquote>
<p>Siamo passati da 21.6 secondi a 7.13 secondi, circa un terzo del tempo.</p>
<p>Spero che vi piaccia e saluti!</p>
<p>Penaz</p>Recupero Dati - software e consigli per provarci2012-10-21T00:00:00+02:002012-10-21T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-21:/misc/DataRecovery.html<p>Presentazione di alcuni software che possono aiutarci a recuperare più dati possibile da un supporto danneggiato, sia esso CD, DVD, BD, Hard Disk, Chiavetta USB o Scheda di memoria.</p><h1>Presentazione di alcuni software che possono aiutarci a recuperare più dati possibile da un supporto danneggiato, sia esso CD, DVD, BD, Hard Disk, Chiavetta USB o Scheda di memoria.</h1>
<p>A tutti capita prima o poi, quel CD dalla affidabilità tanto decantata risulta corrotto, se siete stati previdenti e avete fatto un backup oppure avete usato programmi come DVDisaster (recensito <a href="https://penazarea.altervista.org/misc/DvDisaster.html">qui</a>) o dei dati PAR2 andrà tutto bene, ma se invece non avete "fatto i compiti" vi potrebbe venire un forte mal di testa.</p>
<p>Per vedere come stanno i nostri supporti ottici possiamo usare il programma commerciale (ma gratuito per uso personale) CDCheck, che tenterà di leggere i vostri dati, riportando eventualmente degli errori di lettura. Lo potete trovare qui: <a href="http://www.kvipu.com/CDCheck/">link</a></p>
<p>Se i vostri supporti sono danneggiati e volete tentare il recupero continuate a leggere, troverete sicuramente qualche programma interessante che fa al caso vostro.</p>
<p>Oltre alle funzioni di recupero integrate in CDCheck potete provare a recuperare qualcosa tramite UnstoppableCopier. Il nome la dice lunga, il programma copia i file dal supporto ottico ignorando di fatto gli errori (CRC e vari) che si vengono a creare durante la lettura provando e riprovando la lettura dei settori in modo da recuperare più dati possibile. Potete trovare UnstopableCopier <a href="http://www.roadkil.net/program.php/P29/Unstoppable%20Copier">qui</a></p>
<p>Potete tentare il recupero anche con CD/DVD recovery toolbox, che vi guiderà tramite un semplice wizard attraverso il recupero dei vostri dati, il programma è completamente gratuito e potete trovarlo <a href="http://www.oemailrecovery.com/cd_recovery.html">qui</a></p>
<p>Un'altra buona alternativa, gratuita ma dalle possibilità limitate (dato che il programma è commerciale) è IsoBuster che potete trovare <a href="http://www.isobuster.com/it/">qui</a></p>
<p>Per ora basta supporti ottici, vediamo cosa possiamo usare per recuperare alcuni dati dai nostri hard disk, chiavette usb e schede di memoria danneggiate.</p>
<p>Molto semplice e dritto al punto è sicuramente il programma gratuito Recuva, che vi permette di recuperare facilmente dati da supporti formattati o con settori danneggiati, l'unica pecca del programma è la scansione veloce: molto veloce ma quasi inutile dato che trova pochissimi dati, consiglio di passare direttamente alla scansione approfondita. Lo potete trovare <a href="http://www.piriform.com/recuva">qui</a></p>
<p>Anche la Penetration Testing Distribution BackTrack (ora conosciuta come Kali Linux)dispone di alcuni strumenti abbastanza efficaci per recuperare dati, sicuramente da provare. La potete trovare <a href="https://www.kali.org/">qui</a></p>
<p>E se proprio volete darvi all'Extreme Recovery allora non posso fare altro che consigliarvi i due fratellini TestDisk e PhotoRec.</p>
<p>TestDisk è nato come programma utilizzabile per recuperare intere partizioni danneggiate da sovrascritture della FAT e per rendere nuovamente avviabili partizioni che non lo sono e recuperare dati da partizioni FAT16/32, NTFS, ext2/3/4. Il programma funziona sotto Windows, Linux, BSD, MAC, DOS, SunOS.</p>
<p>PhotoRec, come dice il nome, è stato creato inizialmente per il recupero di fotografie dalle fotocamere digitali, ma successivamente si è evoluto in un completo e potentissimo strumento di recupero dati, l'interfaccia è estremamente simile a quella di TestDisk e funziona indipendentemente dal filesystem.</p>
<p>Due programmi sicuramente da provare, vanno dritti al punto senza troppi fronzoli e all'inizio potrebbero un po' intimorire ma sono molto efficaci.</p>
<p>Potete scaricare TestDisk da questo <a href="http://www.cgsecurity.org/wiki/TestDisk_IT">link</a></p>
<p>E PhotoRec da ques'altro <a href="http://www.cgsecurity.org/wiki/PhotoRec_IT">link</a></p>
<h1>Alcuni consigli finali per il recupero dei vostri dati.</h1>
<p>Se dovete recuperare dei dati da supporti ottici non serve farsi troppi scrupoli, i supporti ottici sono in sola lettura perciò potete usare tranquillamente tutti i programmi di recupero che volete.</p>
<p>Se i programmi di recupero falliscono ed il disco è solamente graffiato potete provare a pulirlo e ad effettuare un'inceratura o un polishing come spiegato in <a href="http://www.wikihow.com/Fix-a-Scratched-CD">questa pagina di WikiHow</a>. Usate il polishing e l'inceratura solo come ultime risorse dato che potreste danneggiare ancora di più il supporto.</p>
<p>In commercio esistono anche alcune macchine per il polishing di supporti ottici, che permettono, rimuovendo µm di plastica, di ridurre l'entità del graffio e magari anche aiutare i programmi di recupero nella loro attività.</p>
<p>Invece se avete a che fare con Hard Disk, Chiavette USB e Schede di Memoria, vi dovete fare scrupoli eccome. Prima di tutto devo farvi una piccola infarinatura sulla cancellazione dei files.</p>
<p>Durante la cancellazione non vengono cancellati tutti i bit dell'informazione (sarebbe troppo costoso in termini di tempo e di usura dei componenti) ma viene solo cancellata la voce indice nella "Tabella di allocazione file", una specie di tabella che segna quali settori sono liberi per la scrittura e quali no (ovviamente sto semplificando il discorso all'estremo). Cancellando l'informazione nella tabella si contrassegna lo spazio precedentemente occupato dai files come libero e pronto per essere sovrascritto. Questo, di fatto, risulta nella presenza del file anche se questo risulta cancellato, fino a quando il settore non verrà sovrascritto.</p>
<p>Questo ci porta ad una semplice conclusione per quanto riguarda questi supporti: <strong>dobbiamo</strong> evitare le sovrascritture.</p>
<p>Questo è possibile in diversi modi:</p>
<ol>
<li>
<p>Se è possibile impostate il supporto in sola lettura in maniera fisica, solitamente nelle schede di memoria trovate un piccolo cursore che vi permette di farlo, Una funzionalità simile esiste anche nelle chiavette USB.
Non fatelo dalle risorse del computer, questo comporterebbe un cambiamento degli attributi dei file e forse anche qualche sovrascrittura dovuta a file temporanei, in questi casi non si è mai troppo prudenti...</p>
</li>
<li>
<p>Salvate i dati recuperati in un disco diverso da quello contenente i dati da recuperare. Se non lo fate i nuovi file potrebbero sovrascrivere quelli danneggiati, provocandone la morte definitiva.</p>
</li>
<li>
<p>Se i dati da recuperare sono sul disco principale, spostate l'hard disk in un altro pc oppure usate una distribuzione Live di Linux.</p>
</li>
<li>
<p>Non installate programmi di recupero dopo aver perso i file, la nuova installazione potrebbe cancellare definitivamente i dati da recuperare.</p>
</li>
<li>
<p>Solitamente non si fa, ma se i dati da recuperare sono sul disco principale spegnete il computer tenendo premuto il tasto di accensione per 4 secondi, altrimenti lo spegnimento del computer ed il salvataggio delle impostazioni potrebbero sovrascrivere i file persi.</p>
</li>
</ol>
<p>Spero di essere stato utile.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>DvDisaster - prendersi cura del futuro dei nostri DvD2012-10-20T00:00:00+02:002012-10-20T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-20:/misc/DvDisaster.html<p>Presentazione di DVDisaster, un piccolo programma che, se siamo stati previdenti, ci aiuterà in caso uno dei nostri supporti ottici si danneggiasse.</p><h1>Presentazione di DVDisaster, un piccolo programma che, se siamo stati previdenti, ci aiuterà in caso uno dei nostri supporti ottici si danneggiasse.</h1>
<p>Buongiorno, oggi voglio presentarvi DVDisaster, un piccolo programmino open-source che vi aiuterà a recuperare i dati che pensavate di aver perso dai vostri supporti ottici, siano essi CD, DVD o BD. L'unica condizione è che siate stati previdenti: infatti DVDisaster funziona tramite dei codici di correzione che devono essere creati quando il supporto è sano. Occupano pochi MB, ma possono risparmiarvi molti mal di testa si parla di circa il 15% della dimensione del supporto considerato (700MB circa per un DVD da 4.7GB).</p>
<p>Quando avete creato il vostro supporto vi basterà scansionarlo con DVDisaster e creare un file di recupero, quando inizieranno a fare capolino i primi errori di lettura vi basterà inserire il supporto danneggiato nel vostro drive, darlo in pasto a DVDisaster e, dopo un scansione abbastanza rapida, fornitegli il file di recupero giusto per il vostro supporto ed in pochi minuti avrete un'immagine del vostro CD, DVD o BD che sia, nuova di zecca; pronta da masterizzare.</p>
<p>Se invece non siete stati previdenti, mi dispiace ma DVDisaster non può aiutarvi, ma resta comunque un ottimo strumento per effettuare dei test PI/PO e "C2 Error" per farsi un'idea dello stato di salute del supporto ottico.</p>
<p>Potete trovare DVDisaster a questo <a href="http://dvdisaster.net/en/">Link</a></p>
<p><strong>DVDisaster non garantisce il pieno recupero dei dati in caso ci fossero moltissimi errori di lettura, ma ovviamente nessun programma lo fa. È solo un modo di rendere più affidabili i vostri supporti.</strong></p>
<p>Domani alcuni strumenti per recuperare più dati possibile da un supporto ormai a fine vita.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Token USB su Windows e Linux2012-10-19T00:00:00+02:002012-10-19T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-19:/misc/TokenUSB.html<p>Vediamo come possiamo usare la nostra chiavetta come Token USB per rendere più semplice, veloce o sicuro il login del nostro Windows o Linux.</p><h1>Vediamo come possiamo usare la nostra chiavetta come Token USB per rendere più semplice, veloce o sicuro il login del nostro Windows o Linux.</h1>
<p>Oggi vedremo come è possibile usare la nostra chiavetto come Token USB per accedere al nostro PC senza password o per impedire ad altri di accederci nonostante conoscano la password.</p>
<p>In Windows possiamo usare DoublePassword. Il programma è abbastanza autoesplicativo e l'interfaccia grafica rende il tutto alquanto semplice.</p>
<p>DoublePassword è discontinuato dal 2010 e non è molto facile da trovare ed è stato provato solo fino a Windows XP, ma potete trovarlo su <a href="http://download.cnet.com/">Cnet</a>.</p>
<p>In Linux abbiamo "Pluggable Authentication Modules" per la gestione delle login quindi è sufficiente installare il modulo PAM_USB e configurarlo.</p>
<p>Spero di essere stato utile.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Impariamo VI (Improved) - Promemoria2012-10-16T00:00:00+02:002012-10-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-16:/misc/VIM8.html<p>Un piccolo riassunto di cosa abbiamo imparato finora in VI, e una piccola sorpresa finale.</p><h1>Un piccolo riassunto di cosa abbiamo imparato finora in VI, e una piccola sorpresa finale.</h1>
<p>Buongiorno, prima di continuare con funzioni ancora più avanzate di VI vediamo cosa abbiamo visto finora:</p>
<h4>Comandi di Movimento:</h4>
<ul>
<li><strong>Freccia Su / k</strong> - Muoversi in su</li>
<li><strong>Freccia Giu / j</strong> - Muoviti in giu</li>
<li><strong>Freccia Sinistra / h</strong> - Muoviti a sinistra</li>
<li><strong>Freccia Destra / l</strong> - Muoviti a destra</li>
</ul>
<p>L'uso dei pulsanti h j k l per il movimento non è casuale; se avete fatto un po' di dattilografia noterete che questi sono i pulsanti su cui avrete le dita appoggiate per il 99.9% del tempo (infatti la "j" ha una tacchetta in rilievo per poter essere trovata alla cieca). Questo permette una forte riduzione dei movimenti delle mani, aumentando l'efficienza.</p>
<ul>
<li><strong>#gg / #G</strong> - Vai alla riga numero #</li>
<li><strong>w</strong> - Muoviti alla prossima parola</li>
<li><strong>W</strong> - Muoviti alla prossima macro-parola</li>
</ul>
<h4>Comandi di ricerca:</h4>
<ul>
<li><strong>/testo</strong> - Trova "testo" all'interno del documento</li>
<li><strong>n</strong> - Trova la prossima occorrenza della parola cercata</li>
</ul>
<h4>Comandi di cambio modalità:</h4>
<ul>
<li><strong>i</strong> - Inizia inserimento dalla posizione del cursore</li>
<li><strong>a</strong> - Inizia l'inserimento dalla posizione successiva a quella del cursore</li>
<li><strong>v</strong> - Passa alla modalità visuale</li>
<li><strong>ESC</strong> - Torna alla modalità normale</li>
</ul>
<h4>Comandi speciali:</h4>
<ul>
<li><strong>:!ls</strong> - Esegui un comando shell (in questo caso ls)</li>
<li><strong>q#</strong> - inizia la registrazione di una macro nel registro #</li>
<li><strong>:r!ls</strong> - Esegui un comando shell (in questo caso ls) e inserisci l'output nel documento</li>
<li><strong>:q!</strong> - Esci senza salvare</li>
<li><strong>:w</strong> - Salva</li>
<li><strong>:x</strong> - Esci e salva</li>
</ul>
<p>Questi ed altri comandi di movimento li potete trovare nel bigino creato da Ted Naleid che potete scaricare <a href="http://naleid.com/blog/2010/10/04/vim-movement-shortcuts-wallpaper/">qui</a></p>
<p>All'interno troverete, in modo molto ordinato, tutti i comandi necessari per muoversi all'interno del nostro editor preferito senza grossi problemi, spero sia utile.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Impariamo VI (Improved): Le Macro2012-10-13T00:00:00+02:002012-10-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-13:/misc/VIM7.html<p>In questa puntata: Macro. Come far fare al computer operazioni noiose e ripetitive con la pressione di pochi pulsanti. Tutto grazie a VI!</p><h1>In questa puntata: Macro. Come far fare al computer operazioni noiose e ripetitive con la pressione di pochi pulsanti. Tutto grazie a VI!</h1>
<p>Speravate non capitasse mai, ma è successo. La fatidica frase del capo: "Tirami fuori una tabella html da questo log testuale" e di colpo una bella giornata finisce nel baratro e se ne vanno giorni di lavoro solo per riuscire a intabellare un log. Tutto questo succede se non usate VI. Con questo fantastico editor potrete registrare le operazioni da fare su ogni riga e fargliele ripetere all'infinito mentre voi riposate.</p>
<p>Iniziamo, abbiamo il nostro log; in questo caso è il log di un vecchio script che ho creato tanto tempo fa:</p>
<div class="codehilite"><pre><span></span><code><span class="err">Tue Sep 11 11:04:50 2012 - UU Started</span>
<span class="err">Tue Sep 11 11:04:50 2012 - Sync Started</span>
<span class="err">Tue Sep 11 11:07:38 2012 - Fetch Started</span>
<span class="err">Tue Sep 11 11:09:14 2012 - Make Started</span>
<span class="err">Tue Sep 11 11:09:32 2012 - Keyboard Interrupt detected, closing UU</span>
</code></pre></div>
<p>Intabellare una cosa del genere potrebbe risultare molto noiosa, soprattutto quando il log non è lungo solo 5 righe, ma ben 291 (questa è la dimensione attuale del mio log).</p>
<p>Il nostro obiettivo è modificare la prima riga in modo che abbia la struttura che vogliamo per poi far ripetere il tutto a VI. Vediamo come:</p>
<p>Iniziamo posizionandoci sulla prima riga e premiamo:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">q</span><span class="o">][</span><span class="n">a</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Questo comando dirà a VI di registrare ciò che accadrà d'ora in poi nel "Registro a", ovviamente VI risponderà prontamente nella barra di stato:</p>
<div class="codehilite"><pre><span></span><code><span class="err">recording</span>
</code></pre></div>
<p>ora iniziamo a modificare il file così:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[i]</span>
<span class="na"><tr><td></span>
</code></pre></div>
<p>In modo da inserire i tag di riga e dato, ora:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[ESC]</span>
<span class="na">/ [ENTER]</span>
</code></pre></div>
<p><strong>Attenzione: Dopo il "forward slash" c'è uno spazio, effettivamente stiamo proprio cercando uno spazio</strong></p>
<p>Ora premiamo</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">n</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Tante volte quante sono necessarie per arrivare allo spazio dopo la fine della colonna cercata, nel mio caso devo premerlo 2 volte, poi diamo:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[x][i]</span>
<span class="na"></td><td></span>
</code></pre></div>
<p>Con [x] cancelliamo lo spazio per poi entrare in modalità inserimento e chiudere una colonna ed aprirne un'altra, il risultato finora è questo:</p>
<div class="codehilite"><pre><span></span><code><span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:04:50 2012 - UU Started
</code></pre></div>
<p>Continuiamo con:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[ESC]</span>
<span class="k">[n]</span>
</code></pre></div>
<p>Per passare allo spazio successivo, nel mio caso questo basta per arrivare dopo l'ora registrata nel log, perciò:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[x][i]</span>
<span class="na"></td><td></span>
</code></pre></div>
<p>Proseguiamo con:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[ESC]</span>
<span class="k">[n]</span>
</code></pre></div>
<p>Per arrivare allo spazio successivo all'anno, io premerò 3 volte</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">x</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Per cancellare i due spazi e il trattino, poi proseguo con:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[i]</span>
<span class="na"></td><td></span>
</code></pre></div>
<p>poi per finire:</p>
<div class="codehilite"><pre><span></span><code><span class="k">[ESC]</span>
<span class="k">[FINE]</span>
<span class="k">[a]</span>
<span class="na"></td></tr></span>
<span class="k">[ESC]</span>
<span class="k">[Freccia Giù]</span>
<span class="k">[Inizio]</span>
</code></pre></div>
<p>Con questi comandi: dopo esserci portati alla fine della riga e aver scritto i tag di chiusura html ci portiamo all'inizio della riga successiva; questo è importante per l'esecuzione, così lo script andrà da solo ad operare nella riga successiva.</p>
<p>Possiamo terminare la registrazione con:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">q</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Facciamo un prova richiamando lo script con:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">@</span><span class="o">][</span><span class="n">a</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>Se la seconda riga si modifica come previsto possiamo eseguire lo script fino alla fine con:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">9</span><span class="o">][</span><span class="n">9</span><span class="o">][</span><span class="n">9</span><span class="o">][</span><span class="n">9</span><span class="o">][</span><span class="n">@</span><span class="o">][</span><span class="n">a</span><span class="o">]</span><span class="w"></span>
</code></pre></div>
<p>In realtà questo comando esegue semplicemente lo script 9999 volte, ma se le righe sono meno, si ferma.</p>
<p>Il risultato sarà:</p>
<div class="codehilite"><pre><span></span><code><span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:04:50<span class="nt"></td><td></span>2012<span class="nt"></td><td></span>UU Started<span class="nt"></td></tr></span>
<span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:04:50<span class="nt"></td><td></span>2012<span class="nt"></td><td></span>Sync Started<span class="nt"></td></tr></span>
<span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:07:38<span class="nt"></td><td></span>2012<span class="nt"></td><td></span>Fetch Started<span class="nt"></td></tr></span>
<span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:09:14<span class="nt"></td><td></span>2012<span class="nt"></td><td></span>Make Started<span class="nt"></td></tr></span>
<span class="nt"><tr><td></span>Tue Sep 11<span class="nt"></td><td></span>11:09:32<span class="nt"></td><td></span>2012<span class="nt"></td><td></span>Keyboard Interrupt detected, closing UU<span class="nt"></td></tr></span>
</code></pre></div>
<p>Ora basta inserire i tag:</p>
<div class="codehilite"><pre><span></span><code><span class="err"><html></span>
<span class="err"><body></span>
<span class="err"><table border=1></span>
</code></pre></div>
<p>All'inizio del documento e i tag:</p>
<div class="codehilite"><pre><span></span><code><span class="nt"></table></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div>
<p>E avrete la vostra tabella in html bella che pronta in soli 5 minuti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Disegni CAD gratis, con LibreCAD2012-10-12T00:00:00+02:002012-10-12T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-12:/gratis-sul-web/LibreCAD.html<p>Presentazione di LibreCAD, un piccolo e leggero programma di CAD semplice da usare, ma molto funzionale.</p><h1>Presentazione di LibreCAD, un piccolo e leggero programma di CAD semplice da usare, ma molto funzionale.</h1>
<p>Buongiorno, oggi vi presento LibreCAD, un piccolo programma di Computer Aided Design. È un programma decisamente leggero e dal'interfaccia semplice:</p>
<p>LibreCAD è open source, e per questo è disponibile sia per Windows che per MacOSX e anche per le varie distro di Linux: Sul sito trovate i file .deb per Ubuntu e Debian, ma ci sono le istruzioni per compilarlo sotto ArchLinux. Gli utenti di Gentoo non sono lasciati fuori, basta aggiungere (usando layman) l'overlay science, un emerge LibreCAD ed il gioco è fatto.</p>
<p>Il programma è semplice da usare, ma non per questo privo di funzioni; inoltre l'interfaccia è completamente localizzabile in Italiano e potete scegliere le misure che preferite.</p>
<p>Lo trovate seguendo questo <a href="http://librecad.org/cms/home.html">Link</a></p>
<p>Buon Divertimento!</p>
<p>Peace!</p>
<p>Penaz.</p>Calendari Pubblici e Polls con Doodle2012-10-09T00:00:00+02:002012-10-09T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-09:/misc/Doodle.html<p>Presentazione di un sito molto interessante da cui potrete creare un calendario pubblico, organizzare i vostri eventi e creare facilmente dei poll: tutto questo è doodle.</p><h1>Presentazione di un sito molto interessante da cui potrete creare un calendario pubblico, organizzare i vostri eventi e creare facilmente dei poll: tutto questo è doodle.</h1>
<p>Buongiorno, oggi vi propongo un sito dove potrete organizzare facilmente i vostri eventi, creare polls e creare una sorta di "calendario pubblico". Il sito si chiama Doodle e vi permette tramite un semplice wizard di fare tutte queste cose.</p>
<p>Potete provarlo subito da questo <a href="http://www.doodle.com/">Link</a></p>
<p>Non richiede registrazione ed è in italiano. Per usarlo ricordatevi di abilitare javascript.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Recuperiamo il controllo di un sistema Linux bloccato senza spegnere forzatamente il PC2012-10-04T00:00:00+02:002012-10-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-04:/misc/MagicSysReq.html<p>Piccola guida all'uso della famosa Magic Sys Req, una modalità di comunicazione diretta col Kernel Linux.</p><h1>Piccola guida all'uso della famosa Magic Sys Req, una modalità di comunicazione diretta col Kernel Linux.</h1>
<p>Capita a tutti, un'azione sbagliata, un programma sperimentale e il pc si blocca irrimediabilmente; in questi casi se non si è salvato il lavoro possono arrivare dei grossi mal di testa, niente paura! Ci viene in soccorso la Magic Sys Req.</p>
<p>Magic Sys Req è una modalità di comunicazione diretta col kernel che può essere abilitata in fase di compilazione tramite la voce CONFIG_MAGIC_SYSRQ nel file .config del kernel, questa modalità è particolarmente utile quando, per esempio, si blocca il server X; la tastiera non risponde e il mouse non si muove, cosa fare?</p>
<p>In realtà è molto semplice: a parte sperare che CONFIG_MAGIC_SYSRQ sia attivo nel kernel possiamo effettuare alcune operazioni, premendo le seguenti combinazioni di pulsanti:</p>
<blockquote>
<p>Alt + R Sist + r</p>
</blockquote>
<p>Questo comando fa in modo che l'input della tastiera passi dalla modalità Raw usata da X alla modalità XLate, così da poter con molta probabilità recuperarne il controllo.</p>
<blockquote>
<p>Alt + R Sist + e</p>
</blockquote>
<p>Questo comando invia il segnale SIGTERM a tutti i processi, tranne l'init. In modo che tutti i programmi vengano chiusi correttamente.</p>
<blockquote>
<p>Alt + R Sist + i</p>
</blockquote>
<p>Questo comando invia invece il segnale SIGKILL a tutti i processi, tranne l'init. In modo che tutti i programmi vengano chiusi immediatamente, a prescindere dallo stato in cui sono.</p>
<blockquote>
<p>Alt + R Sist + s</p>
</blockquote>
<p>Sincronizza tutti i filesystem montati, applicando le ultime modifiche</p>
<blockquote>
<p>Alt + R Sist + u</p>
</blockquote>
<p>Fa in modo che tutti i filesystem montati vengano rimontati in modalità di sola lettura (cosa che viene solitamente effettuata allo spegnimento del sistema)</p>
<blockquote>
<p>Alt + R Sist + b</p>
</blockquote>
<p>Provoca un riavvio immediato del computer.</p>
<p>Nel caso non vi ricordiate i comandi, potete usare la combinazione</p>
<blockquote>
<p>Alt + R Sist + h</p>
</blockquote>
<p>Che visualizza sullo schermo un documento di aiuto.</p>
<p>Ovviamente si spera che eventi del genere non capitino mai, ma nel caso capitassero saprete come reagire.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Una chiavetta di emergenza/utilità portatile2012-10-03T00:00:00+02:002012-10-03T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-10-03:/misc/Emergency_USB.html<p>Piccoli consigli e alcuni link per farci in casa un ufficio portatile, un sistema di recupero dati, analisi, benchmark e configurazione di sistema oltre a recupero password e molto altro ancora, tutto con la nostra cara chiavetta USB!</p><h1>Piccoli consigli e alcuni link per farci in casa un ufficio portatile, un sistema di recupero dati, analisi, benchmark e configurazione di sistema oltre a recupero password e molto altro ancora, tutto con la nostra cara chiavetta USB!</h1>
<p>Buongiorno, oggi vi propongo un po' di link e applicazioni per crearvi in casa la vostra chiavetta salvavita, il tutto in maniera semplice, veloce ed efficace.</p>
<p>Iniziamo con il materiale necessario:</p>
<ul>
<li>Una chiavetta USB da almeno 4GB.</li>
<li>Connessione ad internet.</li>
</ul>
<p>Dopo aver opportunamente formattato la nostra chiavetta, iniziamo inserendo un piccolo programmino che ci permetterà di accedere facilmente ai nostri programmi portatili, qui avete due alternative, a seconda di quanto vi sentite sicuri:</p>
<ul>
<li><strong>PortableApps Launcher</strong>, il metodo semplice per installare le applicazioni portatili, ma poco espandibile.</li>
<li><strong>PStart</strong>, il metodo un po' più difficile ma decisamente più leggero e flessibile.</li>
</ul>
<p>Io ho sempre optato per PStart che potrete scaricare da qui: <a href="http://www.pegtop.net/">Link</a></p>
<p>Ora iniziamo a rimpinzare la nostra chiavetta USB con alcuni programmi, sicuramente da guardare è il sito <a href="http://portableapps.com/">PortableApps.com</a> pieno zeppo di tutte le utility e inutility che vi possano mai servire, il tutto portatile! Si va dalle suite da ufficio, ai browser, programmi di posta, giochi e altro.</p>
<p>Se usate PStart dovrete creare manualmente i collegamenti, ma avrete la possibilità di creare degli alberi di cartelle così da tenere il tutto ben organizzato.</p>
<p>Se volete che la vostra chiavetta vi salvi veramente la vita non potete fare a meno di inserire qualche utility di sistema come si deve, installeremo quindi <a href="http://launcher.nirsoft.net/">NirLauncher</a> che contiene al suo interno 200 utility per il controllo e la messa a punto dei sistemi Windows. E tanto perchè non siamo contenti, aggiungiamo anche i plugin per installare le utility SysInternals di Microsoft, JoeWare e Piriform; tanto per aver a disposizione anche CCleaner (uno strumento di pulizia), Defraggler (uno strumento di deframmentazione), Recuva (uno strumento per il recupero dei dati cancellati) e Speccy (uno strumento per rilevare le specifiche Hardware).</p>
<p><strong>Alcuni antivirus potrebbero rilevare il programma "netpass" come un virus; in realtà è il programma di recupero delle password di rete, pertanto è un falso positivo.</strong></p>
<p>Configurate Pstart creando i collegamenti dovuti e facendo in modo che parta automaticamente all'inserimento nel PC.</p>
<p>Se volete fare proprio una chiavetta hardcore, che ne dite di installare una distro linux per il recupero di sistemi all'interno della vostra chiavetta?</p>
<p>Prima di procedere all'installazione di tutti i programmi per windows, installate nella vostra chiavetta USB la SysRescueCD, come spiegato in <a href="http://www.sysresccd.org/Sysresccd-manual-en_How_to_install_SystemRescueCd_on_an_USB-stick">Questa Pagina</a>. Dopodichè, senza formattare la chiavetta, procedete all'installazione dei programmi.</p>
<p>Quando inserirete la vostra chiavetta in Windows partiranno i programmi che avete scelto (per esempio PStart), mentre se la inserirete all'avvio del PC potrete usare la SysRescueCD per recuperare il vostro sistema.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Impariamo VI (Improved) - I Templates2012-09-28T00:00:00+02:002012-09-28T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-28:/misc/VIM6.html<p>Impariamo come usare i templates di VI per incrementare la nostra produttività creando una struttura di base per i nostri progetti.</p><h1>Impariamo come usare i templates di VI per incrementare la nostra produttività creando una struttura di base per i nostri progetti.</h1>
<p>Se siete programmatori, troverete sicuramente fastidioso dover preparare ogni volta la struttura del vostro progetto. Prendiamo per esempio una pagina html: la struttura di base è composta da alcuni tag ricorrenti. Con VI è possibile creare dei templates che verranno automaticamente usati quando necessario. Iniziamo aprendo vi e scrivendo la struttura di base della nostra pagina in html:</p>
<div class="codehilite"><pre><span></span><code><span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</code></pre></div>
<p>Salviamolo all'interno di una cartella (che io chiamerò templates) con un nome ben definito, dato dalla combinazione:</p>
<blockquote>
<p><estensione del file>.tpl</p>
</blockquote>
<p>nel mio caso:</p>
<blockquote>
<p>html.tpl</p>
</blockquote>
<p>Per attivare la funzionalità templates dovremo inserire questo comando all'interno del nostro file vimrc:</p>
<blockquote>
<p>autocmd BufNewFile * silent! 0r /home/penaz/templates/%:e.tpl</p>
</blockquote>
<p>Dove /home/penaz/templates è la cartella dove ho inserito il file html.tpl e, come sappiamo, %:e verrà automaticamente espanso all'estensione del file aperto. In questo modo si evita di sporcare il nostro ".vimrc" con un numero eccessivo di righe, una per ogni template; questa riga caricherà automaticamente quello necessario. Nel caso il file aperto non avesse un template, verrà semplicemente generato il solito file vuoto, ma se diamo a VI il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi prova.html</span>
</code></pre></div>
<p>Vedremo aprirsi VIM il file prova.html con già all'interno:</p>
<div class="codehilite"><pre><span></span><code><span class="p"><</span><span class="nt">html</span><span class="p">></span>
<span class="p"><</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">title</span><span class="p">></</span><span class="nt">title</span><span class="p">></span>
<span class="p"></</span><span class="nt">head</span><span class="p">></span>
<span class="p"><</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">body</span><span class="p">></span>
<span class="p"></</span><span class="nt">html</span><span class="p">></span>
</code></pre></div>
<p>Ovviamente potrete effetturare le stesse operazioni con altri tipi di file, come inserire automaticamente delle inclusioni in file con estensione *.c (il template si chiamerà c.tpl), creare una struttura di base per degli script python (py.tpl) oppure inserire delle stringhe speciali negli script bash (sh.tpl). Le possibilità sono praticamente infinite.</p>
<p>Con questo è tutto. Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Scorciatoie E automatizzazioni con AutoHotkey2012-09-26T00:00:00+02:002012-09-26T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-26:/misc/AutoHotkey2.html<p>Impariamo alcune funzionalità avanzate di AutoHotkey, come l'attesa di una finestra, la sua attivazione insieme ai movimenti e i click del mouse.</p><h1>Impariamo alcune funzionalità avanzate di AutoHotkey, come l'attesa di una finestra, la sua attivazione insieme ai movimenti e i click del mouse.</h1>
<p>Buongiorno, torniamo al nostro piccolo corso di AutoHotkey, oggi vedremo come possiamo automatizzare alcune operazioni come apertura di programmi, attivazione di finestre e click del mouse. Useremo <a href="http://www.dosbox.com">DosBox</a> come programma da manovrare, durante la scrittura dello script teniamone aperta una sessione per sapere cosa deve essere eseguito e dove il mouse deve cliccare.</p>
<p>Creiamo un nuovo file di testo e salviamolo con la solita estensione .ahk. Iniziamo scrivendo un po' di impostazioni abbastanza importanti.</p>
<div class="codehilite"><pre><span></span><code><span class="err">#NoEnv</span>
</code></pre></div>
<p>Questa impostazione serve per la compatibilità con le future release di AutoHotkey.</p>
<div class="codehilite"><pre><span></span><code><span class="err">SetKeyDelay, 50,0</span>
</code></pre></div>
<p>Siccome DosBox è un po' lento a ricevere i segnali da tastiera portiamo a 50 millisecondi l'intervallo tra un segnale e l'altro, altrimenti frasi come:</p>
<div class="codehilite"><pre><span></span><code><span class="c">c:\programmi\</span>
</code></pre></div>
<p>Verrebbero scritte in un modo simile a questo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">c\prgmmi</span>
</code></pre></div>
<p>Proseguiamo con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">SetWorkingDir %A_ScriptDir%</span>
</code></pre></div>
<p>Tanto per essere sicuri di avere una directory di lavoro consistente.</p>
<p>Abbiamo finito con le impostazioni, ora iniziamo a istruire AutoHotkey sulle azioni da prendere.</p>
<p>Iniziamo con il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">Run, C:\Program Files (x86)\DOSBox-0.74\DOSBox.exe</span>
</code></pre></div>
<p>Che avvia per noi il programma DOSBox.exe che si trova nella cartella "C:\program files (X86)\DoxBox-0.74". Il prossimo comando è:</p>
<div class="codehilite"><pre><span></span><code><span class="err">WinWait, DOSBox 0.74</span>
</code></pre></div>
<p>Questo comando è abbastanza auto-esplicativo, attende che compaia una finestra che riporti nel titolo la stringa "DOSBox 0.74", se compare lo script prosegue.</p>
<div class="codehilite"><pre><span></span><code><span class="err">Sleep, 500</span>
</code></pre></div>
<p>Con questo comando fermiamo lo script per 500 millisecondi (mezzo secondo) così da evitare possibili problemi dati dall'invio di molti segnali consecutivi.</p>
<div class="codehilite"><pre><span></span><code><span class="err">SendRaw, mount c H:\Programmi\Giochi\PRINCE</span>
</code></pre></div>
<p>Questo comando, a differenza di "Send" invia la stringa come è visualizzata, senza tener conto dei caratteri modificatori (+ ^ # <^>!) che già conosciamo.</p>
<p>Nella dosbox vedremo scriversi il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">mount c H:\Programmi\Giochi\PRINCE</span>
</code></pre></div>
<p>Che monta la cartella H:\Programmi\Giochi\PRINCE nel disco C di dosbox.</p>
<p>Prossimo comando:</p>
<div class="codehilite"><pre><span></span><code><span class="n">sleep</span><span class="p">,</span> <span class="mi">2000</span>
<span class="n">send</span> <span class="err">{</span><span class="n">Enter</span><span class="err">}</span>
</code></pre></div>
<p>Dopo aver atteso 2 secondi, usiamo il comando Send per inviare il segnale della pressione del tasto Invio.</p>
<p>Allo stesso modo di prima, inviamo altri comandi alla DosBox:</p>
<div class="codehilite"><pre><span></span><code><span class="n">sleep</span><span class="p">,</span> <span class="mi">200</span>
<span class="n">SendRaw</span><span class="p">,</span> <span class="k">C</span><span class="p">:</span>
<span class="n">sleep</span><span class="p">,</span> <span class="mi">2000</span>
<span class="n">send</span> <span class="err">{</span><span class="n">Enter</span><span class="err">}</span>
<span class="n">sleep</span><span class="p">,</span> <span class="mi">200</span>
<span class="n">sendraw</span><span class="p">,</span> <span class="n">Prince</span>
<span class="n">send</span> <span class="err">{</span><span class="n">Enter</span><span class="err">}</span>
<span class="n">sleep</span><span class="p">,</span> <span class="mi">10000</span>
</code></pre></div>
<p>In poche parole questi comandi fanno scrivere alla DosBox il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="c">c:\</span>
</code></pre></div>
<p>Seguito dal tasto Invio e poi esegue il comando</p>
<div class="codehilite"><pre><span></span><code><span class="err">Prince</span>
</code></pre></div>
<p>Ed attende 10 secondi.</p>
<p>Ora arriva la parte divertente, prendiamo in mano l'AutoIt3 Window Spy, distribuito insieme ad autohotkey e risolleviamo la dosbox, puntiamo il tasto chiudi e annotiamo La posizione nella finestra attiva:</p>
<div class="codehilite"><pre><span></span><code><span class="o">>>>>>>>>>>>></span><span class="p">(</span> <span class="n">Mouse</span> <span class="k">Position</span> <span class="p">)</span><span class="o"><<<<<<<<<<<<<</span>
<span class="k">On</span> <span class="n">Screen</span><span class="p">:</span> <span class="mi">751</span><span class="p">,</span> <span class="mi">133</span> <span class="p">(</span><span class="k">less</span> <span class="n">often</span> <span class="n">used</span><span class="p">)</span>
<span class="k">In</span> <span class="n">Active</span> <span class="n">Window</span><span class="p">:</span> <span class="mi">627</span><span class="p">,</span> <span class="mi">8</span>
</code></pre></div>
<p>E scriviamo questo comando nel nostro script:</p>
<div class="codehilite"><pre><span></span><code><span class="err">mouseclick, left , 627,8</span>
</code></pre></div>
<p>Questo farà in modo che il mouse si sposti sul pulsante chiudi e lo clicchi..</p>
<p>Il nostro script finale dovrebbe avere un aspetto come questo:</p>
<div class="codehilite"><pre><span></span><code><span class="nb">#NoEnv</span>
<span class="nb">SetKeyDelay</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span><span class="mi">0</span>
<span class="nb">SetWorkingDir</span> <span class="nv">%A_ScriptDir%</span>
<span class="nb">Run</span><span class="p">,</span> <span class="n">C</span><span class="o">:</span>\<span class="n">Program</span> <span class="n">Files</span> <span class="p">(</span><span class="n">x86</span><span class="p">)</span>\<span class="n">DOSBox</span><span class="o">-</span><span class="mf">0.74</span>\<span class="n">DOSBox</span><span class="o">.</span><span class="n">exe</span>
<span class="nb">WinWait</span><span class="p">,</span> <span class="n">DOSBox</span> <span class="mf">0.74</span>
<span class="nb">Sleep</span><span class="p">,</span> <span class="mi">500</span>
<span class="nb">SendRaw</span><span class="p">,</span> <span class="n">mount</span> <span class="n">c</span> <span class="n">H</span><span class="o">:</span>\<span class="n">Programmi</span>\<span class="n">Giochi</span>\<span class="n">PRINCE</span>
<span class="nb">sleep</span><span class="p">,</span> <span class="mi">2000</span>
<span class="nb">send</span> <span class="p">{</span><span class="n">Enter</span><span class="p">}</span>
<span class="nb">sleep</span><span class="p">,</span> <span class="mi">200</span>
<span class="nb">SendRaw</span><span class="p">,</span> <span class="n">C</span><span class="o">:</span>
<span class="nb">sleep</span><span class="p">,</span> <span class="mi">2000</span>
<span class="nb">send</span> <span class="p">{</span><span class="n">Enter</span><span class="p">}</span>
<span class="nb">sleep</span><span class="p">,</span> <span class="mi">200</span>
<span class="nb">sendraw</span><span class="p">,</span> <span class="n">Prince</span>
<span class="nb">send</span> <span class="p">{</span><span class="n">Enter</span><span class="p">}</span>
<span class="nb">sleep</span><span class="p">,</span> <span class="mi">10000</span>
<span class="nb">mouseclick</span><span class="p">,</span> <span class="n">left</span> <span class="p">,</span> <span class="mi">627</span><span class="p">,</span><span class="mi">8</span>
</code></pre></div>
<p>Se lo avviamo, si aprirà dosbox, verranno digitati tutti i comandi, e dopo 10 secondi verrà automaticamente chiusa la DosBox.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Macro e Automatizzazioni con AutoHotkey - Parte 12012-09-22T00:00:00+02:002012-09-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-22:/misc/AutoHotkey1.html<p>Impariamo come usare AutoHotkey, un piccolo linguaggio che ci permette di creare macro, e aggiungere o modificare le funzionalità della nostra tastiera.</p><h1>Impariamo come usare AutoHotkey, un piccolo linguaggio che ci permette di creare macro, e aggiungere o modificare le funzionalità della nostra tastiera.</h1>
<p>Buongiorno, oggi vedremo come iniziare ad usare <a href="http://www.autohotkey.com/">AutoHotkey</a>, creando delle nuove scorciatoie da tastiera e costruendo un piccolo script che ci permetta di usare le abbreviazioni che preferiamo espandendole automaticamente.</p>
<p>Intanto iniziamo con un po' di simbologia, autohotkey ha un modo un po' particolare di rappresentare i pulsanti, vediamo quali:</p>
<ul>
<li>1-9 - I numeri da 1 a 9</li>
<li>a-z - Le lettere dalla A alla Z</li>
</ul>
<p>Finora niente di strano, ora diamo un'occhiata ai modificatori:</p>
<ul>
<li>
<h1>- Il tasto WIN (quello con la bandierina)</h1>
</li>
<li>! - Il tasto ALT</li>
<li>^ - Il tasto CTRL</li>
<li>+ - Il tasto SHIFT</li>
<li><^>! - Il tasto ALTGR</li>
</ul>
<p>Questo per ora è tutto quello che ci serve per creare le nostre prime scorciatoie, prendendo come esempio il piccolo <a href="https://penazarea.altervista.org/coding/Layboard.html">LayBoard</a>, uno script che ho creato, per scrivere il carattere <strong>~</strong> con la combinazione ALTGR+ì basta scrivere nel nostro blocco note:</p>
<blockquote>
<p><^>!ì::send ~</p>
</blockquote>
<p>Semplice no? Scomponiamolo per comodità:</p>
<ul>
<li><^>! - Come detto è ALTGR</li>
<li>ì - La lettera "ì", situata a sinistra del tasto backspace</li>
<li>:: - Dice ad Autohotkey di eseguire il comando che segue</li>
<li>send ~ :: Indica di inviare il carattere "tilde" (~)</li>
</ul>
<p>Volendo possiamo anche cambiare la funzione dei tasti, uno scherzo da provare è quello di cambiare tutti i tasti della tastiera, come per esempio:</p>
<blockquote>
<p>a::send b</p>
<p>b::send c</p>
<p>c::send d</p>
</blockquote>
<p>Queste tre righe faranno in modo che quando verrà premuta la lettera "a" sullo schermo uscirà "b", quando verrà presso "b" uscirà "c" e così via. Per rapidità di scrittura si può anche scrivere così:</p>
<blockquote>
<p>a::b</p>
<p>b::c</p>
<p>c::d</p>
</blockquote>
<p>L'importante è che in questo caso i caratteri siano standard, nel caso non funzionasse provate ad anteporre "send" all'uscita desiderata.</p>
<p>Se volessimo creare scorciatoie più complesse, non c'è problema:</p>
<blockquote>
<p>^!+c:: run, calc</p>
</blockquote>
<p>Questa riga fa in modo che premendo la combinazione CTRL+ALT+SHIFT+C parta la calcolatrice di windows.</p>
<p><strong>AutoHotkey tende a sovrapporsi alle scorciatoie di windows, se volete che il pulsante o la combinazione mantengano le proprie funzioni originarie, aggiungete il simbolo ~ prima della scorciatoia</strong></p>
<blockquote>
<p>~#e::msgbox, "è stato aperto esplora risorse"</p>
</blockquote>
<p>Creare delle abbreviazioni con AutoHotkey è tutt'altro che difficile, basta solo usare questa sintassi:</p>
<blockquote>
<p>::<abbreviazione>::<parola completa></p>
</blockquote>
<p>Ecco alcuni esempi:</p>
<blockquote>
<p>::cmq::comunque</p>
<p>::bgg::buongiorno</p>
</blockquote>
<p>Ma si può fare qualcosa di più complesso, tipo:</p>
<blockquote>
<p>::{firma}::Tony Mordente {Enter}Via Garibaldi, 1 {Enter}20100 Milano (MI)</p>
</blockquote>
<p>Questo fa in modo che ogniqualvolta digiterete {firma} comparirà:</p>
<blockquote>
<p>Tony Mordente</p>
<p>Via Garibaldi, 1</p>
<p>20100 Milano (MI)</p>
</blockquote>
<p><strong>Perchè tutto funzioni correttamente è necessario che {firma} venga digitato così com'è, se prima digitate le parentesi e poi tornate indietro per scriverci "firma", lo script potrebbe non funzionare.</strong></p>
<p>Per oggi è tutto, buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Impariamo VI (Improved) - Il file di configurazione .vimrc parte 22012-09-21T00:00:00+02:002012-09-21T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-21:/misc/VIM5.html<p>Aggiungiamo ancora qualche riga al nostro file di configurazione di VI per avere un ambiente ancora più flessibile.</p><h1>Aggiungiamo ancora qualche riga al nostro file di configurazione di VI per avere un ambiente ancora più flessibile.</h1>
<p>Come ho già detto in <a href="https://penazarea.altervista.org/misc/VIM4.html">questo post</a> VI è un editor estremamente flessibile e posso azzardarmi a dire che quello che è al suo interno è un vero e proprio linguaggio di scripting, allora perchè non sfruttarlo e rendere il nostro ambiente di lavoro sensibile al formato del file a cui stiamo lavorando?</p>
<p>Io per esigenze universitarie mi ritrovo a dover programmare in Java, e trovo seriamente fastidioso dover ogni volta digitare:</p>
<div class="codehilite"><pre><span></span><code>javac progetto.java
</code></pre></div>
<p>per creare il bytecode e poi digitare.</p>
<div class="codehilite"><pre><span></span><code>java progetto
</code></pre></div>
<p>per eseguirlo. Un'alternativa potrebbe essere eseguire i comandi all'interno di VI con:</p>
<blockquote>
<p>:!javac progetto.java</p>
<p>:!java progetto</p>
</blockquote>
<p>oppure, configurare delle scorciatoie da tastiera che permettono di eseguire compilatore e interprete in due mosse semplici semplici. Vediamo come:</p>
<p>Apriamo prima di tutto il nostro file di configurazione:</p>
<div class="codehilite"><pre><span></span><code>vim .vimrc
</code></pre></div>
<p>E iniziamo ad inserire i nostri comandi:</p>
<blockquote>
<p>let e = expand("%:e")</p>
</blockquote>
<p>Il comando <strong>let</strong> serve per creare una variabile interna, mentre il comando <strong>expand</strong> provoca l'espansione dell'espressione %:e, che rappresenta l'estensione del file aperto; in poche parole inseriamo nella variabile e una stringa che riporta l'estensione del file aperto.</p>
<p>Ora iniziamo con un'istruzione condizionale:</p>
<blockquote>
<p>if e=="java"</p>
</blockquote>
<p>Notare che l'uso dell'if assomiglia molto a python, a parte la mancanza dei due punti finali. È importantissimo usare il doppio uguale ( <strong>==</strong> ) altrimenti invece di un confronto effettueremo un'assegnazione.</p>
<p>Il resto è abbastanza semplice da capire, chiediamo a VI se l'estensione del file aperto è "java". Ora inseriamo le istruzioni da eseguire in caso affermativo (tutto sulla stessa riga e attenzione all'identazione):</p>
<blockquote>
<p><p style="padding-left: 30px;">set statusline=%F\ %m\ %r\ %w\ %h\ [FileType:\ %Y]\ [Linea:\ %l/%L\ (%p%%)]\ [Col:\ %v]\ \ \ \ {CTRL-F2\ Compilatore\ -\ CTRL-F\ Avvia\ Classe}</p></p>
</blockquote>
<p>Questo fa in modo che la barra di stato che abbiamo attivato nel capitolo precedente rappresenti, oltre alle informazioni già presenti anche la scritta:</p>
<blockquote>
<p>{CTRL-F2 Compilatore - CTRL-F Avvia Classe}</p>
</blockquote>
<p>Solo come piccolo promemoria, nel caso dimenticassimo come usare le nostre scorciatoie. Ora impostiamo la prima scorciatoia, quella per il compilatore:</p>
<blockquote>
<p><p style="padding-left: 30px;">map <C-F2> :!javac %<CR></p></p>
</blockquote>
<p>Così facendo assegniamo alla combinazione CTRL+F2il comando:</p>
<blockquote>
<p>:!javac %</p>
</blockquote>
<p>dove il simbolo <strong>%</strong> verrà automaticamente sostituito con il nome del file completo di estensione. Ora mappiamo la combinazione per l'interprete:</p>
<blockquote>
<p><p style="padding-left: 30px;">map <C-F> :!java "%:r"<CR></p></p>
</blockquote>
<p>Con questo comando faccio in modo che premendo CTRL+F venga eseguito il comando:</p>
<blockquote>
<p>:!java "%:r"</p>
</blockquote>
<p>dove <strong>%:r</strong> rappresenta il nome del file privato dell'estensione, visto che l'interprete java accetta in ingresso solamente il nome della classe, privo di estensione.</p>
<p>Concludiamo il tutto con un bel:</p>
<blockquote>
<p>endif</p>
</blockquote>
<p>E abbiamo finito, riassumiamo tutti i comandi digitati:</p>
<div class="codehilite"><pre><span></span><code><span class="k">let</span> <span class="k">e</span> <span class="p">=</span> expand<span class="p">(</span><span class="s2">"%:e"</span><span class="p">)</span>
<span class="k">if</span> <span class="k">e</span><span class="p">==</span><span class="s2">"java"</span>
<span class="k">set</span> <span class="nb">statusline</span><span class="p">=</span>%F\ %<span class="k">m</span>\ %<span class="k">r</span>\ %<span class="k">w</span>\ %<span class="k">h</span>\ [<span class="nb">FileType</span>:\ %Y]\ [Linea:\ %<span class="k">l</span>/%L\ <span class="p">(</span>%<span class="k">p</span>%%<span class="p">)</span>]\ [Col:\ %<span class="k">v</span>]\ \ \ \ {CTRL<span class="p">-</span>F2\ Compilatore\ <span class="p">-</span>\ CTRL<span class="p">-</span>F3\ Avvia\ Classe}
map :<span class="p">!</span>javac
map :<span class="p">!</span>java <span class="s2">"%:r"</span>
<span class="k">endif</span>
</code></pre></div>
<p>Quindi in questo capitolo abbiamo visto come si creano delle variabili interne e come si usano delle istruzioni condizionali semplici.</p>
<p>Buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>FreeDroidRPG - un buon RPG open-source2012-09-19T00:00:00+02:002012-09-19T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-19:/gratis-sul-web/FreeDroidRPG.html<p>Oggi vi presento FreedroidRPG, un RPG isometrico tutto da scaricare e provare.</p><h1>Oggi vi presento FreedroidRPG, un RPG isometrico tutto da scaricare e provare.</h1>
<p>Buongiorno, oggi vi propongo un ottimo gioco di tipo RPG isometrico: FreeDroidRPG</p>
<p>Il gioco vi catapulterà in un mondo devastato dalla guerra tra umani e robots e voi impersonerete Tux (la famosa mascotte di linux), un pinguino con capacità informatiche che vanno al limite della magia.</p>
<p>FreeDroidRPG propone un sistema di combattimento in tempo reale con armi a distanza e non che ricorda molto da vicino quello di Diablo e un sistema di dialogo molto ricco che alcuni ritengono addirittura ai livelli di Fallout 3.</p>
<p>Le armi sono tante e ogni arma potrà essere modificata per adattarsi al meglio al vostro stile. Moltitudini di nemici pronti a farvi fuori, ma anche molti "npc" pronti ad aiutarvi.</p>
<p>Nello stesso sito troverete anche freedroidClassic, un gioco arcade che ricorda da vicino "paradroid" per commodore 64.</p>
<p>Ecco il link al sito: <a href="http://www.freedroid.org/">Link</a></p>
<p>Buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Improvvisiamoci enigmisti con FindThatWord2012-09-18T00:00:00+02:002012-09-18T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-18:/misc/FindThatWorld.html<p>Presentazione di FindThatWord: un programma che vi permette di creare con una facilità disarmante tutti i crossword che volete.</p><h1>Presentazione di FindThatWord: un programma che vi permette di creare con una facilità disarmante tutti i crossword che volete.</h1>
<p>Oggi vi presento FindThatWord: un piccolo programma che vi permette di improvvisarvi enigmisti, creando facilmente tutti i crossword che vi pare, anche con la parola chiave nascosta.</p>
<p>Le uniche cose da fare sono creare una lista di parole da cercare, una parola o una frase chiave (opzionale) e scegliere un titolo per il vostro crossword. Un click e il programma mixerà per voi tutte le parole nel modo ideale per formare il crossword; un altro click e potrete stampare il crossword. Il tutto all'interno di un'interfaccia pulita e dalla facilità disarmante.</p>
<p>Cosa state aspettando ancora? Potete scaricare il programma da sourceforge, per la vostra comodità vi offro il <a href="http://sourceforge.net/projects/findthatword/?source=directory">Link Diretto</a></p>
<p>Buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Layboard - Power to your keyboard!2012-09-16T00:00:00+02:002012-09-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-16:/coding/Layboard.html<p>Vi presento layboard, un piccolo programma che ho creato che vi permetterà di avere gran parte della potenza del layout di tastiera linux, su Windows!</p><h1>Vi presento layboard, un piccolo programma che ho creato che vi permetterà di avere gran parte della potenza del layout di tastiera linux, su Windows!</h1>
<p>Buongiorno, oggi vi presento LayBoard; un piccolissimo programma (poco più di 200KB) che vi permetterà di dare un senso al povero "Alternate Graphic" (ALT GR per gli amici), portando i caratteri extra che si possono scrivere con linux anche in Windows, senza doverli cercare nella mappa caratteri.</p>
<p>Ecco alcuni esempi:</p>
<ul>
<li>AltGr + 3 = ³</li>
<li>AltGr +2 = ²</li>
<li>AltGr + ì = ~</li>
</ul>
<p>E molti, molti altri.</p>
<p>L'idea è nata da una sessione di chat con un mio amico "pinguino" costretto per esigenze ludiche a usare anche windows; quando ad un certo punto cerca di scrivere il suo celeberrimo "lol³"... Senza successo. Da lì è nato "Esponente3", una singola riga di codice per permettergli di fare il tanto agognato esponente 3. LayBoard è l'evoluzione naturale di "Esponente3", ottimo per tutti gli appassionati del layout tastiera del pinguino.</p>
<p>Lo potete scaricare dal mio <a href="https://github.com/Penaz91/Layboard">Repository GitHub</a></p>
<p>Il programma è compresso con <a href="http://www.7-zip.org">7Zip</a> per esigenze di spazio e velocità di upload.</p>
<p><strong>Come usarlo:</strong> avviare l'eseguibile e usare la tastiera come in linux, LayBoard se ne starà zitto nella traybar finchè non riterrà necessario intervenire.</p>
<p><strong>Attenzione:</strong> Non tutti gli applicativi (per esempio notepad) supportano i simboli particolari usabili con LayBoard.</p>
<p>Il programma è inteso come qualcosa che "dovrebbe semplicemente funzionare" e sicuramente qualcosa non funzionerà, ma per le esigenze a cui doveva far capo, funziona egregiamente.</p>
<p>Grazie per aver letto e ci vediamo al prossimo post!</p>
<p>Penaz.</p>Mailinator: Tutti gli indirizzi email usa e getta che vuoi, senza registrazione.2012-09-16T00:00:00+02:002012-09-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-16:/misc/Mailinator.html<p>Introduzione a Mailinator, il servizio di "e-mail usa e getta" semplice, veloce e che non necessita di alcuna registrazione.</p><h1>Introduzione a Mailinator, il servizio di "e-mail usa e getta" semplice, veloce e che non necessita di alcuna registrazione.</h1>
<p>Sicuramente vi è già successo: vorreste iscrivervi ad un servizio ma non volete usare la vostra email personale per la registrazione, oppure non siete sicuri della serietà del servizio e vi aspettate un sacco di spam in arrivo nella vostra mail dopo la registrazione?</p>
<p>Una soluzione sarebbe quella di creare una nuova casella email, ma ci vuole tempo e bisogna inventare una password e comunque verrebbero coinvolti i vostri dati personali.</p>
<p>Un'altra alternativa sono i servizi di e-mail usa e getta, ma molti di questi richiedono una registrazione e questo richiede tempo.</p>
<p>La soluzione perfetta in questo caso è Mailinator, un servizio di e-mail usa e getta che vi permette di inventarvi una e-mail al volo; senza registrazione. Basta inventare la vostra mail, nella forma:</p>
<blockquote>
<p><vostramail>@mailinator.com</p>
</blockquote>
<p>usarla direttamente nella form del servizio che volete registrare e poi accederci direttamente dal sito:</p>
<blockquote>
<p><vostramail>.mailinator.com</p>
</blockquote>
<p>In alternativa potete accedere alla <a href="http://www.mailinator.com">Pagina Principale</a> di Mailinator e inserire la vostra mail fittizia nella casella apposita.</p>
<p>Nel caso il servizio rilevasse che state usando una e-mail usa e getta, non preoccupatevi: Mailinator offre una serie di domini alternativi per permettervi tranquillamente la registrazione; infatti indirizzi come:</p>
<ul>
<li><nome>@mailinator.com</li>
<li><nome>@soggetthis.com</li>
<li><nome>@tradermail.info</li>
</ul>
<p>Puntano allo stesso indirizzo, accessibile da <nome>.mailinator.com. Trovate i domini alternativi nella pagina principale del servizio.</p>
<p>Buon divertimento!</p>
<p>Penaz.</p>Impariamo VI (Improved) - Parte 4 - Il file di configurazione .vimrc2012-09-15T00:00:00+02:002012-09-15T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-15:/misc/VIM4.html<p>Impariamo come usare a nostro vantaggio il file .vimrc, il file di configurazione di VI, per avere sempre a disposizione l'ambiente a noi più adatto.</p><h1>Impariamo come usare a nostro vantaggio il file .vimrc, il file di configurazione di VI, per avere sempre a disposizione l'ambiente a noi più adatto.</h1>
<p>VIM può risultare un po' difficile da usare all'inizio, ma la difficoltà iniziale ripaga con una flessibilità ineguagliabile, grazie ad un proprio linguaggio di scripting è possibile trasformare VI in praticamente qualsiasi cosa, ecco alcuni esempi:</p>
<ul>
<li>Un client/editor per Wordpress (VIMPress)</li>
<li>Un client di Chat IRC (VIMIrc)</li>
<li>Un file-commander testuale (VIMCommander)</li>
<li>Un Tetris (VITetris)</li>
</ul>
<p>Oggi impareremo a fare delle piccole modifiche al file di configurazione, e spiegherò riga per riga cosa accadrà. Iniziamo. Assicurandoci di essere nella nostra home digitiamo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vim .vimrc</span>
</code></pre></div>
<p>Ora digiteremo i comandi che ci ritroveremmo a digitare se dovessimo fare tutto a mano ogni volta, ma senza i due punti iniziali (:). Alla fine di questo capitolo avrete un file di configurazione praticamente uguale al mio, molto flessibile anche se semplice. Ecco la prima riga:</p>
<blockquote>
<p>set number</p>
</blockquote>
<p>Questo fa in modo che prima di ogni riga compaia un numero che rappresenta, appunto, il numero di riga, molto utile per i programmatori.</p>
<blockquote>
<p>set numberwidth=4</p>
</blockquote>
<p>Questo comando imposta la distanza dei numeri di riga dal margine sinistro dello schermo.</p>
<blockquote>
<p>set cursorline</p>
</blockquote>
<p>Questo comando fa in modo che sia evidenziata la riga che si sta modificando, così da evitare confusione in caso di testi molto lunghi.</p>
<blockquote>
<p>map <C-T> :tabnew<CR></p>
</blockquote>
<p>Questo comando fa in modo che premendo CTRL+T sulla tastiera, si apra una nuova scheda.</p>
<blockquote>
<p>map <C-Left> :tabprev<CR></p>
</blockquote>
<p>Questo comando fa in modo che in presenza di più schede e premendo CTRL+"Freccia Sinistra", si passi alla scheda precedente.</p>
<blockquote>
<p>map <C-Right> :tabnext<CR></p>
</blockquote>
<p>Questo comando adopera lo stesso ragionamento di quello precedente: premendo CTRL+"Freccia Destra", si passa alla scheda successiva.</p>
<blockquote>
<p>set laststatus=2</p>
</blockquote>
<p>Abilita la barra di stato, che potrete personalizzare a vostro piacimento con il prossimo comando. La barra di stato può contenere messaggi, informazioni sul testo e molto altro.</p>
<p>Ora arriva la parte difficile:</p>
<blockquote>
<p>set statusline=%F\ %m\ %w\ %h\ [FileType:\ %Y]\ [Linea:\ %l/%L\ (%p%%)]\ [Col:\ %v]</p>
</blockquote>
<p>In questo caso penso sia meglio spezzettare il comando in più parti:</p>
<blockquote>
<p>set statusline=</p>
</blockquote>
<p>Comunica a VIM che quello che segue dovrà essere il contenuto della barra di stato.</p>
<blockquote>
<p>%F</p>
</blockquote>
<p>Il nome del file, comprensivo del percorso.</p>
<blockquote>
<p>\ %m</p>
</blockquote>
<p>Il backslash ( \ ) serve solo per fare in modo che VIM scriva lo spazio successivo nella barra di stato e non lo interpreti come un separatore per tenere in ordine il codice, in gergo si dice che in questo caso il backslash è un carattere di "escape". Mentre il "%m" è il flag di modifica, se il file viene modificato, nella barra di stato comparirà un simbolo di questo tipo:</p>
<blockquote>
<p>[+]</p>
</blockquote>
<p>Così saprete se avete modificato il file.</p>
<p>Avanti col prossimo pezzo di comando:</p>
<blockquote>
<p>\ %r</p>
</blockquote>
<p>Uso ancora il backslash per far stampare lo spazio, mentre "%r" è il flag di sola lettura. Se il file aperto è di sola lettura nella barra di stato comparirà un simbolo come questo:</p>
<blockquote>
<p>[RO]</p>
</blockquote>
<p>Dove "RO" sta per Read-Only.</p>
<p>Via col prossimo pezzo:</p>
<blockquote>
<p>\ %w</p>
</blockquote>
<p>Dopo aver fatto stampare un altro spazio usiamo "%w" che fa in modo che venga mostrato il simbolo:</p>
<blockquote>
<p>[Preview]</p>
</blockquote>
<p>nel caso il file mostrato fosse un'anteprima.</p>
<p>Ora continuiamo con:</p>
<blockquote>
<p>\ %h</p>
</blockquote>
<p>Mostra nella barra di stato la scritta:</p>
<blockquote>
<p>[help]</p>
</blockquote>
<p>nel caso stessimo consultando il file d'aiuto di VIM.</p>
<p>Via uno, sotto un altro!</p>
<blockquote>
<p>\ [FileType:\ %Y]</p>
</blockquote>
<p>Dopo aver visualizzato un altro spazio, faccio scrivere la stringa:</p>
<blockquote>
<p>[Filetype:</p>
</blockquote>
<p>Poi visualizzo un altro spazio e con "%Y" faccio stampare a VIM il tipo di file aperto. Infine faccio stampare la parentesi chiusa.</p>
<p>Il prossimo!</p>
<blockquote>
<p>\ [Linea: %l/%L\ (%p%%)]</p>
</blockquote>
<p>Il concetto è esattamente lo stesso della parte precedente con la differenza che:</p>
<ul>
<li>%l - visualizza il numero della riga evidenziata</li>
<li>%L - visualizza il numero totale delle righe</li>
<li>%p - visualizza a che percentuale del documento è posizionato il cursore</li>
<li>%% - visualizza semplicemente il segno %</li>
</ul>
<p>Come prima ho usato il backslash ( \ ) per visualizzare tutti gli spazi necessari, altrimenti il tutto verrebbe orribilmente condensato. Continuiamo con l'ultima parte del comando:</p>
<blockquote>
<p>\ [Col:\ %v]</p>
</blockquote>
<p>La flag %v visualizza il numero di carattere evidenziato nella riga corrente, insieme al numero di riga permette di avere le coordinate precise del nostro cursore.</p>
<p>Alla fine della fiera, la vostra barra di stato sarà simile a questa:</p>
<blockquote>
<p>~/.vimrc [+] [RO] [FileType: VIM] [Linea: 1/16 (6%)] [Col: 1]</p>
</blockquote>
<p>Beh, non avrete questo risultato immediatamente. Dovrete prima chiudere e salvare il file, quando avvierete di nuovo VIM, vi ritroverete con un'interfaccia un po' diversa da prima.</p>
<p>Con questo per ora abbiamo finito.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Dizionari sempre sotto mano , gratis, con Lingoes2012-09-14T00:00:00+02:002012-09-14T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-14:/gratis-sul-web/dizionari-sempre-sotto-mano-gratis-con-lingoes.html<p>Dizionari, traduzioni e molto altro sempre sotto mano, gratis, basta scaricare Lingoes!</p><h1>Dizionari, traduzioni e molto altro sempre sotto mano, gratis, basta scaricare Lingoes!</h1>
<p>Buongiorno, oggi vi voglio presentare un software molto utile per gli studenti; si tratta di Lingoes; un programma che permette di avere a disposizione una miriade di dizionari di inglese, francese, tedesco, cinese, coreano, ucraino, greco, arabo, vietnamese e chi più ne ha, più ne metta.</p>
<p>Oltre ai dizionari, Lingoes offre anche un'interfaccia rapida per servizi di traduzione come google translator e supporta la traduzione diretta della parola che si trova sotto il cursore con firefox, IE e chrome. Inoltre supporta la ricerca in Wikipedia e la pronuncia esatta della parola.</p>
<p>Tra i dizionari scaricabili gratis troveremo anche nomi importanti:</p>
<ul>
<li>Longman Dictionary of Contemporary English 4th Edition</li>
<li>Zanichelli Italian Dictionary</li>
</ul>
<p>Potete scaricare il programma da questo <a href="www.lingoes.net">link</a></p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Le basi di VI (Improved) - Parte Terza2012-09-13T00:00:00+02:002012-09-13T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-13:/misc/VIM3.html<p>Vediamo quali funzioni VI riserva per i programmatori e impariamo a sfruttarle.</p><h1>Vediamo quali funzioni VI riserva per i programmatori e impariamo a sfruttarle.</h1>
<p>Buongiorno, oggi impareremo come usare altre funzioni di VI, particolarmente utili per i programmatori.</p>
<p>Se siete dei programmatori avrete sicuramente avuto a che fare con uno di questi messaggi:</p>
<blockquote>
<p>File "progetto.py", line 526</p>
<p>prin "prova"</p>
<p>^</p>
<p>SyntaxError, invalid syntax</p>
</blockquote>
<p>è sicuramente scomodo contare fino alla cinquecentoventiseiesima riga, allora possiamo inserire nell'interfaccia la numerazione delle righe; in command mode scriviamo:</p>
<blockquote>
<p>:set number</p>
</blockquote>
<p>E magicamente compariranno i numeri di riga. Se trovate scomodo anche semplicemente scorrere fino alla riga 526 possiamo arrivarci in un baleno in questo modo:</p>
<blockquote>
<p>[5][2][6][g][g]</p>
</blockquote>
<p>è sufficiente quindi digitare il numero della riga e premere 2 volte "g" per passare subito a correggere l'errore.</p>
<p>Quando le righe sono tante è estremamente semplice confondersi e modificare un'altra riga, per annullare il cambiamento basta una semplice mossa: in command mode premiamo</p>
<blockquote>
<p>[u]</p>
</blockquote>
<p>"u" sta per "undo" (annulla), quindi conoscendo un minimo di inglese molti pulsanti sono semplici da ricordare. Per evitare di confondere riga nuovamente possiamo inserire questo comando:</p>
<blockquote>
<p>:set cursorline</p>
</blockquote>
<p>E VIM avrà la premura di evidenziare la riga selezionata in modo abbastanza evidente.</p>
<p>Nel corso del vostro progetto potrebbe essere utile eseguire dei comandi bash (per esempio per vedere il nome di un file da linkare); invece di chiudere VI, eseguire il comando per poi riaprire il vostro editor potete:</p>
<blockquote>
<p>:!<comando></p>
</blockquote>
<p>Un esempio potrebbe essere:</p>
<blockquote>
<p>:!ls -lha</p>
</blockquote>
<p>Per un attimo VIM sparirà per far posto all'output di "ls", premendo [invio] tornerete in VIM. Nel caso invece voleste che l'output del comando venga inserito nel vostro testo basta:</p>
<blockquote>
<p>:r!<comando></p>
</blockquote>
<p>Per esempio:</p>
<blockquote>
<p>:r!ls -lha</p>
</blockquote>
<p>"r" sta per "read"...Semplice, no?</p>
<p>Un'altra funzione che non tutti gli editor possiedono è il cosiddetto "folding" del codice, cioè la possibilità di ridurre numerose righe di codice in una sola riga rappresentativa, in modo da risparmiare spazio e avere maggior ordine senza che il progetto venga effettivamente modificato. Ecco un esempio pratico, per rendere più chiara la situazione:</p>
<div class="codehilite"><pre><span></span><code><span class="k">def</span> <span class="nf">Funzione</span><span class="p">:</span>
<span class="nb">print</span> <span class="s2">"Questa è una funzione lunga"</span>
<span class="nb">print</span> <span class="mi">1</span><span class="o">+</span><span class="mi">1</span>
<span class="nb">print</span> <span class="s2">"Questa è un'altra riga di codice"</span>
<span class="nb">print</span> <span class="s2">"Ancora una riga"</span>
<span class="nb">print</span> <span class="s2">"Così dovrebbe bastare</span>
<span class="k">def</span> <span class="nf">AltraFunzione</span><span class="p">:</span>
<span class="nb">print</span> <span class="s2">"Questa è un'altra funzione"</span>
</code></pre></div>
<p>Entriamo in visual mode:</p>
<blockquote>
<p>[v]</p>
</blockquote>
<p>Ed evidenziamo la funzione da ridurre, con le frecce direzionali o i tasti [h][j][k][l]. In questo caso selezioniamo tutto il metodo "Funzione", intestazione inclusa; Poi operiamo il folding con:</p>
<blockquote>
<p>[z][f]</p>
</blockquote>
<p>E otterremo:</p>
<div class="codehilite"><pre><span></span><code><span class="o">+--</span> <span class="mi">6</span> <span class="n">lines</span><span class="p">:</span> <span class="k">def</span> <span class="nf">Funzione</span><span class="p">:</span><span class="o">----------------------------------------</span>
<span class="k">def</span> <span class="nf">AltraFunzione</span><span class="p">:</span>
<span class="nb">print</span> <span class="s2">"Questa è un'altra funzione"</span>
</code></pre></div>
<p>Per riaprire il fold basta andare sulla riga da riaprire e premere</p>
<blockquote>
<p>[z][o]</p>
</blockquote>
<p>Per richiuderlo basta essere su una qualsiasi riga che appartiene al fold e premere:</p>
<blockquote>
<p>[z][c]</p>
</blockquote>
<p>Come ho già detto il folding è una funzione che agisce sull'interfaccia: anche se nell'esempio precedente si vedono solo 3 righe, le righe effettivamente scritte restano otto.</p>
<p>E con questo abbiamo finito anche oggi. Saluti e al prossimo post!</p>
<p>Penaz</p>Controllo di Versione - Impariamo le basi di GIT2012-09-11T00:00:00+02:002012-09-11T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-11:/misc/GIT.html<p>Impariamo insieme come usare GIT, il famoso sistema di controllo versione usato anche per il kernel Linux.</p><h1>Impariamo insieme come usare GIT, il famoso sistema di controllo versione usato anche per il kernel Linux.</h1>
<p><strong>Questo articolo fornisce solamente delle prime basi per un uso molto limitato di GIT, se volete usarlo più proficuamente fate riferimento al <a href="http://git-scm.com/">Sito Ufficiale</a></strong></p>
<p>GIT è un sistema di controllo versione distribuito, molto utile se si è programmatori e si vuole aggiungere una nuova funzionalità al proprio applicativo, ma non solo. GIT è in grado di risparmiarvi molti mal di testa, basta usarlo correttamente. Iniziamo!</p>
<p>Portiamoci nella cartella dove è contenuto il progetto:</p>
<div class="codehilite"><pre><span></span><code><span class="err">cd Progetto</span>
</code></pre></div>
<p>Siccome è la prima volta che usiamo GIT, dobbiamo prima inizializzarlo:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git init</span>
</code></pre></div>
<p>Il programma risponderà prontamente:</p>
<div class="codehilite"><pre><span></span><code><span class="err">Initialized empty Git repository in /home/penaz/Progetto/.git</span>
</code></pre></div>
<p>Bene, abbiamo inizializzato il tutto. Ora siamo nel ramo principale (detto "master"), ora dobbiamo dire all'applicazione quali file tracciare. Vediamo lo stato attuale con:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git status</span>
</code></pre></div>
<p>E otterremo:</p>
<div class="codehilite"><pre><span></span><code><span class="err"># On branch master</span>
<span class="err">#</span>
<span class="err"># Initial commit</span>
<span class="err">#</span>
<span class="err"># Untracked Files:</span>
<span class="err"># (use "git add <file>..." to include in what will be committed)</span>
<span class="err">#</span>
<span class="err"># func.py</span>
<span class="err"># lib.py</span>
<span class="err"># main.py</span>
<span class="err">nothing added to commit but untracked files present (use "git add" to track)</span>
</code></pre></div>
<p>Ecco cosa ci dice il programma:</p>
<div class="codehilite"><pre><span></span><code><span class="err"># On branch master</span>
</code></pre></div>
<p>Siamo nel ramo principale</p>
<div class="codehilite"><pre><span></span><code><span class="err"># Untracked Files:</span>
<span class="err"># (use "git add <file>..." to include in what will be committed)</span>
<span class="err">#</span>
<span class="err"># func.py</span>
<span class="err"># lib.py</span>
<span class="err"># main.py</span>
</code></pre></div>
<p>e un elenco dei file non tracciati. Ora andremo ad aggiungere i 3 file all'elenco dei file tracciati:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git add func.py lib.py main.py</span>
</code></pre></div>
<p>Guardiamo come cambia lo stato di tracciamento:</p>
<div class="codehilite"><pre><span></span><code><span class="err">penaz@PenazMW ~/Progetto > git status</span>
</code></pre></div>
<div class="codehilite"><pre><span></span><code><span class="err"># On branch master</span>
<span class="err">#</span>
<span class="err"># Initial commit</span>
<span class="err">#</span>
<span class="err"># Changes to be committed:</span>
<span class="err"># (use "git rm --cached <file>..." to unstage)</span>
<span class="err">#</span>
<span class="err"># new file: func.py</span>
<span class="err"># new file: lib.py</span>
<span class="err"># new file: main.py</span>
</code></pre></div>
<p>Ora "untracked files" è diventato "changes to be committed" cioè i file sono nell'elenco di quelli da tracciare, ma è necessario salvare le modifiche, si può usare il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git commit <NomeFile1> <NomeFile2> ...</span>
</code></pre></div>
<p>Nel mio caso voglio salvare le modifiche a tutti i files:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git commit -a</span>
</code></pre></div>
<p>Si aprirà NANO (o ciò che è settato come vostro editor preferito) e dovrete inserire un commento che vi permetterà di identificare il cambiamento apportato, il commento è obbligatorio altrimenti i cambiamenti non verranno salvati. GIT risponderà così:</p>
<div class="codehilite"><pre><span></span><code><span class="o">[</span><span class="n">master (root-commit) 4d01531</span><span class="o">]</span><span class="w"> </span><span class="n">Prova</span><span class="w"></span>
<span class="nl">Committer</span><span class="p">:</span><span class="w"> </span><span class="n">Penaz</span><span class="w"> </span><span class="o"><</span><span class="n">penaz</span><span class="nv">@PenazMW</span><span class="p">.</span><span class="n">PenazNet</span><span class="o">></span><span class="w"></span>
<span class="n">Your</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">email</span><span class="w"> </span><span class="n">address</span><span class="w"> </span><span class="n">were</span><span class="w"> </span><span class="n">configured</span><span class="w"> </span><span class="n">automatically</span><span class="w"> </span><span class="n">based</span><span class="w"></span>
<span class="k">on</span><span class="w"> </span><span class="n">your</span><span class="w"> </span><span class="n">username</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">hostname</span><span class="p">.</span><span class="w"> </span><span class="n">Please</span><span class="w"> </span><span class="k">check</span><span class="w"> </span><span class="n">that</span><span class="w"> </span><span class="n">they</span><span class="w"> </span><span class="k">are</span><span class="w"> </span><span class="n">accurate</span><span class="p">.</span><span class="w"></span>
<span class="n">You</span><span class="w"> </span><span class="n">can</span><span class="w"> </span><span class="n">suppress</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">setting</span><span class="w"> </span><span class="n">them</span><span class="w"> </span><span class="nl">explicitly</span><span class="p">:</span><span class="w"></span>
<span class="n">git</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="c1">--global user.name "Your Name"</span>
<span class="n">git</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="c1">--global user.email you@example.com</span>
<span class="k">After</span><span class="w"> </span><span class="n">doing</span><span class="w"> </span><span class="n">this</span><span class="p">,</span><span class="w"> </span><span class="n">you</span><span class="w"> </span><span class="n">may</span><span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">identity</span><span class="w"> </span><span class="n">used</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="k">commit</span><span class="w"> </span><span class="k">with</span><span class="err">:</span><span class="w"></span>
<span class="n">git</span><span class="w"> </span><span class="k">commit</span><span class="w"> </span><span class="c1">--amend --reset-author</span>
<span class="mi">0</span><span class="w"> </span><span class="n">files</span><span class="w"> </span><span class="n">changed</span><span class="w"></span>
<span class="k">create</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="mi">100644</span><span class="w"> </span><span class="n">func</span><span class="p">.</span><span class="n">py</span><span class="w"></span>
<span class="k">create</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="mi">100644</span><span class="w"> </span><span class="n">lib</span><span class="p">.</span><span class="n">py</span><span class="w"></span>
<span class="k">create</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="mi">100644</span><span class="w"> </span><span class="n">main</span><span class="p">.</span><span class="n">py</span><span class="w"></span>
</code></pre></div>
<p>Verifichiamo nuovamente lo stato del tracciamento:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git status</span>
</code></pre></div>
<p>Ottenendo:</p>
<div class="codehilite"><pre><span></span><code><span class="err"># On branch master nothing to commit (working directory clean)</span>
</code></pre></div>
<p>Missione compiuta! Abbiamo salvato i cambiamenti.</p>
<p>E se volessimo scartare i cambiamenti fatti? Semplice:</p>
<div class="codehilite"><pre><span></span><code><span class="err">git stash</span>
</code></pre></div>
<p>Se volessimo creare una nuova funzione sperimentale nel programma senza intaccare il progetto originale (magari funzionante)? Basta creare una diramazione del progetto (un "branch"):</p>
<div class="codehilite"><pre><span></span><code><span class="err">git branch "Nuova_Funzione"</span>
</code></pre></div>
<p>E poi passare al branch appena creato:</p>
<div class="codehilite"><pre><span></span><code><span class="n">git</span> <span class="n">checkout</span> <span class="ss">"Nuova_Funzione"</span>
<span class="n">Switched</span> <span class="k">to</span> <span class="n">branch</span> <span class="s1">'Nuova_Funzione'</span>
</code></pre></div>
<p>Per poi modificare il tutto come abbiamo fatto prima. Ora ci sono 2 possibilità:</p>
<ul>
<li>La nuova parte funziona a dovere e vogliamo integrarla nel ramo principale</li>
<li>La nuova parte non funziona e vogliamo scartarla.</li>
</ul>
<p>In ogni caso, partiamo dallo stesso punto: tornare al branch master:</p>
<div class="codehilite"><pre><span></span><code><span class="n">git</span> <span class="n">checkout</span> <span class="n">master</span>
<span class="n">Switched</span> <span class="k">to</span> <span class="n">branch</span> <span class="s1">'master'</span>
</code></pre></div>
<p>Se vogliamo integrare la funzione nel branch master si usa il seguente comando:</p>
<div class="codehilite"><pre><span></span><code><span class="n">git</span> <span class="n">merge</span> <span class="ss">"Nuova_Funzione"</span>
<span class="n">Updating</span> <span class="mi">4</span><span class="n">d01531</span><span class="p">..</span><span class="mi">19</span><span class="n">cc9dd</span>
<span class="n">Fast</span><span class="o">-</span><span class="k">forward</span>
<span class="n">main</span><span class="p">.</span><span class="n">py</span> <span class="o">|</span> <span class="mi">1</span> <span class="o">+</span>
<span class="mi">1</span> <span class="n">file</span> <span class="n">changed</span><span class="p">,</span> <span class="mi">1</span> <span class="n">insertion</span><span class="p">(</span><span class="o">+</span><span class="p">)</span>
</code></pre></div>
<p>Se invece volessimo rimuovere il branch (-D sta per Delete):</p>
<div class="codehilite"><pre><span></span><code><span class="n">git</span> <span class="n">branch</span> <span class="o">-</span><span class="n">D</span> <span class="ss">"Nuova_Funzione"</span>
<span class="n">Deleted</span> <span class="n">branch</span> <span class="n">Nuova_Funzione</span> <span class="p">(</span><span class="n">was</span> <span class="mi">19</span><span class="n">cc9dd</span><span class="p">).</span>
</code></pre></div>
<p>Ovviamente Git ha molte altre funzioni, ma queste sono quelle di base.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Le Basi di VI (Improved) - Parte Seconda2012-09-10T00:00:00+02:002012-09-10T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-10:/misc/VIM2.html<p>Qualche uso un po' più avanzato di VIM, il famoso editor compatibile con VI</p><h1>Qualche uso un po' più avanzato di VIM, il famoso editor compatibile con VI</h1>
<p>Nella <a href="https://penazarea.altervista.org/misc/VIM1.html">Puntata Scorsa</a> abbiamo visto come orientarci in VI: come scrivere, cancellare e modificare il testo. Facciamo un riassuntino:</p>
<ul>
<li>[a] - Append: entra in "insert mode" e inizia a scrivere dal carattere successivo a quello evidenziato;</li>
<li>[i] - Insert: entra in "insert mode" e inizia a scrivere dal carattere evidenziato;</li>
<li>[v] - Visual: entra in "visual mode" permettendo di selezionare del testo;</li>
<li>[y] - Yank: se usato in "visual mode" permette di copiare il testo selezionato;</li>
<li>[x] - Cut: se usato in "visual mode" permette di tagliare il testo selezionato;</li>
<li>[p] - Paste: incolla il testo precedentemente tagliato o copiato</li>
<li>[ESC] - Esci dalla modalità corrente</li>
<li>[o] - Crea una nuova riga al di sotto di quella selezionata</li>
<li>[d][d] - Cancella la riga evidenziata</li>
<li>:q! - Esce ignorando i cambiamenti</li>
<li>:w - Salva</li>
<li>: x - Salva ed esci</li>
</ul>
<p>In questa parte impareremo a muoverci più velocemente che non con le sole freccette, in questo campo VI presenta alcune sorprese; iniziamo aprendo VIM:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vim</span>
</code></pre></div>
<p>E digitiamo qualcosa:</p>
<blockquote>
<p>[a]</p>
<p>Ecco un testo scritto in VI, un ottimo editor di testo dedicato a programmatori e non solo.</p>
<p>Questa è un'altra riga di testo.</p>
<p>Ecco a voi una terza riga di testo da usare.</p>
</blockquote>
<p>Se volessimo andare a scrivere proprio tra le parole "testo" e "dedicato" della prima riga? Potremmo tenere premuta la freccetta destra fino ad arrivare alla parola cercata oppure usare:</p>
<blockquote>
<p>[w]</p>
</blockquote>
<p>Tante volte quante servono per arrivare alla parola cercata, il tasto [w] serve per spostarsi di parola in parola, quindi il nostro cursore salterà da "Ecco" passando per "un", "testo" ... fino ad arrivare dove ci serve. Se usiamo invece [Shift+W] potremo saltare da una macro-parola all'altra.</p>
<p>Infatti VI distingue le parole contenute ad esempio in "fast-food", evidenziando prima "fast" e poi "food", mentre se usiamo [Shift+W] il cursore verrà portato all'inizio di "fast-food" per poi essere portato direttamente alla parola successiva.</p>
<p>Ecco un esempio usando solo il tasto [w]:</p>
<blockquote>
<p>Ho sentito di un ottimo fast-food presente nei paraggi</p>
<p>[5 volte w]</p>
<p>Ho sentito di un ottimo |fast-food presente nei paraggi</p>
<p>[w]</p>
<p>Ho sentito di un ottimo fast|-food presente nei paraggi</p>
</blockquote>
<p>e uno con [Shift+W]:</p>
<blockquote>
<p>Ho sentito di un ottimo fast-food presente nei paraggi</p>
<p>[5 volte Shift+w]</p>
<p>Ho sentito di un ottimo |fast-food presente nei paraggi</p>
<p>[Shift+W]</p>
<p>Ho sentito di un ottimo fast-food |presente nei paraggi</blockquote></p>
</blockquote>
<p>Il giochino funziona anche con le cancellazioni: se usiamo [d] e premiamo un tasto direzionale avremo:</p>
<blockquote>
<p>parola |da cancellare</p>
<p>[d][Freccia destra]</p>
<p>parola |a cancellare</p>
</blockquote>
<p>mentre se useremo [d] e [w] avremo:</p>
<blockquote>
<p>un |fast-food da cancellare</p>
<p>[d][w]</p>
<p>un |-food da cancellare</p>
</blockquote>
<p>e se useremo [Shift+W] avremo:</p>
<blockquote>
<p>un |fast-food da cancellare</p>
<p>[d][Shift+W]</p>
<p>un | da cancellare</p>
</blockquote>
<p>In VI è possibile anche cercare in maniera abbastanza veloce all'interno del documento, assicuriamoci di essere in command mode (nessuna scritta nella barra di stato) e digitiamo</p>
<blockquote>
<p>/Paroladacercare [invio]</p>
</blockquote>
<p>E verranno evidenziate subito tutte le occorrenze della parola cercata, mentre il cursore sarà portato sulla prima occorrenza più vicina, per passare alla prossima occorrenza usiamo:</p>
<blockquote>
<p>[n]</p>
</blockquote>
<p>In VI possiamo anche effettuare sostituzioni in maniera abbastanza semplice, usando il comando:</p>
<blockquote>
<p>:s/Paroladasostituire/Parola/Flag</p>
</blockquote>
<p>Perciò se noi scriviamo:</p>
<blockquote>
<p>:s/Ciao/Buongiorno</p>
</blockquote>
<p>La prima occorrenza della parola "Ciao" sarà sostituita con "Buongiorno". Se invece scriviamo:</p>
<blockquote>
<p>:s/Ciao/Buongiorno/g</p>
</blockquote>
<p>Tutte le occorrenze della parola "Ciao" nella riga selezionata saranno sostituite con "Buongiorno". Questo è ovviamente un uso estremamente basilare della funzione.</p>
<p>Per ora è tutto. Chiudiamo VI con</p>
<blockquote>
<p>:q!</p>
</blockquote>
<p>Buon editing! Saluti e al prossimo post!</p>
<p>Penaz</p>Le basi di VI (Improved)2012-09-07T00:00:00+02:002012-09-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-07:/misc/VIM1.html<p>Impariamo insieme le basi del famoso editor di testo VI portando a termine un piccolo progetto.</p><h1>Impariamo insieme le basi del famoso editor di testo VI portando a termine un piccolo progetto.</h1>
<p>Buongiorno a tutti, oggi come ho promesso in <a href="https://penazarea.altervista.org/misc/Notepad.html">questo articolo</a> darò un po' di consigli per cominciare ad usare il famoso editor di testo VIM.</p>
<p>Prima di tutto, una legenda:</p>
<ul>
<li>[bottone] - Premi il tasto "bottone" sulla tastiera</li>
<li>penaz@PenazMW ~ > comando - Digita "comando" in Bash</li>
</ul>
<p>Noi andremo ad usare VIM, un editor più moderno e compatibile al 99,9% con quello che ai tempi era VI.</p>
<p>Iniziamo aprendo VIM:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vim</span>
</code></pre></div>
<p>Ci ritroveremo davanti l'interfaccia dell'editor, ma se inizieremo a scrivere qualcosa sentiremo probabilmente una serie di beep senza vedere alcun cambiamento nello schermo, per iniziare a scrivere dovremo entrare nella modalità inserimento; per entrarci abbiamo due possibilità:</p>
<ul>
<li>a - Append, inizia l'inserimento dopo il carattere selezionato</li>
<li>i - Insert, inizia l'inserimento dal carattere corrente</li>
</ul>
<p>Ovviamente, partendo da un documento vuoto i due pulsanti svolgono esattamente la stessa funzione, perciò:</p>
<blockquote>[a]</blockquote>
<p>VIM risponderà prontamente scrivendo nella barra di stato:</p>
<blockquote>-- insert --</blockquote>
<p>Ora siamo pronti a digitare, scriviamo la seguente stringa:</p>
<blockquote>Salve! Questa è la mia prima stringa in VI.</blockquote>
<p>E vedremo la stringa comparire sullo schermo, proseguiamo con:</p>
<blockquote>[invio]
Questa è una stringa molto lunga.</blockquote>
<p>Vedremo sul nostro schermo:</p>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa molto lunga.</blockquote>
<p>Usciamo dalla modalità inserimento:</p>
<blockquote>[ESC]</blockquote>
<p>Ora siamo tornati nel "command mode" e VIM sta aspettando un nuovo comando, ora impareremo come tagliare, copiare e incollare un testo: usando le frecce direzionali spostiamo il cursore poco prima di "molto":</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa <span style="color: #ff0000;">|</span>molto lunga.</blockquote>
</blockquote>
<p>Ora entriamo nel cosiddetto "visual mode":</p>
<blockquote>[v]</blockquote>
<p>Ovviamente VIM risponderà nella barra di stato:</p>
<blockquote>-- visual --</blockquote>
<p>Premiamo la freccetta destra fino ad evidenziare la parola "molto" e lo spazio che la segue:</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa <span style="color: #ff0000;">molto</span> lunga.</blockquote>
</blockquote>
<p>Ora abbiamo due possibilità:</p>
<ul>
<li>x - Cut, il classico strumento taglia.</li>
<li>y - Yank, corrisponde a copia</li>
</ul>
<p>Noi andremo a copiare il testo per poi uscire dalla modalità visuale:</p>
<blockquote>[y]
[ESC]</blockquote>
<p>Posizioniamo il cursore dopo lo spazio che segue la parola "molto":</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa molto <span style="color: #ff0000;">|</span>lunga.</blockquote>
</blockquote>
<p>E usiamo il tasto P (paste) per incollare un po' di testo:</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa molto molto lunga.</blockquote>
</blockquote>
<p>Facciamo la stessa cosa con delle stringhe di testo più grandi, iniziamo creando una nuova riga; potremmo entrare in modalità insert, spostarci alla fine dell'ultima riga e premere invio, oppure posizionarci sull'ultima riga (non importa quale carattere) e:</p>
<blockquote>[o]</blockquote>
<p>Ora entriamo in modalità visuale ed evidenziamo tutta l'ultima riga:</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
<span style="color: #ff0000;">Questa è una stringa molto molto lunga.</span></blockquote>
</blockquote>
<p>Copiamola e incolliamola un paio di volte:</p>
<blockquote>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa molto molto lunga.
Questa è una stringa molto molto lunga.
Questa è una stringa molto molto lunga.</blockquote>
</blockquote>
<p>Tutto questo per poi... Eliminarle. Potremmo entrare nella modalità inserimento eccetera eccetera... oppure spostare il cursore sulla riga da eliminare e:</p>
<blockquote>[ESC]
[d][d]</blockquote>
<p>Così elimineremo una riga, ripetiamo il procedimento e ci ritroveremo allo stesso punto di prima:</p>
<blockquote>Salve! Questa è la mia prima stringa in VI.
Questa è una stringa molto molto lunga.</blockquote>
<p>A questo punto possiamo scegliere cosa farne del nostro file:</p>
<ul>
<li>: x Primo.txt - Salva il file come "Primo.txt" ed esce.</li>
<li>:q! - Esci ed ignora tutte le modifiche</li>
<li>:w Primo.txt - Salva come "Primo.txt" ma non uscire.</li>
</ul>
<p>Se volessimo fare delle modifiche per poi salvarle nello stesso file basta solo:</p>
<ul>
<li>:w - Salva</li>
<li>: x - Salva ed esci</li>
</ul>
<p>Nel nostro caso scarteremo il file appena creato:</p>
<blockquote>:q!</blockquote>
<p>Questa guida non è completa, mancano i metodi per spostarsi velocemente di parola in parola. Prendetelo come un'infarinatura di questo fantastico editor di testo da usare in caso di emergenza.Infatti, al contrario di "nano" o altri editor, VI è presente in qualunque distro di linux, sia essa ubuntu, arch, debian o slackware.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Notepad - Non solo un semplice blocco appunti2012-09-06T00:00:00+02:002012-09-06T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-06:/misc/Notepad.html<p>Piccoli trucchetti per notepad ed alcune alternative se volete sostituirlo.</p><h1>Piccoli trucchetti per notepad ed alcune alternative se volete sostituirlo.</h1>
<p>Buongiorno, oggi parliamo di notepad. Il famoso blocco note da sempre incluso in Windows. Notepad è un programma praticamente privo di funzioni di rilievo: non potete formattare il testo, nè colorarlo, tantomeno farci dei disegnini. Ma è sicuramente uno strumento estremamente veloce per scrivere delle annotazioni e per leggere piccoli files. Col trucchetto di oggi potrete creare un piccolo diario con notepad, ecco come:</p>
<p>Aprite un nuovo file e come prima riga scrivete:</p>
<blockquote>
<p>.LOG</p>
</blockquote>
<p>premete invio per andare alla riga successiva e poi salvate il file come fareste di solito, con l'estensione *.txt. La prossima volta che aprirete il file vi ritroverete con questo testo:</p>
<blockquote>
<p>.LOG</p>
<p>11:19 05/09/2012</p>
</blockquote>
<p>Ogni volta che andrete ad aprire il file, notepad aggiungerà automaticamente ora e data dell'apertura, utile nel caso siate dei programmatori e vogliate creare dei file di log.</p>
<p>Se volete avere qualche funzione in più potete provare uno di questi programmi, estremamente veloci ed efficienti:
- <a href="http://notepad-plus-plus.org/download/">Notepad++</a>, ottimo editor di testo dedicato principalmente ai programmatori.
- <a href="http://www.scintilla.org/SciTEDownload.html">SciTE</a>, Abbreviazione di Scintilla Text Editor, famosissimo editor di testo dedicato ai programmatori.
- <a href="http://www.flos-freeware.ch/notepad2.html">Notepad2</a>, un piccolo sostituto di notepad con qualche funzione in più.</p>
<p>Queste alternative di offriranno funzioni come:</p>
<ul>
<li>Navigazione fra i file a schede;</li>
<li>Evidenziazione della sintassi per molti codici di programmazione;</li>
<li>Folding di parti di codice, funzione che vi permette di comprimere il codice, visualizzando solo la testata, per rendere il tutto più leggibile.</li>
<li>Molto altro che non sto qui a citare.</li>
</ul>
<p>Se invece siete utenti di linux non posso far altro che consigliarvi VI, nella sua edizione "improved", conosciuta anche come VIM, il programma è decisamente un po' ostico all'inizio, ma che dopo una piccola sessione di apprendimento dà molte soddisfazioni. Entro qualche giorno vi proporrò una piccola guida per apprenderne le basi.</p>
<p>Questo è tutto, saluti e al prossimo post!</p>
<p>Penaz</p>Live CD per ripristinare il vostro sistema2012-09-04T00:00:00+02:002012-09-04T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-09-04:/gratis-sul-web/LiveCD.html<p>Alcune live cd per rimettere in sesto il vostro sistema, e alcuni consigli per usarle.</p><h1>Alcune live cd per rimettere in sesto il vostro sistema, e alcuni consigli per usarle.</h1>
<p>Buongiorno, il vostro PC è andato KO e non sapete che cosa sia successo? Schermate blu costellano le vostre giornate? Volete verificare lo stato di salute del vostro sistema?</p>
<p>Allora siete nel posto giusto! Oggi vi propongo un po' di distribuzioni live con cui potrete analizzare il vostro sistema, ripristinare dati e fare test di vario tipo.</p>
<p>Iniziamo con <a href="http://www.ultimatebootcd.com/">UBCD (Ultimate Boot CD)</a>, una live un po' particolare: infatti appena inserita avvia un menu da cui potrete scegliere vari test, ve ne cito alcuni:</p>
<ul>
<li>Test di Burn-In per il processore;</li>
<li>Memtest86+ per testare le vostre memorie RAM;</li>
<li>Test di molti produttori di HD, e nel caso non ci fosse il vostro potete provare con ViVaRD, un test generico;</li>
<li>Programmi per l'identificazione delle periferiche;</li>
<li>Molto altro ancora.</li>
</ul>
<p>il tutto gira sotto FreeDOS, un'implementazione open-source di DOS, inoltre UBCD contiene una piccola distribuzione linux (PartedMagic) che vi consente di partizionare dischi e recuperare dati in maniera semplice e veloce, attraverso l'interfaccia grafica.</p>
<p>Se invece volete "sporcarvi le mani" con la linea di comando o avete bisogno di strumenti più potenti per le vostre esigenze, vi propongo il coltellino svizzero del sistemista: <a href="http://www.sysresccd.org/SystemRescueCd_Homepage">SysRescueCD</a>, una live basata su gentoo con cui potrete fare di tutto e di più:</p>
<ul>
<li>Recuperare dati dal disco fisso, anche se formattato;</li>
<li>Testare le vostre periferiche;</li>
<li>Navigare sul web, anche con la maggior parte delle internet key;</li>
<li>Molto altro che non sto qui a citare;</li>
</ul>
<p>Decisamente vale la pena di scaricare almeno una di queste due live, e se proprio avete fegato, perchè non creare la vostra "ultimate live" sostituendo partedmagic di UBCD con Sysrescue?</p>
<p>Infine, qualche piccolo consiglio per il test del vostro hardware nel caso il PC iniziasse a fare i capricci:
1. Testate le memorie RAM: qualunque distribuzione live scegliate gira su RAM, se i moduli sono danneggiati i risultati dei test seguenti potrebbero essere falsati.
2. Testate successivamente i dischi fissi: sono molto soggetti ad usura e quindi potrebbero essere la causa dei vostri problemi; usate possibilmente il programma fornito dal vostro produttore di HD (in UBCD li trovate praticamente tutti).
3. Per ultimo testate il processore: è un componente che difficilmente si rompe, ma come tutte le cose... Si rompe. Iniziate con qualche test semplice per poi passare ai test Burn-In; degli speciali test di resistenza in cui il processore è messo a dura prova allo scopo di generare calore. Se dopo poco tempo il vostro pc si blocca: resettatelo, entrate nel bios (Canc, ESC o F2 a seconda dei sistemi) e verificate la temperatura del processore nella scheda system monitor, se è molto alta (oltre 90-95°) verificate (o fate verificare) il vostro sistema di raffreddamento.</p>
<p>Questo è tutto. Saluti e al prossimo post!</p>
<p>Penaz</p>Votiamo ogni cosa, su ZooRate2012-08-30T00:00:00+02:002012-08-30T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-30:/misc/ZooRate.html<p>Presentazione di un sito da cui si può effettuare votazioni su praticamente ogni prodotto o servizio, con Zoorate!</p><h1>Presentazione di un sito da cui si può effettuare votazioni su praticamente ogni prodotto o servizio, con Zoorate!</h1>
<p>Buongiorno, oggi vi propongo un sito da cui potrete effettuare una votazione su ogni prodotto che vi capita sotto mano, sia esso cellulare, tablet, videogame, film, ecc... Il sito si chiama ZooRate, è ancora in fase beta, ma funziona abbastanza bene e consente di fasi un'idea della reale qualità di un prodotto prima di acquistarlo e, previa registrazione gratuita, permette di votare un prodotto che avete già acquistato.</p>
<p>Potete collegarvi direttamente a ZooRate da qui: <a href="http://www.zoorate.com/">Link</a></p>
<p>Buon Divertimento e buona votazione!</p>
<p>Saluti,</p>
<p>Penaz</p>Indietro nel tempo, sul web2012-08-29T00:00:00+02:002012-08-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-29:/misc/Internet_Archive.html<p>Vediamo come possiamo "viaggiare nel tempo" su internet, con alcuni link che vi propongo</p><p>Buongiorno a tutti, oggi dedico questo post a coloro che hanno bisogno di fare ricerche approfondite, nella fattispecie gli studenti, risparmiando possibilmente tempo e, perchè no, alterandone il flusso; ovviamente per quanto riguarda internet.</p>
<p>Quante volte è capitato di aver bisogno di informazioni importanti e ritrovarsi con un bell'errore 404 (pagina non trovata)?</p>
<p>Il famosissimo 404 non sempre è dovuto ad una errata digitazione dell'indirizzo, a volte (per incuria o per necessità) alcune pagine vengono cancellate.</p>
<p>Oggi perciò vi propongo un paio di link da cui potrete resuscitare queste pagine, il primo è la famosa "Internet WayBack Machine" dell'Internet Archive, basta inserire l'indirizzo nella barra di ricerca e sarete portati (se possibile) all'ultima visualizzazione valida di quella pagina. Lo trovate a questo <a href="http://archive.org/web/web.php">Link</a></p>
<p>Un'alternativa molto buona è usare la cache di google. Si può cercare nella cache di google in due modi:
- Digitare l'indirizzo nella casella di ricerca google e poi cliccare su cache
- Usare il seguente indirizzo http://google.com/search?q=cache:www.sitocercato.it dove al posto di www.sitocercato.it andrete a digitare la pagina scomparsa.</p>
<p>Questi siti mi sono stati di grande aiuto durante la stesura della mia "tesina" delle scuole superiori.</p>
<p>Spero di essere stato utile.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>MPD - Un server/player audio personalizzabile2012-08-28T00:00:00+02:002012-08-28T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-28:/misc/MPD.html<p>Vediamo come creare un player audio per resuscitare un vecchio PC con mpd ed ncmpcpp</p><h1>Vediamo come creare un player audio per resuscitare un vecchio PC con mpd ed ncmpcpp</h1>
<p>Buongiorno a tutti, il post di oggi è dedicato agli utenti linux che vogliono qualcosa in più per la propria musica, oggi vi presento una piccola guida a mpd (music player daemon).
Mpd è un demone che vi permette di riprodurre la vostra musica. È leggero, ma non per questo è povero di funzioni, anzi! Crossfading, riproduzione casuale e consuming, ripetizioni, supporto lyrics e molto altro!</p>
<p>Io uso gentoo, perciò uso emerge per scaricarmi il mio pacchetto:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge mpd</span>
</code></pre></div>
<p>Appena scaricato è necessario passare per un po' di configurazioni...
Il file da cercare è mpd.conf e si trova nella cartella /etc/ perciò lo apro col mio editor preferito.</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi /etc/mpd.conf</span>
</code></pre></div>
<p>Ora decommentiamo un po' di cose, queste linee permettono un funzionamento basilare, con un po' di tempo si possono attivare funzioni più avanzate, come la riproduzione via http. Vediamo cosa decommentare:</p>
<blockquote>
<p>music directory "/home/penaz/Documents/Sounds/Music</p>
<p>playlist directory "/home/penaz/Documents/Sounds/Music/PlayLists</p>
<p>db_file "/home/penaz/Documents/Sounds/Music/DB</p>
<p>log_file "/home/penaz/Documents/Sounds/Music/Log</p>
<p>[...]</p>
<p>state_file "/var/lib/mpd/state"</p>
<p>[...]</p>
<p>user "penaz"</p>
<p>[...]</p>
<p>auto_update "yes"</p>
<p>[...]</p>
<p>input{</p>
<p>plugin "curl"</p>
<p>}</p>
<p>[...]</p>
<p>audio_output{</p>
<p>type "alsa"</p>
<p>name "My ALSA Device"</p>
<p>}</p>
</blockquote>
<p>Ora avviate mpd:</p>
<div class="codehilite"><pre><span></span><code><span class="err">mpd</span>
</code></pre></div>
<p>Ora avete mpd pronto all'uso, ma vi serve qualcosa per gestirlo, se volete proprio risparmiare risorse usate ncmpcpp, un client ncurses. Scarichiamo il nostro frontend:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge ncmpcpp</span>
</code></pre></div>
<p>Controlliamone la configurazione:</p>
<div class="codehilite"><pre><span></span><code><span class="err">vi .ncmpcpp/config</span>
</code></pre></div>
<p>Controlliamo che sia presente la riga:</p>
<blockquote>
<p>mpd_host="localhost"</p>
</blockquote>
<p>Salviamo il tutto e avviamo il nostro frontend ncurses con il comando:</p>
<div class="codehilite"><pre><span></span><code><span class="err">ncmpcpp</span>
</code></pre></div>
<p>Ora avrete a che fare con un'interfaccia un po' spartana, ma abbastanza semplice, premete 1 (o F1) per accedere al menu di aiuto e potrete così comandare proficuamente mpd, resterete esterrefatti dal numero di funzioni presenti in un programma di riproduzione musicale.</p>
<p>In alternativa potete usare ario, un'interfaccia GTK simile a rithmbox con cui potete tranquillamente comandare mpd come un qualsiasi player. Per installarlo basta cercarlo nei repository ufficiali, nel mio caso basta un:</p>
<div class="codehilite"><pre><span></span><code><span class="err">emerge ario</span>
</code></pre></div>
<p>Alcune alternative a ncmpcpp e ario sono ad esempio cantata e sonata, dei client mpd in forte crescita nei tempi recenti.
Se volete usare un telefono android per comandare mpd, potete scaricare mpdroid dal market.</p>
<p>Saluti e al prossimo post!
Penaz</p>Alleniamoci un po'2012-08-24T00:00:00+02:002012-08-24T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-24:/misc/Palestra.html<p>Presentazione di un sito con tutto ciò che serve per sapere di più sugli argomenti palestra e attività fisica.</p><h1>Presentazione di un sito con tutto ciò che serve per sapere di più sugli argomenti palestra e attività fisica.</h1>
<p>Buongiorno, oggi vi presento un sito da cui potrete ricavare una miriade di informazioni su tutto ciò che riguarda l'attività fisica e la palestra in generale. Il sito si chiama alltrainer e potete navigarlo da questo <a href="http://www.alltrainer.it/">Link</a></p>
<p><strong>Attenzione:</strong> prima di iniziare qualsivoglia attività fisica è consigliabile parlarne col proprio medico curante che sicuramente saprà indirizzarvi in maniera corretta, inoltre consiglio, se possibile, di parlare col proprio personal trainer prima di fare esercizi nuovi, in modo da poterli eseguire in maniera corretta, efficace e senza il rischio di <em>farsi male seriamente</em>.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Mono - Giocare Coi Colori2012-08-23T00:00:00+02:002012-08-23T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-23:/gratis-sul-web/Mono.html<p>Un po' asteroids, un po' paint. Scopriamo Mono.</p><p>Buongiorno,</p>
<p>anche oggi per la sezione "giochi" vi presento un videogame con cui potrete passare qualche decina di minuti di svago. Il gioco si chiama Mono ed è stato concepito per provare nuovi sistemi di conteggio punti. Mono ha due modalità di gioco: bianco e nero, che definiranno il colore dello schermo da cui partirete. Il vostro obiettivo è distruggere i cerchietti e colorare il vostro schermo, passando dal bianco al nero o viceversa. I cerchietti varieranno le loro azioni a seconda del colore su cui stanno passando, rendendo il gioco abbastanza divertente.</p>
<p>Lo trovate qui: <a href="http://www.binaryzoo.com/mono_page/">Vai alla pagina di Mono</a></p>
<p>Buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Echoes+ - Un Asteroids Psichedelico2012-08-22T00:00:00+02:002012-08-22T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-22:/gratis-sul-web/Echoes.html<p>Da binaryzoo, un altro gioco retro con grafica fantastica e gameplay semplice ma accattivante</p><p>Buongiorno, anche oggi per la sezione "giochi" vi presento uno shooter in 2D che ricorda molto da vicino Asteroids e Geometry Wars. Il gioco si chiama Echoes+ e proprio come DuoTris e DUO fa degli effetti speciali il suo cavallo di battaglia. Semplice nel concetto ma estremamente coinvolgente, questo gioco comprende anche tre powerup: potenziamento cannoni, health-pack ed un colpo che spara proiettili in ogni direzione.</p>
<p>Il gioco si articola in soli 10 livelli, ma vi posso assicurare che è molto difficile arrivarci. Inoltre ci sono gli ZOOT, degli archievements con cui potete sbloccare la modalità "crack", tutta da provare.</p>
<p>Ancora una volta ringrazio BinaryZoo Studios.</p>
<p>Lo potete trovare qui: <a href="http://www.binaryzoo.com/echoesplus_page/">Vai Alla pagina di Echoes+</a></p>
<p>Inoltre il gioco può essere scaricato gratuitamente su Steam.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Firewall - Verifichiamo quanto siamo al sicuro2012-08-21T00:00:00+02:002012-08-21T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-21:/misc/Firewall-Test.html<p>Vediamo come verificare il grado di sicurezza del nostro firewall</p><p>Salve, Avete appena settato un firewall e volete essere sicuri che tutto funzioni a dovere? Allora vi propongo un link che fa proprio al caso vostro.</p>
<p>Gibson Research Corporation propone una applicazione web che permette di testare le vostre porte. Alla fine del test le porte avranno 3 stati: aperta (rosso), chiusa (blu), invisibile (verde), in caso di porte aperte state attenti: siete esposti ad eventuali attacchi. Se invece avete molte porte chiuse siete mediamente al sicuro: non è possibile accedere direttamente al vostro pc, ma siete individuabili, perciò potreste essere vulnerabili ad attacchi più complessi. Se tutte le porte sono verdi allora siete invisibili, non è il 100% della sicurezza (non si è mai sicuri al 100%) ma è un grande aiuto.</p>
<p>Una situazione particolare è data dalle prime porte che risultano per la maggior parte chiuse e alcune aperte, mentre di punto in bianco le porte successive diventano invisibili. Si tratta di un adattamento del firewall, quando si ricevono molte richieste il firewall entra in modalità stealth. Quindi il firewall funziona, anche se sarebbe meglio navigare sempre in tale modalità: controllate le impostazioni.</p>
<p>Fate una scansione a questo <a href="https://www.grc.com/x/ne.dll?bh0bkyd2">Link</a></p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Monitoriamo la nostra classe politica con OpenParlamento2012-08-21T00:00:00+02:002012-08-21T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-21:/misc/monitoriamo-la-nostra-classe-politica-con-openparlamento.html<p>Presentazione di Open Parlamento, un portale che ci permette di avere maggiori informazioni su chi ci rappresenta "ai piani alti"...</p><h1>Presentazione di Open Parlamento, un portale che ci permette di avere maggiori informazioni su chi ci rappresenta "ai piani alti"...</h1>
<p>Buongiorno,</p>
<p>oggi vi presento un sito che da solo definisce una sezione: "facciamoci del male".
Il sito si chiama Open Parlamento e vi permette di monitorare e avere informazioni su tutti i nostri rappresentanti, alcuni di essi hanno addirittura accettato di pubblicare il proprio 730.</p>
<p>Non vi è molto altro da dire a parte che il sito è stra-pieno di informazioni.</p>
<p>Lo trovate qui: <a href="http://parlamento.openpolis.it/">Accedi a OpenParlamento</a></p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Hollywood Hacking gratis2012-08-19T00:00:00+02:002017-02-14T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-08-19:/gratis-sul-web/hollywood-hacking-gratis.html<p>Un paio di giochi ed un sito che ci permetteranno di "sentirci hacker" come nei più bei film di serie Z</p><p>Buongiorno,</p>
<p>Oggi per la sezione "videogiochi" vi presento un cosiddetto gioco di "Hollywood Hacking" dove potrete improvvisarvi hacker e introdurvi in varie
reti protette da firewall, proxy e altro. L'avventura, tutta italiana, creata con Game Maker è piena di colpi di scena e molto coinvolgente e interessante.</p>
<p>Avrete a disposizione strumenti per crackare password, buttare giù computer e persino un antivirus (ovviamente tutto per finta), potrete inoltre aggiornare e potenziare il vostro pc virtuale per rendervi più facile la vita.</p>
<p>Il gioco si chiama M.O.T.H.E.R. e lo trovate qui: <a href="http://www.v4ldemar.net/projects/mother/index.php">Vai alla pagina di M.O.T.H.E.R.</a></p>
<p>Inoltre è disponibile quello che dovrebbe essere il naturale seguito di M.O.T.H.E.R. : Mother ZerOS. Compatibile anche con linux, comprende anche un sistema di level-up "alla rpg" e battaglie fra hacker a colpi di port-scan (può sembrare semplicistico ma vi assicuro che scrivere "pscan NomeBersaglio" senza sbagliare una lettera e azzeccando tutte le maiuscole non è facile).</p>
<p>Il gioco è ancora in Alpha e Lo trovate qui: <a href="http://www.v4ldemar.net/projects/zeros/index.php">Vai alla pagina di Mother ZerOS</a></p>
<p>Se invece non volete tutto l'impegno dato da un vero e proprio videogioco, potete sempre provare hackertyper, aprite <a href="http://www.hackertyper.com/">il sito</a>, premete F11 per andare a schermo intero e battete sulla tastiera come farebbe un pirata informatico dei più squallidi Z-movie in circolazione e divertendovi guardando la faccia dei vostri amici. Vi assicuro che morirete dalle risate.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>DUOtris - Un match-3 game da provare2012-08-17T00:00:00+02:002012-08-17T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-17:/gratis-sul-web/duotris-un-match-3-game-da-provare.html<p>Facciamo la conoscenza di DUOtris, un gioco match3 che ci farà impazzire con del multitasking estremo</p><p>Buongiorno, per la sezione "giochi" vi presento un gioco che ricorda il famoso Tetris ma è più simile ad un cosiddetto "match 3", in cui dovete far corrispondere tre caselle dello stesso colore. Il gioco si chiama DUOtris e, proprio come in <a href="https://penazarea.altervista.org/gratis-sul-web/duo-uno-shooter-particolare.html">DUO</a>, dovrete controllare due partite contemporaneamente. La massiccia presenza di FX rende il tutto molto spettacolare e il fatto di controllare due partire rende il tutto estremamente più difficile. Sicuramente da provare.</p>
<p>Ovviamente ci sono anche dei powerup/powerdown, tra cui: rallentamento/velocizzazione dei blocchi, distruggi tutti i blocchi di uno stesso colore, distruggi riga/colonna, modalità bianco e nero, ecc...</p>
<p>Lo potete trovare qui: <a href="http://www.binaryzoo.com/duotris_page/">Vai alla pagina di DUOtris</a></p>
<p>Ringrazio ancora BinaryZoo per aver creato questo gioco.</p>
<p>Buon Divertimento!</p>
<p>Penaz</p>DUO - Uno shooter particolare2012-08-16T00:00:00+02:002012-08-16T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-16:/gratis-sul-web/duo-uno-shooter-particolare.html<p>Scopriamo DUO, un piccolo shooter che metterà alla prova i nostri riflessi e capacità di multitasking</p><p>Buongiorno,</p>
<p>oggi per la sezione "giochi" vi presento uno shooter di qualche tempo fa che fa dell'unicità il suo cavallo di battaglia: DUO</p>
<p>Duo è uno shooter 2D doppio, in cui dovete controllare una navetta posizionata al centro dello schermo che spara in alto e in basso e i vostri avversari sono dei cerchietti che non esiteranno a reagire, sparandovi addosso proiettili, gocce di acido e comportandosi come kamikaze. Appena inizierete a giocare verrete investiti da una marea di effetti speciali che renderanno il tutto piacevolmente psichedelico.</p>
<p>Inoltre ogni livello ha le sue particolarità: spostamento orizzontale/verticale (quest'ultimo può essere manuale o automatico), rotazione automatica dei cannoni, restringimento/allargamento automatico del campo, rallentamento/velocizzazione temporale, ecc...</p>
<p>Lo potete trovare qui: <a href="http://www.binaryzoo.com/duo_page/">Accedi alla pagina di DUO</a></p>
<p>Ringrazio BinaryZoo Studios per aver creato questo shooter.</p>
<p>Buon divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Viaggiare informati2012-08-05T00:00:00+02:002012-08-05T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-05:/misc/viaggiare-informati.html<p>Vediamo un sito da cui possiamo ricavare informazioni per pianificare al meglio e sapere cosa aspettarci dal nostro prossimo viaggio</p><p>Buongiorno, nel caso stiate ancora organizzando le vostre vacanze, vi consiglio un sito dove potrete trovare valutazioni di villaggi turistici, alberghi e molto altro; tutto per un'ottima preparazione dei vostri viaggi. Il sito si chiama TripAdvisor e contiene valutazioni da parte di viaggiatori comuni come voi. Oltretutto potrete inserire valutazioni e recensioni, previa iscrizione gratuita.</p>
<p>Lo trovate qui: <a href="http://www.tripadvisor.it">Accedi a TripAdvisor</a></p>
<p>Un paio di avvertenze per l'uso:</p>
<ol>
<li>Fate attenzione a recensioni che sanno di promozione, le recensioni troppo perfette solitamente sono create dai gestori dei locali o da simpatizzanti dei locali stessi.</li>
<li>Fate attenzione alle bocciature totali, potrebbero essere recensioni create da concorrenti del locale preso in esame.</li>
<li>Controllate la data delle recensioni, recensioni vecchie spesso citano lavori in corso che potrebbero essere terminati.</li>
</ol>
<p>Spero di essere stato utile.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Un po' di verde con "Compagnia del Giardinaggio"2012-08-02T00:00:00+02:002012-08-02T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-02:/misc/un-po-di-verde-con-compagnia-del-giardinaggio.html<p>Presentazione di un link ad un sito riguardante il giardinaggio. Per chi si diletta ad avere il pollice verde.</p><h1>Presentazione di un link ad un sito riguardante il giardinaggio. Per chi si diletta ad avere il pollice verde.</h1>
<p>Buongiorno.</p>
<p>Se siete appassionati di giardinaggio allora ho il post giusto per voi.</p>
<p>Il link che vi propongo è Compagnia del Giardinaggio, un sito, un forum, un po' di tutto. Ben organizzato e completo questo sito contiene molte informazioni utili per la cura del vostro giardino o terrazzino che sia. Dalle piante che con poca cura danno tanto a quelle più esigenti, il tutto spiegato in maniera semplice e veloce.</p>
<p>Potete trovarlo qui: <a href="http://www.compagniadelgiardinaggio.it/">Accedi a compagniadelgiardinaggio.it</a></p>
<p>Buon divertimento!</p>
<p>Penaz</p>TzeTze: Notizie dal web2012-08-01T00:00:00+02:002012-08-01T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-08-01:/misc/tzetze-notizie-dal-web.html<p>Presentazione di qualche link dove potete ricavare un po' di notizie scelte dagli utenti tramite un sistema a votazione.</p><h1>Presentazione di qualche link dove potete ricavare un po' di notizie scelte dagli utenti tramite un sistema a votazione.</h1>
<p>Buongiorno,</p>
<p>Oggi vi propongo un sito che pubblica notizie scelte dagli utenti riguardo a politica, attualità e altro; secondo un sistema di votazioni; il sito si chiama TzeTze, e potete trovarlo qui: <a href="http://www.tzetze.it/">accedi a TzeTze</a></p>
<p>Il sito ha un'ottima interfaccia, è semplice da navigare e mostra sempre le notizie che possono essere reputate più "interessanti".</p>
<p>Buona lettura!</p>
<p>Penaz</p>Suoni gratis da scaricare2012-07-30T00:00:00+02:002012-07-30T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-30:/gratis-sul-web/suoni-gratis-da-scaricare.html<p>Presentazione di un sito da cui potete scaricare suoni ed effetti sonori per i vostri progetti gratis</p><p>Buongiorno, Siete programmatori di videogiochi? State creando un video e avete bisogno di suoni ambientali?</p>
<p>Oggi vi propongo un sito da cui potrete scaricare un sacco di suoni distribuiti con varie licenze. Si va dai suoni ambientali a quelli più specifici, come l'inserimento di un caricatore di un AK47. Il sito si chiama freesound.org.</p>
<p>Potete trovare tutto qui: <a href="http://www.freesound.org">Accedi a freesound.org</a></p>
<p>Buon divertimento! Saluti e al prossimo post!</p>
<p>Penaz</p>Abandonware gratis da scaricare2012-07-29T00:00:00+02:002012-10-05T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Abandonware.html<p>Se vi piacciono I giochi DoS e Abandonware in genere, non potete perdere questo sito</p><p>Se vi piacciono i vecchi giochi, oggi vi propongo un sito da cui potrete scaricarli in maniera del tutto legale: Abandonia.</p>
<p>Gli abandonware sono software i cui diritti d'autore sono scaduti e non sono stati rinnovati, perciò divenuti liberamente disponibili al pubblico, una vera cuccagna per gli appassionati di retro-gaming.</p>
<p>Qui potrete trovare giochi del calibro di "Indiana Jones and the fate of Atlantis", "Sonic CD" e "Prince of Persia".</p>
<p>Ecco il Link: <a href="http://www.abandonia.com/en/game/all/Abandonware">Clicca qui per andare su Abandonia</a></p>
<p>Oltre al sito già citato vi propongo un altro po' di link da cui potrete scaricare gratuitamente le vecchie glorie del mondo videoludico.</p>
<p>Iniziamo con <a href="http://www.reloaded.org/">Reloaded.org</a> un sito dedicato principalmente ai remake di giochi ma che al suo interno contiene anche vari abandonware pronti da scaricare.</p>
<p>Altra pagina dedicata principalmente ai remakes è sicuramente la remake zone di ComputerEmuZone che trovate a questo <a href="http://computeremuzone.com/remakes/?l=en">Link</a></p>
<p>Poi vi propongo anche:</p>
<ul>
<li><a href="http://xtcabandonware.com/">XTCabandonware</a></li>
<li><a href="http://www.abandongames.com/">AbandonGames.com</a></li>
<li><a href="http://www.squakenet.com/">SquakeNet</a></li>
<li><a href="http://www.bhlegend.com/">BHlegend</a></li>
<li><a href="http://www.dosgamesonline.com/">DOSgamesOnLine</a></li>
</ul>
<p>Buon divertimento, saluti e al prossimo post!!</p>
<p>Penaz</p>Un'alternativa a tutto2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/AlternativeTo.html<p>Presentazione di un motore di ricerca per alternative a software. Utile per trovare alternative gratuite.</p><p>Sono cose che succedono: software che non implementano la caratteristica che ci serve, altri che invece costano 1000 oltre il budget a nostra disposizione, software che fanno esattamente quello che ci serve ma non è disponibile per il vostro sistema operativo.
L'ideale sarebbe trovare un'alternativa, ma come? Di certo non perdendo ore ed ore a provare software scaricati a casaccio da internet...</p>
<p>Vi propongo un sito che è un vero e proprio motore di ricerca per software alternativi: AlternativeTo.
ecco il link: <a href="http://alternativeto.net">Accedi ad AlternativeTo</a></p>
<p>Basta inserire nella casella di ricerca il software di cui volete cercare l'alternativa (per esempio PiTiVi) e in pochi secondi compariranno le alternative (commerciali e non) a quel software, ordinate per numero di likes.</p>
<p>Saluti e al prossimo post!
Penaz</p>Un piccolo elenco di alternative software Gratis2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Alternative_Software_Windows.html<p>Ecco un piccolo elenco di alternative gratis per ogni esigenza</p><p>Salve a tutti.</p>
<p>L'articolo di oggi è principalmente dedicato agli utenti windows, soprattutto coloro che hanno acquistato un computer e si sono ritrovati con questo sistema operativo preinstallato.</p>
<p>Sicuramente avrete speso molto per avere un pc con un sistema operativo preinstallato ma che in realtà non è in grado di far molto a causa della ristrettezza di programmi disponibili: non si possono impaginare documenti, tantomeno authoring dvd e tante altre cose.</p>
<p>Questo potrebbe indurre gli utenti a spendere decine, centinaia o anche migliaia di euro in software che diventano obsoleti subito dopo l'installazione.</p>
<p>Oggi perciò vi propongo un elenco di alternative gratuite di cui alcune addirittura open source per poter fare tutto quello che volete col vostro pc a costo zero.</p>
<p>Iniziamo subito:</p>
<p>Suite da ufficio:</p>
<ul>
<li>Libreoffice</li>
</ul>
<p>Slideshow fotografici:</p>
<ul>
<li>Dvd Slideshow GUI</li>
</ul>
<p>Authoring DVD:</p>
<ul>
<li>DVD Flick</li>
</ul>
<p>Fotoritocco:</p>
<ul>
<li>The Gnu image manipulation program (a.k.a. The Gimp)</li>
</ul>
<p>Masterizzazione:</p>
<ul>
<li>CdburnerXP</li>
<li>Infrarecorder</li>
<li>ImgBurn</li>
</ul>
<p>Compressione/Decompressione:</p>
<ul>
<li>7-Zip</li>
</ul>
<p>Disegno Vettoriale:</p>
<ul>
<li>Inkscape</li>
</ul>
<p>Gestione Ebook:</p>
<ul>
<li>Calibre</li>
</ul>
<p>Creazione PDF da qualunque file:</p>
<ul>
<li>PDF Creator</li>
</ul>
<p>Vettorializzazione da un'immagine raster in bianco e nero:</p>
<ul>
<li>Potrace</li>
</ul>
<p>Organizzazione e ascolto Librerie musicali:</p>
<ul>
<li>MediaMonkey (Versione Free)</li>
<li>Amarok</li>
<li>SongBird</li>
</ul>
<p>Organizzazione librerie film:</p>
<ul>
<li>Ant Movie Catalog</li>
<li>MovieMonkey</li>
</ul>
<p>Riproduzione file multimediali:</p>
<ul>
<li>VLC</li>
<li>Media Player Classic</li>
</ul>
<p>PostProduzione Video:</p>
<ul>
<li>VirtualDub (o VirtualDub Mod)</li>
<li>AviDemux</li>
<li>AviSynth (Difficile!!)</li>
</ul>
<p>Registrazione Macro:</p>
<ul>
<li>AutoIt</li>
<li>Autohotkey</li>
</ul>
<p>Disegno Cad:</p>
<ul>
<li>Freecad</li>
</ul>
<p>Notepad Per programmatori:</p>
<ul>
<li>Notepad++</li>
<li>vi (Principalmente per linux, esiste un port per windows: WinVI)</li>
</ul>
<p>Creazione, modifica, lettura tablature per chitarra:</p>
<ul>
<li>TuxGuitar</li>
</ul>
<p>Conversione di formati audio/video:</p>
<ul>
<li>X-Media Recode</li>
<li>ffmpeg</li>
<li>HandBrake</li>
</ul>
<p>Modellatore di superfici 3D:</p>
<ul>
<li>Blender</li>
</ul>
<p>Regitrazione/Editing Audio:</p>
<ul>
<li>Audacity</li>
</ul>
<p>Recupero file Persi o partizioni perse:</p>
<ul>
<li>Recuva</li>
<li>TestDisk</li>
<li>Photorec</li>
</ul>
<p>Registrazione schermo/Screencast:</p>
<ul>
<li>CamStudio</li>
</ul>
<p>Screenshots:</p>
<ul>
<li>LightScreen</li>
</ul>
<p>Getione Finanziaria:</p>
<ul>
<li>GnuCash</li>
</ul>
<p>E con questo penso sia tutto. Nel caso mi fossi dimenticato qualcosa, commentate!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Gimp Fx-Foundry2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/Fx_Foundry.html<p>Un piccolo set di plugin che vi permette di potenziare Gimp 2.6, assolutamente da provare</p><p>Se vi è presa la smania artistica con gimp e volete un gimp "potente come quello di Penaz" allora vi consiglio di scaricarvi l'ottimo set di plugins Fx-Foundry:</p>
<p><a href="http://gimpfx-foundry.sourceforge.net/">Clicca qui per andare al sito di Fx-Foundry</a></p>
<p>Permettono di creare effetti speciali e disegni interessanti con pochi clic e senza fatica... Purtroppo sono solo in inglese, ma anche se il vostro Gimp è in italiano non ci sono problemi. :D</p>
<p>I plugins inoltre sono cross-platform quindi un pacchetto va bene per qualunque edizione usiate: per Gentoo, Opensuse o quel sistema operativo con la W.</p>
<p>Al prossimo post!</p>
<p>Penaz.</p>Gestiamo al meglio le risorse di Gimp2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/GURM.html<p>Scopriamo GURM, un plugin per gimp che ci permetterà di gestire al meglio le risorse che abbiamo installato</p><p>A suon di brush, gradienti, script e altro sicuramente il nostro Gimp diventerà abbastanza impossibile da usare. Per questo oggi vi presento GURM (Gimp Universal Resource Manager), un semplice script scritto in python che permette di gestire in maniera abbastanza semplice quasi tutto.</p>
<p>L'unica pecca è l'installazione un po' difficile, ma spiegata abbastanza bene nel readme.</p>
<p>La pagina con changelog e varie (Oltre al download) è: <a href="http://registry.gimp.org/node/13473">Clicca qui per andare su registry.gimp.org</a></p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Gradienti per Gimp da scaricare2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Daniele Penazzotag:penazarea.altervista.org,2012-07-29:/misc/Gradienti_Gimp.html<p>Un piccolo pacchetto di 130 gradienti da scaricare ed usare immediatamente, grazie alla cortesia della gente su gimp-tutorials.net</p><p>Gimp ha sicuramente un sacco di gradienti che possiamo usare, ma se questi non vi bastano vi consiglio di scaricare questo pacchetto di 130 gradienti aggiuntivi da usare fin da subito.</p>
<p>La procedura di installazione è identica a quella dei brush a parte il fatto che al posto della cartella "brush" andremo a copiare i files nella cartella "gradients".</p>
<p>Ecco il link diretto per il download:</p>
<p><a href="http://gimp-tutorials.net/files/130-UltimateWeb2-0-Gradients-for-Gimp.zip">Scarica Il pacchetto da Gimp-Tutorials.net</a></p>
<p>Saluti e al prossimo post!
Penaz</p>Un blog per gli appassionati di 3d2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/Grafica3DBlog.html<p>Presentazione di un blog dedicato al 100% alla grafica 3d, per tutti gli appassionati del genere.</p><p>Se siete appassionati di grafica 3d o volete solo cominciare, allora non potete fare a meno di visitare il link che vi propongo:</p>
<p><a href="http://www.grafica3dblog.it">Accedi a Grafica3DBlog</a></p>
<p>Devo dire che la struttura del blog sta un po' stretta a questo sito, ma sicuramente troverete ciò che state cercando.</p>
<p>Saluti e al prossimo post!
Penaz</p>Libri gratis da Scaricare per Tutti!2012-07-29T00:00:00+02:002012-12-04T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Libri_Gratis.html<p>Presentazione di vari link da cui si possono scaricare molti ebook. Gratis e in maniera legale!</p><h1>Presentazione di vari link da cui si possono scaricare molti ebook. Gratis e in maniera legale!</h1>
<p>Per gli amanti della lettura ho in serbo un po' di link che permetteranno di scaricare oltre 30000 (e intendo trentamila) ebook gratuiti,. liberi dal diritto d'autore. (Questo è quanto scritto nei siti citati)
Il primo link è dedicato a project gutenberg, punto di riferimento per gli amanti dei classici della letteratura mondiale:
Eccolo: <a href="http://www.gutenberg.org">Vai Su Gutenberg.org</a></p>
<p>Il secondo link è invece dedicato all'associazione liberliber. Dal sito si possono scaricare oltre 2000 ebook gratuiti, oltre a 4600 brani musicali e vari audiolibri.
Il Link è:<a href="http://www.liberliber.it/">Vai Su LiberLiber</a></p>
<p>Per chi non ne fosse già a conoscenza, il famoso sito italiano PuntoInformatico ha aperto una sezione "libri" in cui si possono scaricare liberamente e gratis, in maniera del tutto legale, ebook dedicati a vari argomenti informatici: dalla gestione delle reti, passando per la programmazione android-iphone fino al posizionamento nei motori di ricerca.</p>
<p>Ecco il link: <a href="http://punto-informatico.it/PILibri/Home.aspx">Vai a PuntoInformatico Libri</a></p>
<p>Per la sezione "Grandi classici" vi propongo la "Biblioteca della letteratura italiana" raggiungibile all'indirizzo: <a href="http://www.letteraturaitaliana.net">Vai su LetteraturaItalana.net</a>
Per la stessa sezione vi propongo anche "Bacheca Ebook Gratis" che potete trovare qui: <a href="http://bachecaebookgratis.blogspot.it/">Vai su BachecaEbookGratis</a></p>
<p>Per la sezione "Manuali e dintorni" vi propongo ebookgratis, dove potrete trovare riviste, fumetti e altri contenuti editoriali di vario tipo, lo potete raggiungere all'indirizzo: <a href="http://www.ebookgratis.net">EbookGratis.net</a></p>
<p>Inoltre, per questa sezione vi propongo anche Scribd, raggiungibile all'indirizzo: <a href="http://www.scribd.com/explore">Scribd.com</a></p>
<p>E nella sezione manuali non può mancare assolutamente manuali.net, una delle risorse più fornite di manuali riguardanti informatica, programmazione e molto altro ancora, lo potete raggiungere all'indirizzo: <a href="http://www.manuali.net">Manuali.net</a></p>
<p>Per la sezione "Risorse indipendenti" vi propongo invece KULT Virtual Press, una vera e propria casa editrice virtuale dove si possono trovare centinaia di ebook gratuiti tra cui fumetti, magazine, saggi e altre cose interessanti, lo potete raggiungere all'indirizzo: <a href="http://www.kultvirtualpress.com">Kultvirtualpress.com</a></p>
<p>Altro link che vi propongo è <a href="http://wiki.creativecommons.org/Books">La pagina Books di CC Wiki</a>. Gli ebook qui presenti sono distribuiti sotto licenza <a href="http://www.creativecommons.it/">Creative Commons</a> in tutte le varie declinazioni, a seconda del libro scelto. La maggior parte dei libri è in inglese.</p>
<p>Voglio proporvi anche <a href="https://it.wikibooks.org/wiki/Pagina_principale">WikiBooks</a> fondato da WikiMedia Foundation che propone un sacco di libri su vari argomenti, tutti con licenza <a href="https://creativecommons.org/licenses/by-sa/3.0/deed.it">Creative Commons BY-SA</a> similmente a Wikipedia è possibile modificare i libri e inoltre potete scaricare la versione attuale con pochissimo sforzo, sicuramente da tener d'occhio data la varietà di libri e manuali a disposizione. Inoltre, se volete scatenare il vostro estro di scrittori, potete iniziare un vostro libro e condividerlo con la comunità.</p>
<p>Ulteriore link è invece la collezione di libri liberi da DRM di <a href="http://calibre-ebook.com/">Calibre</a>, il famoso software gratuito di gestione degli ebook reader. Potete arrivare direttamente all'elenco dei libri seguendo <a href="http://drmfree.calibre-ebook.com/">Questo Link</a>.</p>
<p>Propongo come ultimo link ebookgratis.it, un vero e proprio motore di ricerca, basato su quello di google, che permette di trovare velocemente libri pronti da scaricare, lo trovate all'indirizzo: <a href="http://www.ebookgratis.it">Ebookgratis.it</a></p>
<p>Un altro paio di siti ed abbiamo finito, questi hanno finalità un po' diverse dal puro download di ebook, si tratta infatti di comunità di scambio e vendita:</p>
<p>Il primo è Anobii, una comunità di scambio e vendita libri la trovate all'indirizzo: <a href="http://www.anobii.com">Anobii.com</a></p>
<p>Il secondo è bookmooch una comunità di puro scambio libri che trovate qui: <a href="http://it.bookmooch.com/">bookmooch.com</a></p>
<p>Al prossimo Post!</p>
<p>Penaz</p>Link dedicati all'elettronica2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/Link_Elettronica.html<p>Un po' di link riguardanti l'elettronica, per tutti gli appassionati</p><p>Per gli aspiranti esperti di zeri e uni o per coloro che desiderano solo farsi un'idea di elettronica propongo un link da dove potrete trarre un po' di ispirazione.
Qui troverete sezioni riguardanti Assembler per PicMicro, VIsual Basic e PHP.</p>
<p>Il link è: <a href="http://www.gitalforum.altervista.org">GitalForum</a></p>
<p>Un altro link è invece <a href="http://www.tempodielettronica.it">TempoDiElettronica</a></p>
<p>Questo sito contiene un sacco di date di fiere dedicate all'elettronica, buono per radioamatori fino ad arrivare agli assemblatori di pc.</p>
<p>Buon divertimento!</p>
<p>Penaz.</p>Fermiamo l'ondata di marketing non voluto2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/Offerte_Marketing.html<p>Vediamo come possiamo fermare, o comunque ridurre considerevolmente, l'ondata di marketing che distrugge i nostri telefoni tutti i giorni</p><p>Come me, sicuramente altre persone sono arcistufe di ricevere telefonate recanti offerte di vario tipo (si va dai materassi ai pannelli solari, passando per l'olio e i corsi di formazione professionale) ad ogni ora del giorno.</p>
<p>Non tutti sanno però che tale martirio è basato sul principio del "silenzio-assenso", cioè se io non dichiaro esplicitamente di non voler ricevere offerte, allora è come se dicessi "fatemi pure le vostre offerte pubblicitarie".</p>
<p>Da qualche tempo è possibile iscrivere i propri contatti al "registro pubblico delle opposizioni", un registro pubblico di contatti (telefonici e non) di persone che non vogliono essere contattate per offerte commerciali.</p>
<p>Dopo l'iscrizione al registro (completamente gratuita) ci vorranno circa 15 giorni prima che i vari call-center ricevano l'aggiornamento dell'elenco, ma successivamente non riceverete più offerte commerciali, o per lo meno si ridurranno in modo considerevole.</p>
<p>Potete iniziare la procedura da qui: <a href="http://www.registrodelleopposizioni.it/">Registro Delle Opposizioni</a></p>
<p>E ricordate:</p>
<ul>
<li>Se continuate a ricevere offerte, controllate lo stato della vostra iscrizione;</li></li>
<li>Se la vostra iscrizione è completa e sono passati 15 giorni, ricordate che potete chiedere all'operatore da quale elenco ha estratto il vostro recapito e richiederne la cancellazione, la quale dovrebbe avvenire entro una quindicina di giorni.</li></li>
<li>Se il recapito arriva da qualche contratto che avete sottoscritto (per esempio per una email) controllate di aver rifiutato l'uso dei vostri dati personali per fini commerciali e di marketing ed in caso di necessità operate di conseguenza, inviando al responsabile un modulo, compilato in ogni sua parte, per la revoca del consenso (D.Lgs 196/2003) il tutto dovrebbe risolversi entro 15 giorni.</li></li>
<li>Nel caso tutti i punti precedenti fossero a posto, allora potete fare denuncia all'autorità giudiziaria per trattamento illegittimo dei dati personali o rivolgersi al garante per la protezione dei dati personali.</li></li>
</ul>
<p>Spero di essere stato d'aiuto, saluti e al prossimo post!</p>
<p>Penaz</p>Cliparts Gratis Per tutti!2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Daniele Penazzotag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Openclipart.html<p>Presentazione di un sito da cui potrete scaricare gratis cliparts e disegni in alta qualità</p><p>Oggi vi propongo un sito da cui potrete scaricare una marea di immagini e cliparts di ottima qualità che potrete usare nei vostri documenti, disegni, ecc...
Le immagini sono scaricabili sia in formato raster (png, bmp,ecc...) che in formato vettoriale (svg).</p>
<p><a href="http://openclipart.org">Clicca qui per entrare in OpenClipart.org</a></p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Creare schemi di reti con marionnet2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Reti_Marionnet.html<p>Link ad Un piccolo software che potete usare per farvi un'idea di una rete di calcolatori</p><p>Salve a tutti.</p>
<p>Vorreste mettere in piedi una rete o più reti locali ma non avete l'esperienza necessaria per farlo? Siete professionisti del networking e volete farvi un'idea delle componenti necessarie per creare una rete?
Oggi vi presento marionnet, un software che vi permette di simulare ogni tipo di rete che avete in testa.
Potete trovarlo qui: <a href="http://www.marionnet.org/site/index.php/fr/">Marionnet</a></p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Software Gratis Pronto da Scaricare2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Software_Gratis.html<p>Un paio di link da cui potrete scaricare una valanga di software (anche commerciale) gratis</p><p>Questo post è dedicato a chi usa il sistema operativo con la W.</p>
<p>Propongo un sito che vi permetterà ogni giorno di scaricare gratuitamente un software commerciale, nello stesso sito sono descritte le procedure di registrazione del prodotto, il tutto in maniera ovviamente legale.</p>
<p>Ecco il link: <a href="http:/it.giveawayoftheday.com">GiveAwayOfTheDay Italiano</a></p>
<p>Se non amate il software commerciale allora, oltre al celeberrimo <a href="http://sourceforge.net">SourceForge</a> vi propongo programmifree, un sito molto ben organizzato che vi permette di scaricare programmi gratuiti per praticamente ogni esigenza.
il link è: <a href="http://programmifree.com">Clicca qui per entrare in ProgrammiFree</a></p>
<p>Al Prossimo Post!
Penaz</p>Tablature e spartiti gratis2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Spartiti_Gratis.html<p>Ecco a tutti un paio di link per tutti gli appassionati di chitarra e musica, da cui potrete scaricare spartiti musicali</p><p>Oggi vi presento un link da cui potrete scaricare oltre 300.000 tablature per chitarra dei brani più famosi, trascritte ad orecchio da appassionati, potrete addirittura richiedere agli appassionati di trascrivere della musica non presente o potrete mandare le vostre tab. Ecco il link: <a href="http://www.ultimateguitar.com">UltimateGuitar.com</a></p>
<p>Le tablature sono in diversi formati:
- ASCII, tablature in puro testo, si possono leggere con un qualunque editor testuale decente
- Guitar Pro e PowerTab, per leggerle servono programmi appositi.</p>
<p>Fino alle tablature ASCII non ci sono problemi, ma come sempre io cerco di farvi sfruttare al massimo le potenzialità dei link che vi propongo e vi offro su un piatto d'argento un programma open-source per linux, MacOS e il sistema operativo con la W che vi permetterà di leggere questi ultimi due formati e scrivere in tutti e tre, si tratta di TuxGuitar, che potrete scaricare da qui: <a href="http://tuxguitar.herac.com.ar/">TuxGuitar</a></p>
<p>Saluti e al prossimo post!
Penaz</p>Textures Gratis da scaricare2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/Textures.html<p>Presentazione di un sito da cui potete scaricare una tonnellata di textures gratis da applicare dove preferite</p><p>Oggi vi do un link da dove potrete scaricare textures da applicare dove preferite.
Alcune texture verranno usate nelle prossime sezioni del corso di Gimp.</p>
<p>Ecco il link:</p>
<p><a href="http://qtextures.net/"">Accedi a QTextures</a></p>
<p>Saluti e al prossimo post!
Penaz</p>Brushes per Gimp2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/brushes-per-gimp.html<p>Presentazione di un sito che offre una marea di Brushes per gimp, pronti da scaricare</p><p>Se la smania da Gimp vi prende, allora mi sento di consigliare un sito da dove è possibile scaricare una barca, una montagna, un sacco e una sporta di brushes per ogni esigenza... Facili da installare, permettono di ottenere ottimi risultati col minimo sforzo.</p>
<p><a href="http://gimpbrush.com/">Clicca qui per andare su GimpBrush.com</a></p>
<p>Al prossimo post!</p>
<p>Penaz.</p>Film: Cinefili Organizzati2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/film-cinefili-organizzati.html<p>Presentazione di un insieme di software per organizzare le vostre collezioni di film</p><p>Chi è amante del cinema di sicuro ha molti dvd a casa, talmente tanti da non riuscire ad avere una visione d'insieme.
Vi propongo alcune alternative che vi permetteranno di organizzare i vostri film, in modo da poter scegliere coscienziosamente quale guardare stasera.</p>
<p>La prima è moviemonkey, un software che permette di gestire la vostra collezione di film in maniera facile e ordinata.
Lo potete scaricare da qui: <a href="http://www.getmoviemonkey.com/">Link Esterno</a></p>
<p>La seconda alternativa è l'open source "Ant Movie Catalog", software con funzionalità simili a moviemonkey, molto comodo anche se decisamente spartano.
Lo potete scaricare da qui: <a href="http://www.antp.be/software/moviecatalog">Link Esterno</a></p>
<p>Ai pinguini è dedicata la terza alternativa, GCstar, un software che permette di gestire collezioni di libri, film, videogiochi e altro.
È un software molto flessibile, disponibile per linux, il sistema operativo con la W e quello con la mela.
Gli utenti di gentoo lo possono trovare nel portage, gli altri utenti linux dovrebbero trovarlo nei vari repository,gli utenti Windows, MacOS e coloro che non trovano il programma nei repository possono scaricarlo da qui: <a href="http://www.gcstar.org/index.en.php">Link Esterno</a></p>
<p>Saluti e al prossimo post!
Penaz</p>Giochi gratis da scaricare2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/giochi-gratis-da-scaricare.html<p>Un elenco di link da cui si possono scaricare vari giochi gratuitamente</p><p>Vi Propongo un po' di link da cui potrete scaricare giochi in maniera totalmente legale,</p>
<p>Il primo link è ispirato a giveawayoftheday, che ho linkato nel <a href="https://penazarea.altervista.org/gratis-sul-web/Software_Gratis.html">post software</a>:
<a href="http://game.giveawayoftheday.com">GiveAwayOfTheDay</a></p>
<p>Il secondo è invece gametop, un sito da cui si possono scaricare videogiochi gratuitamente, fate attenzioni a dei possibili popup e software aggiuntivi che potrebbero venire installati:
<a href="http://www.gametop.com">GameTop</a></p>
<p>Il terzo link è idealsoftblog da dove si possono avere notizie e link per il download di giochi indipendenti. La maggior parte sono gratuiti (più conosciuti come indie games):
<a href="http://www.idealsoftblog.it/">IdealSoftBlog</a></p>
<p>Ai pinguini è dedicato il mio 4° link, da dove si possono avere notizie sui giochi in uscita per il famoso sistema operativo:
<a href="http://www.linuxgames.com/">LinuxGames</a></p>
<p>Il 5° Link vi permetterà di scaricare game downloader, un piccolo programma che si appoggia ad un server. Ciò vi permette di scaricare una pletora di giochi open source: <a href="http://dev-fire-gd.sourceforge.net/">Game Downloader</a></p>
<p>Il 6° Link è invece myplaycity, simile a gametop, ma molto più fornito: <a href="http://www.myplaycity.com"">MyPlayCity</a></p>
<p>Un altro sito non è un misconosciuto portale inglese disperso nell'angolo più remoto di Internet, ma bensì l'italianissimo portale <a href="http://digitaldownload.tiscali.it/index.php">DigitalDownload di Tiscali</a></p>
<p>Il portale propone l'acquisto di titoli famosissimi pronti da scaricare con una connessione veloce (vi consiglio di dotarvi di una flat per queste operazioni, altrimenti il costo del download potrebbe essere inferiore a quello della connessione) ma nella parte inferiore della pagina propone alcuni giochi gratuiti pronti al download.</p>
<p>Tutti i siti sono aggiornati periodicamente.</p>
<p>Buon Divertimento!!</p>
<p>Penaz</p>Il Corso di Gimp parti da 1 a 302012-07-29T00:00:00+02:002012-08-07T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/il-corso-di-gimp-parti-da-1-a-30.html<p>Presentazione del corso di gimp tutte pronte da scaricare, in pdf e video flash per un apprendimento veloce e divertente.</p><h1>Presentazione del corso di gimp tutte pronte da scaricare, in pdf e video flash per un apprendimento veloce e divertente.</h1>
<p>Vi ripresento il piccolo corso di gimp che ho messo insieme selezionando, traducendo e inventando tutorials per un apprendimento veloce e divertente.</p>
<p>Ecco i link da cui potete scaricare dalla mia dropbox le 30 sezioni create finora:</p>
<ul>
<li><a href="http://db.tt/aqQ1M0Ri">Introduzione</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/2%29%20Primi%20Passi.zip">Primi Passi</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/3%29%20Metallo%20satinato.zip">Metallo Satinato</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/4%29%20Liquidi.zip">Liquidi</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/5%29Tiling%2C%20emboss%2C%20bump%20map%20e%20varie.zip">Tiling, Emboss, Bump Map e Varie</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/6%29%20Le%20maschere%20di%20livello.zip">Maschere Di Livello</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/7%29%20Le%20maschere%20di%20livello%20avanzate.zip">Maschere Di Livello Avanzate</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/8%29%20Tutorial%20da%20relax.zip">Tutorial Da Relax</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/9%29%20Bolle%20di%20sapone.zip">Bolle di Sapone</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/10%29%20Introduzione%20al%20fotoritocco%20-%20Il%20Gemello.zip">Introduzione al Fotoritocco - Il Gemello</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/11%29%20Nuvole.zip">Nuvole</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/12%29%20Il%20fotoritocco.zip">Il Fotoritocco</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/13%29%20Occhi.zip">Occhi</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/14%29%20Centro%20estetico%20digitale.zip">Centro Estetico Digitale</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/15%29%20La%20Tecnica%20Orton.zip">La Tecnica Orton</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/16%29%20Sbiancare%20i%20denti.zip">Sbiancare I Denti</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/17%29%20Dimagrire%20con%20GIMP.zip">Dimagrire con Gimp</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/18%29%20Aurora%20boreale.zip">Aurora Boreale</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/19%29%20Installazione%20Brushes.zip">Installazione dei Brushes</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/20%29%20Tutorial%20Da%20Relax%20II.zip">Tutorial Da Relax 2</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/21%20Modalit%C3%A0%20di%20Fusione.zip">Modalità di Fusione</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/22%20Sketch.zip">Sketch</a></li>
<li><a href="http://dl.dropbox.com/u/69752267/Corso%20di%20Gimp/PlusVec.zip">Da Sketch Raster a Sketch Vettoriali</a></li>
<li><a href="http://db.tt/lsngifOH"">Creazioni alla velocità della luce</a></li>
<li><a href="http://db.tt/ETGPloPi"">Metallo e vetro</a></li>
<li><a href="" title="http://db.tt/ysifAqLL">Colorazione Selettiva</a></li>
<li>Testo su Tracciato: <a href="http://db.tt/elYyRnuQ">Versione PDF</a> - <a href="" title="http://db.tt/9ADVgHOZ">Versione swf</a></li>
<li>Immagini Indicizzate: <a href="" title="http://db.tt/O3aS5k4e">Versione PDF</a> - <a href="" title="http://db.tt/NMYnIH23">Versione swf</a></li>
<li><a href="" title="http://db.tt/lvqInpio">Filtri & Co. (a.k.a Tutorial Con Dedica)</a></li>
<li><a href="http://db.tt/0ouVCIyI">Raggi Di Luce</a></li>
<li><a href="http://db.tt/IiSEsd6W">Biglietti di compleanno</a></li>
<li><a href="http://db.tt/rDqhkrMB">ASCII-Art Style</a></li>
<li><a href="http://db.tt/kHDKCxhU">Cerchietti</a></li>
<li><a href="http://db.tt/IZBxwIOk">Copertina per un album</a></li>
<li><a href="http://db.tt/YFufBfAR">Trasformazione Gabbia</a></li>
</ul>
<p>Questo è quanto.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>PaginaInizio: La prima pagina di Internet2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/misc/paginainizio-la-prima-pagina-di-internet.html<p>Presentazione di un link ideale come pagina iniziale da inserire nel proprio browser, contiene tutto ciò che vi può servire</p><p>Oggi vi propongo un sito che secondo me è ideale da inserire come prima pagina...
Il sito contiene il meteo, l'oroscopo, una casella di ricerca google, notizie, ricette. Un buon punto di partenza per iniziare la vostra navigazione.</p>
<p><a href="http://www.paginainizio.com/">Clicca qui per andare su PaginaInizio</a></p>
<p>Saluti e al prossimo post!
Penaz</p>Per Gli Amanti della Musica2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/per-gli-amanti-della-musica.html<p>3 Siti da cui si può ascoltare musica di qualità gratis!</p><p>Vi presento un elenco di siti da dove si può ascoltare musica in maniera legale (almeno questo è quello che scrivono gli autori dei rispettivi siti).</p>
<p>Il primo è CCMixter, un database di musica distribuita con licenza Creative Commons: <a href="http://dig.ccmixter.org">Link</a></p>
<p>Da CCMixter potrete anche scaricare vari samples da inserire nei vostri brani: <a href="http://ccmixter.org/view/media/samples/browse">Link</a></p>
<p>Il Secondo sito è jamendo, funziona in maniera simile a CCMixter: <a href="http://www.jamendo.com/it/">Link</a></p>
<p>Il terzo sito è SoundCloud, dove potrete trovare musica di artisti indipendenti: <a href="http://soundcloud.com/">Link</a></p>
<p>Personalmente vi consiglio di cercare "NCS - NoCopyRightSounds".</p>
<p>Nel caso invece foste interessati a comporre musica posso consigliarvi:</p>
<p>LMMS (Linux MultiMedia Studio): <a href="http://lmms.io">Link</a></p>
<p>Rimshot (Drum Machine): <a href="http://stabyourself.net/rimshot/">Link</a></p>
<p>Hydrogen Music (Altra Drum Machine): <a href="http://www.hydrogen-music.org/">Link</a></p>
<p>Rakarrack (effetti per chitarra elettrica): <a href="http://rakarrack.sourceforge.net/">Link</a></p>
<p>Vi propongo inoltre un piccolo programma che vi permette di emulare su pc una barca, una montagna, un sacco, una sporta e una stiva di sintetizzatori audio tra cui: minimoog, korg mono/poly, prophet 1, 5,10 e 52, e molti altri fino all'arp2600.</p>
<p>Il programma in questione si chiama bristol, per informazioni e per il download (solo linux) basta andare <a href="http://bristol.sourceforge.net/emulations.html">Qui</a></p>
<p>Poi vi propongo un software per giocare a "fare il dj", molto probabilmente nessuno impazzirà per le vostre produzioni, ma sicuramente vi divertirete un po'.</p>
<p>Ecco il link per maggiori informazioni: <a href="http://www.mixxx.org/">Mixx</a></p>
<p>Rosegarden, disponibile solo per linux, è un editor di musica, un sequencer midi e molto altro.
Lo trovate qui: <a href="http://www.rosegardenmusic.com/getting/">Rosegarden</a></p>
<p>Spero di aver stimolato la vostra curiosità, saluti e al prossimo post!</p>
<p>Penaz</p>Sfondi e Wallpaper gratis2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/sfondi-e-wallpaper-gratis.html<p>Ecco un sito tutto Italiano da cui potrete scaricare tonnellate di wallpapers per il vostro PC</p><p>Per quanto possano essere belli, dopo un po' tutti i desktop diventano noiosi.
Un'idea sarebbe rinnovare le wallpaper, magari creando il nostro sfondo personalizzato con Gimp.
In alternativa si potrebbe scaricare qualche sfondo da internet, ma non sempre i siti sono affidabili o completi; oggi vi consiglio un link da dove potrete scaricare tonnellate e tonnellate di sfondi gratuiti, anche in HD.</p>
<p><a href="http://www.sfondilandia.it">Accedi a SfondiLandia.it</a></p>
<p>Saluti, al prossimo post e buon download!
Penaz</p>Soluzioni software gratis per L'editing Video2012-07-29T00:00:00+02:002012-07-29T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-29:/gratis-sul-web/soluzioni-software-gratis-per-lediting-video.html<p>Un insieme di consigli e software per coloro che si vogliono dedicare all'editing video</p><p>Questo post è dedicato a coloro che fanno editing video, oggi vi propongo un piccolo set di software che può risparmiarvi molti mal di testa, o farvene venire di più...</p>
<p>Il primo è un pacchetto di codecs, Il K-lite codec pack, necessario per far funzionare in maniera armonica tutto il set che sto per proporvi, in alternativa va bene qualunque set di codec compatibile con media player (eh no, vlc non va bene per i nostri scopi)</p>
<p>Il secondo è il vero e proprio fulcro del nostro piccolo set di programmi: AviSynth</p>
<p>AviSynth è uno dei più potenti programmi di post-produzione che esistano, insieme ad avidemux (disponibile anche per i pinguini, per i quali cerco di avere un occhio di riguardo) e a virtualdub.</p>
<p>AviSynth è un vero e proprio "linguaggio di programmazione" per i video, con cui si possono applicare e visualizzare filtri in tempo reale, oltre a poter (con qualche riga di codice in più) fare tagli, demux e altro ancora.</p>
<p>Ecco alcune situazioni in cui AviSynth può far comodo:</p>
<ul>
<li>
<p>Riproduzione in serie di più video
In tal caso è un'ottima idea usare AviSynth con questo codice:</p>
<blockquote>
<p>a=DirectShowSource("Video1.***")</p>
<p>b=DirectShowSource("Video2.***")</p>
<p>c=DirectShowSource("Video3.***")</p>
<p>...</p>
<p>z=DirectShowSource("Video26.***")</p>
<p>a+b+c+...+z</p>
</blockquote>
</li>
<li>
<p>Unire audio e video</p>
</li>
</ul>
<p>Il codice è molto breve:</p>
<blockquote>
<p>Vid=DirectShowSource("Video.***")</p>
<p>Aud=WavSource("Audio.wav")</p>
<p>AudioDub(Vid,Aud)</p>
</blockquote>
<p>Ma queste sono solo alcune situazioni in cui avisynth può far comodo:</p>
<blockquote>
<p>"Captain Jean Luc Piccard al ponte: cacchio abbiamo un problema, non riusciamo a deinterlacciare le sorgenti!" (cit. Sparta@Asyoyo)</p>
</blockquote>
<p>Una situazione molto scomoda risulta quella dei video interlacciati, soprattutto se si vuole guardarli senza convertirli, in questo caso avisynth viene nuovamente in aiuto, infatti ad avisynth non importa se il file è interlacciato o progressivo, infatti la libreria effettua il rendering dei files per frames e non per righe, di fatto deinterlacciando il video automaticamente, se proprio le righe da interlacciamento non ne vogliono sapere di andarsene, allora basta consultare il manuale elettronico e usare il filtro bob.(Si, si chiama proprio bob)</p>
<p>Il terzo software che andremo ad usare è molto simile a mount per i sistemi linux, si chiama Pismo File Mount Audit Package (per gli amici PFM)</p>
<p>Questo software permette di montare alcuni files come se fossero cartelle, senza alcun problema.</p>
<p>Sicuramente vi sorgerà spontanea la domanda: "e che diavolo centra con l'elaborazione video?"</p>
<p>La risposta è data dal quarto software, anche se in realtà è un modulo di PFM, si chiama AV virtual filesystem.(per gli amici AVFS)</p>
<p>Questo modulo consente di montare gli script avs come se fossero cartelle; le quali conterranno un file .avi non compresso, un file .wav non compresso, un file .w64, il log degli errori e lo script avs originale, con tutti i vantaggi che ne conseguono.</p>
<p>Ad esempio sarà possibile importare all'interno di programmi di video editing video nei più disparati formati, anche se incompatibili con il programma. Infatti usando questo stratagemma è possibile importare anche i flash video, tanto il video editor li vedrà sempre come degli avi non compressi.</p>
<p>Questo permette di editare i files senza le perdite di qualità dovute alla ricompressione, di fatto togliendo i tempi morti dovuti alla conversione dei video sorgenti in un formato compatibile con l'editor video.</p>
<p>I link per i download sono:</p>
<p>K-Lite Codec Pack (io consiglio la versione full): <a href="http://www.free-codecs.com/download/k_lite_codec_pack.htm">Link Per il Download</a></p>
<p>Avisynth: <a href="http://avisynth.org/mediawiki/Main_Page">Link Per il Download</a></p>
<p>PFM: <a href="http://www.pismotechnic.com/pfm/ap/">Link Per Il Download</a></p>
<p>AVFS: <a href="http://www.turtlewar.org/avfs/">Link Per Il Download</a></p>
<p>Al prossimo post!</p>
<p>Penaz.</p>Alcuni pezzi di codice che ho creato2012-07-12T00:00:00+02:002012-07-12T00:00:00+02:00Penaztag:penazarea.altervista.org,2012-07-12:/coding/Software_Penaz_1.html<p>Un paio di programmi che ho creato nei lontani anni 2007-2008</p><p>Oggi ho deciso di pubblicare un paio di software che ho creato circa 4-5 anni fa, non sono sicuramente un esempio di buona programmazione, tanto meno funzionano senza errori nè eccezioni non catturate.
Ho deciso di crearle e pubblicarle per puro svago, ora che sono progetti abbandonati e non più sotto sviluppo attivo.
Se siete curiosi e volete provarli i software sono:</p>
<p>New autorun manager (NAM) 0.0.8.1: dopo aver preso il 118° virus dalle chiavette usate nei pc della scuola ho deciso di disattivare l'autorun di windows e sostituirlo con un software creato da me, mediamente efficace, mi ha salvato il pregevolissimo più di una volta. Più fastidioso di un firewall, completamente configurabile e totalmente migliorabile. Lo trovate qui: <a href="https://github.com/Penaz91/NAM">NAM</a></p>
<p>Pescadores: giunto all'ottava edizione, sviluppato per un amico appassionato di carp-fishing, quest'applicativo permette di registrare tutte le catture e genera report dettagliati e statistiche di vario tipo, quasi tutto quello che serve ad un pescatore informatizzato. Totalmente configurabile, altamente migliorabile e dall'interfaccia grafica creata a mano, potete trovarlo qui: <a href="https://github.com/Penaz91/Pescadores">Pescadores 8</a></p>
<p>Come ho già detto questi software sono soggetti a pesanti bachi che non ho voglia di togliere, su alcuni sistemi potrebbero non funzionare addirittura, perciò io non mi assumo alcuna responsabilità in caso di danni a dati, cose o persone, tantomeno in caso di morte di queste ultime.
Proseguo con l'esenzione di responsabilità (riguardo a NAM) dicendo che non sono un esperto di sicurezza e ho applicato un sistema di crypt semplice e con chiave hard-coded nel programma, non mi assumo alcuna responsabilità in caso di perdita di dati del vostro pc.</p>
<p>Ora questi software sono di pubblico dominio, se volete divertirvi a modificarlo e farne progetti derivati, fate pure... Io non vi dirò nulla. Basta che mi mettiate tra i riconoscimenti ;)</p>
<p>Un'ultima cosa: abbiate pietà del mio pessimo stile di programmazione, questi software sono stati creati anni fa... Nel frattempo il mio stile di programmazione è sostanzialmente peggiorato.</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz</p>Future Pinball - Disegniamo i nostri flipper digitali2012-02-10T00:00:00+01:002012-02-10T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-02-10:/gratis-sul-web/Future_Pinball.html<p>Ecco a voi Future Pinball: un programma gratuito per disegnare e programmare i vostri flipper digitali con semplicità.</p><h1>Ecco a voi Future Pinball: un programma gratuito per disegnare e programmare i vostri flipper digitali con semplicità.</h1>
<p>Buongiorno a tutti, oggi voglio presentarvi Future Pinball, un piccolo software che vi permetterà di disegnare i vostri personalissimi Flipper elettronici, con pochi click potrete posizionare respingenti, luci, plastiche, rotaie, superfici e molto altro.</p>
<p>Il tutto è completamente personalizzabile e potete programmare alcune funzioni del vostro flipper con il semplice linguaggio di scripting incluso e ben documentato.</p>
<p>Se volete creare un flipper futuristico o dall'aspetto classico; semplice o complesso che sia, Future Pinball è un'ottima soluzione.</p>
<p>Sul sito ufficiale potrete trovare anche una collezione di tavoli completi pronti per il download oltre a screenshot e file multimediali utili durante la procedura di creazione.</p>
<p>Se volete provarlo, basta seguire questo <a href="http://www.futurepinball.com/">Link</a> verso il sito ufficiale di Future Pinball.</p>
<p>Buon divertimento a tutti!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>Creiamo i nostri giochi on Unreal Engine2012-02-08T00:00:00+01:002012-02-08T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-02-08:/gratis-sul-web/UDK.html<p>Con questo kit, gratuito per uso non commerciale, potremo usare il famosissimo Unreal Engine per i nostri videogiochi 3D.</p><h1>Con questo kit, gratuito per uso non commerciale, potremo usare il famosissimo Unreal Engine per i nostri videogiochi 3D.</h1>
<p>Buongiorno a tutti. Se volete dare ai vostri videogiochi 3D una vera e propria "iniezione di potenza", allora vi propongo un motore estremamente potente: Unreal Engine.</p>
<p>Inizialmente creato per i videogames della serie Unreal, ora questo potente motore è integrato in moltissimi videogiochi di successo. Per un piccolo elenco basta vedere la pagina dedicata all'interno di <a href="https://it.wikipedia.org/wiki/Unreal_Engine#Unreal_Engine_1">Wikipedia</a>.</p>
<p>Il motore è utilizzabile gratuitamente per fini non commerciali, perciò potete usarlo per creare giochi open-source o freeware senza nessun problema. Con Unreal Engine potete creare dai videogiochi di corse automobilistiche fino ai sparatutto in prima persona sfruttando le ultime tecnologie grafiche disponibili.</p>
<p>L'Unreal Development Kit (UDK) è aggiornato spesso, circa una volta al mese, e gli aggiornamenti sono gratuiti permettendovi di usare sempre l'ultima versione del software, risolvendo bachi che si possono venire a formare e migliorando le prestazioni.</p>
<p>Se volete provarlo, non dovete fare altro che andare sul sito ufficiale, seguendo questo Link.</p>
<p>Questo è quanto, ma il nostro viaggio all'interno del game-development non è ancora finito.</p>
<p>Saluti e alla prossima!</p>
<p>Penaz.</p>Enigma-Dev - Un altro ambiente di game development2012-01-13T00:00:00+01:002012-01-13T00:00:00+01:00Penaztag:penazarea.altervista.org,2012-01-13:/gratis-sul-web/Enigma_Dev.html<p>Presentazione di Enigma-Dev, conosciuto anche come Enigma Development Environment, un ambiente di creazione di videogiochi molto promettente.</p><h1>Presentazione di Enigma-Dev, conosciuto anche come Enigma Development Environment, un ambiente di creazione di videogiochi molto promettente.</h1>
<p>Buongiorno, per ricominciare con la nostra tranche di articoli dedicati al game-development voglio proporvi Enigma Development Environment (Enigma-dev), un ambiente di creazione di videogiochi molto promettente.</p>
<p>Il programma risulta ancora in versione Alpha ma è abbastanza stabile. Le caratteristiche salienti sono:</p>
<ul>
<li>OpenSource e Gratis (<strong>Attenzione</strong>: l'una non implica per forza l'altra, vedi RedHat Linux)</li>
<li>Compilato per garantire un'alta velocità operativa</li>
<li>Facile da apprendere</li>
<li>Compatibile con GML (GameMaker Language)</li>
<li>Compatibile con C++</li>
<li>Usa un linguaggio chiamato EDL (Enigma Development Language), un mix tra GML e C++</li>
<li>Supporta la compilazione degli eseguibili, rendendo il prodotto finale più veloce e piccolo</li>
</ul>
<p>Potete trovare Enigma-dev seguendo questo <a href="http://enigma-dev.org">link</a></p>
<p>Il mio consiglio personale è quello di usare un buon IDE compatibile con GameMaker, come <a href="http://enigma-dev.org/docs/Wiki/LateralGM">LateralGM</a>, consigliato dai creatori dello stesso Enigma-dev.</p>
<p>Buon Divertimento!</p>
<p>Saluti e al prossimo post!</p>
<p>Penaz.</p>