VsixUtil errore VsixFeed0001: “This VSIX does not apply to any product installed on this machine. The problem could be that the VSIX manifest’s format is not recognized, or that the manifest has been corrupted.”

Avendo realizzato alcune extension per Visual Studio e volendo condividerle con gli altri sviluppatori, stavo tentando di pubblicarle tramite una Private Gallery sulla intranet aziendale. In breve, la procedura consiste nella creazione di un feed Atom contenente link alle varie extension che si vogliono pubblicare e i metadati delle stesse. Successivamente, ciascun utente può configurare all’interno della propria istanza di Visual Studio l’URL del feed Atom.

Per la creazione del feed, si può utilizzare l’utility a riga di comando VsixUtil, fornita con Visual Studio SDK. Tuttavia, nonostante le mie extension fossero create correttamente e regolarmente installate in Visual Studio, l’esecuzione di VsixUtil falliva con il seguente errore:

VSSDK: error VsixFeed0001 :  'MyExtension.vsix' - This VSIX does not apply to any product installed on this machine. The problem could be that the VSIX manifest's format is not recognized, or that the manifest has been corrupted.
VSSDK: error VsixFeed0002 : Could not create a VSIX feed file because of error '1'

Anche il workaround suggerito nelle FAQ (utilizzare l’argomento -ignoreErrors) non si è rivelato utile nel mio caso.

Se sei di fretta, puoi andare direttamente alla soluzione; altrimenti puoi continuare a leggere.

Dopo un’infruttuosa ricerca sul web, ho deciso di provare a debuggare il programma VsxUtil per carcare di capire cosa fallisse nella validazione del manifest della mia extension. Non avendo trovato il codice sorgente del SDK, ho disassemblato il programma VsixUtil.exe (installato in: C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin) con la preziosa utility ILSpy, avendo cura di caricare anche gli assembly Newtonsoft.Json.dll, Microsoft.VisualStudio.ExtensionEngineContract.dll e Microsoft.VisualStudio.ExtensionEngine.dll, presenti nella sottocartella lib. Ho quindi esportato il progetto (“File” → “Save Code…”) e l’ho aperto con Visual Studio 2022.

Dopo aver aggiunto i riferimenti ai suddetti assembly, ho riscontrato che il progetto non veniva compilato a causa ell’errore “CS0220 The operation overflows at compile time in checked mode” relativo al seguente codice in NgenData.GetHashCode():

return (int)((678645121 * -1521134295 + StringComparer.OrdinalIgnoreCase.GetHashCode(NgenApplication)) * -1521134295 + NgenArchitecture) * -1521134295 + NgenPriority;

Per tagliar corto, ho semplicemente sostituito il codice incriminato con: return base.GetHashCode();

Dopo questa modifica sono finalmente riuscito a compilare il progetto, ma all’esecuzione, nonostante avessi compilato senza ottimizzazioni e avviato in configurazione “Debug”, Visual Studio mi informava che stavo comunque cercando di eseguire una build con la configurazione “Release” e che pertanto i breakpoint non sarebbero stati efficaci.

Popup "Just My Code Warning" di Visual Studio.

Dopo alcune verifiche, ho riscontrato che il responsabile era l’attributo DebuggableAttribute, specificato nel file AssemblyInfo.cs:

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

Finalmente, dopo aver commentato l’attributo e ricompilato, sono riuscito ad avviare una sessione di debug.

Come sospettavo, l’errore restituito dal tool, che ho osservato essere un’eccezione Microsoft.VisualStudio.ExtensionManager.InvalidExtensionManifestException, nasconde il vero problema, che è indicato dalla inner exception:

FileNotFoundException: Could not load file or assembly 'Microsoft.VisualStudio.Validation, Version=17.6.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified
Dettagli dell'eccezione in Visual Studio

A questo punto la soluzione al problema è stata chiara: ho cercato sulla mia macchina il file Microsoft.VisualStudio.Validation.dll (trovato in varie cartelle, tra cui: C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Microsoft\VisualStudio\v17.0\VSSDK) e l’ho copiato nella cartella in cui è presente VsixUtil.exe (C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin).

Se solo il messaggio di errore restituito da VsixUtil.exe fosse stato più chiaro, penso che avrei individuato il problema molto più velocemente, magari utilizzando Fusion Log. L’errore, invece, mi ha fatto pensare a un problema di validazione dell’extension, mandandomi completamente fuori strada.

TL;DR: La soluzione, in breve.

Copiare il file: Microsoft.VisualStudio.Validation.dll
da: C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Microsoft\VisualStudio\v17.0\VSSDK
a: C:\Program Files\Microsoft Visual Studio\2022\Professional\VSSDK\VisualStudioIntegration\Tools\Bin.

La soluzione è semplice, ma che fatica per arrivarci! 😓

Il chip Neuralink (di Elon Musk) trasmetterà musica direttamente al cervello

Quando ho visto questo meme sulla possibilità del chip di Neuralink (di cui Elon Musk è cofondatore) di trasmettere musica al cervello, non ho resistito… ed ecco il risultato! 😄

Neuralink meme

Per approfondire:

Risultati del BASIC 10Liner Contest 2023

Sabato scorso sono stati pubblicati i risultati dell’undicesima edizione del BASIC 10Liner contest, tradizionale competizione a cui si può partecipare realizzando giochi e programmi per computer a 8 bit in sole 10 righe di codice in linguaggio BASIC.

Classifica BASIC 10Liners 2023

Purtroppo quest’anno, a differenza delle passate edizioni, non sono riuscito a entrare nella TOP 10. Infatti, i miei due giochi in gara per la categoria PUR-80, A Day At The Animal Races (ZX Spectrum) e Squash Trainer (ZX81), si sono classificati 16esimo e 27esimo rispettivamente, su 37 concorrenti.

Complimenti in particolare a RAX, che con Thrust 10 e Pacman 10, entrambi per Oric Atmos, si è aggiudicato sia la prima sia la seconda posizione della stessa categoria.

Thrust10 di RAX, per Oric Atmos
Pacman10 di RAX, per Oric Atmos

Sperando di fare meglio il prossimo anno, mi divertirò provando gli altri giochi e in particolare i vincitori!

Versione in Inglese

Serpenti, serpenti e ancora serpenti!

Il 10 aprile sarà il termine ultimo per partecipare alla Retro Snake Game Jam, sfida di retro-programmazione organizzata dal gruppo Retro Programmers Inside in collaborazione con Phaze101 e ospitata sulla piattaforma itch.io. Lo scopo della sfida è la realizzazione di un gioco in cui vi sia un serpentello, non importa che sia il protagonista del gioco o il “cattivo” da evitare o da sconfiggere. Sono ammessi giochi per computer e console a 8/16 bit basati sulle CPU appartenenti alle “famiglie” Z80, 6502 e Motorola 68K.

baSnake

Ho quindi pensato bene di candidare il mio baSnake, realizzato ormai 6 anni fa in BASIC per lo ZX Spectrum, proprio in occasione di un’altra game jam su itch.io e successivamente arricchito per sfruttare alcune caratteristiche dello ZX Spectrum Next. Per poter partecipare, ho dovuto preparare una versione ad hoc, contenente il messaggio “Partecipante alla Retro Programmers Inside (RPI) and Phaze101 Game Jam“, come richiesto dal regolamento della Retro Snake Game Jam. Tale versione è disponibile, insieme alle precedenti, sulla pagina itch.io di baSnake.

baSnake in esecuzione sullo ZX Spectrum Next

YAS

baSnake non è stato l’unico progetto in cui ho avuto a che fare con serpentelli pixellosi. Nel 2015, infatti, mentre mi dilettavo con lo sviluppo di CHIP-OTTO, il mio interprete CHIP-8 per ZX Spectrum e di WEB-OTTO, la controparte per browser web, ho realizzato un clone di Snake proprio per questa piattaforma, chiamato – guarda un pò – YAS – Yet Another Snake (ancora un altro serpente). Sebbene scritti in linguaggi completamente diversi, baSnake eredita da YAS la possibilità di selezionare lo scenario in cui giocare.

Recentemente, ho appreso con piacere che YAS è stato incluso nella distribuzione ufficiale di EMMA02, emulatore multipiattaforma in grado di eseguire l’interprete CHIP-8 originariamente sviluppato per i computer della serie Cosmac.

Video che mostra YAS in azione sul port per ZX Spectrum Next di CHIP-OTTO

ZNAKE

Non è ancora tutto: per arrivare alla mia prima implementazione di un gioco in stile Snake, occorre andare ancora più indietro nel tempo, per l’esattezza al 2005. In quell’anno, infatti, realizzai ZNAKE, il mio primo progetto completo (seppur minimale) di videogioco per retrocomputer.

ZNAKE è infatti un semplice giochino in stile Snake, Worm, Nibbles, etc… per Sinclair ZX Spectrum. Lo scopo del gioco è pilotare il serpente (nelle direzioni alto / basso / sinistra / destra ) in modo che possa mangiare le mele che appaiono sullo schermo, evitando di urtare i muri o il serpente stesso. Per ogni mela ingerita, il giocatore guadagna punti, ma il corpo del serpente si allunga, rendendo così più difficile la partita.

Caricamento di Znake nell’emulatore RealSpectrum, su Windows XP

ZNAKE nasceva dal desiderio di realizzare un gioco, seppur semplice, per il celebre computer ZX Spectrum, al quale sono particolarmente affezionato. Già da tempo avevo avuto modo di conoscere il fantastico Z88DK, ma non ero mai andato oltre qualche semplice prova finchè un giorno, nel 2005, ispirato da un tutorial (purtroppo ho perso il riferimento, si parla di troppi anni fa) sul sistema a finestre X, decisi di implementare il serpentello come lista concatenata. Giocando così con malloc e putchar, ho implementato ZNAKE quasi completamente in C, utilizzando un minimo di Assembly. Non pago, per completare l’opera ho poi provveduto a trasferire ZNAKE su nastro, in modo da poterlo giocare sul vero Spectrum, oltre che sugli emulatori.

Successivamente, grazie all’emulatore Qaop, avevo anche creato un widget di Dashboard (che adesso chiameremmo “app“) per MacOSX e una versione per qualche desktop di Linux.

ZNAKE è quindi un progetto doppiamente retro, in quanto si tratta di un gioco per retrocomputer, realizzato quasi 20 anni fa (l’iBook G4 che utilizzavo all’epoca è ormai un retrocomputer esso stesso!). Tuttavia, giocando a ZNAKE, si può già avere un’idea di quale sarà lo stile di baSnake.

Dopo questo tuffo nel passato, ho pensato che anche ZNAKE avrebbe potuto partecipare alla Retro Snake Game Jam, previo inserimento del succitato messaggio. Il programma originale non è compatibile con le versioni recenti di z88dk, per cui ho dovuto fare alcune modifiche, cogliendo l’occasione per migliorare il codice, eliminando parti scritte da me a favore delle funzioni presenti nelle librerie fornite con z88dk. Il risultato è quindi, come al solito, disponibile per il download o per giocare tramite browser web (grazie all’emulatore JSSpeccy3) sulla pagina dedicata nella piattaforma itch.io.

Video che mostra il gameplay di ZNAKE

Direi, quindi, che 3 implementazioni di Snake bastano e avanzano!
Anche se una versione BASIC 10 Liner, magari… 🙂

Link e riferimenti

English version

Rettangoli colorati con ugBASIC

Screenshot che mostra i rettangoli colorati sullo ZX Spectrum

Da tempo desideravo provare ugBASIC, linguaggio isomorfo compilato, che permette di produrre programmi per una moltitudine di piattaforme (computer e console) a 8 bit a partire da un unico codice sorgente. A rendere ancora più accattivante il tutto è ugBASIC IDE, un ambiente integrato per Windows che permette di installare le toolchain per le piattaforme desiderate e scrivere, compilare ed eseguire programmi mediante gli appositi emulatori con pochissimi click.

Ho quindi colto l’occasione offerta dalla sfida della settimana, indetta lo scorso venerdì sul gruppo Facebook RetroProgramming Italia, per cimentarmi con ugBASIC. Lo scopo della sfida è realizzare un programma (in qualsiasi linguaggio e per qualsiasi macchina a 8/16 bit) per disegnare rettangoli colorati in modo molto veloce.

Screenshot C64 che mostra l'obiettivo della sfida
Immagine rappresentativa dell’obiettivo della sfida della settimana
(text mode standard del Commodore 64)

L’animazione dei rettangoli colorati ha immediatamente richiamato alla mia mente il programma dimostrativo BGIDemo, incluso nelle distribuzioni Turbo Pascal degli anni ’80 per mostrare le potenzialità delle librerie grafiche di Borland e che in gioventù ammiravo con stupore. Che nostalgia!

Screenshot del programma BGIDemo per Turmo Pascal
Random bars – dal programma BGIDemo per Turbo Pascal 5 di Borland

Ho quindi buttato giù il seguente programmino, per disegnare i rettangoli mediante stringhe formate da spazi vuoti, utilizzando posizione, dimensione e colore casuali.

BITMAP ENABLE
sc = SCREEN COLUMNS: sr = SCREEN ROWS: pc = PAPER COLORS
CLS
LOCATE 0, sr-1
PRINT "COLS:";sc;" ROWS:";sr;" COLORS:";pc;
s$ = "": FOR i=1 TO sc: s$ = s$ + " ": NEXT
DO
	PAPER RND(pc)
	x = RND(sc)
  	y = RND(sr - 1)
  	w = 1 + RND(sc - x)
  	h = 1 + RND(sr - 1 - y)
  	ss$ = LEFT$(s$, w)
  	FOR yy = y TO y+h-1
  		LOCATE x, yy
  		PRINT ss$;
  	NEXT
LOOP

Ho poi compilato il programma utilizzando lo ZX Spectrum come target, riscontrando però un paio di anomalie, che si possono osservare in questo video. L’istruzione PAPER, infatti, oltre allo sfondo alterava anche il colore del bordo. Inoltre, mentre nonostante il numero di colori restituito PAPER COLORS fosse 16, in output erano visibili solo gli 8 colori senza l’attributo bright.

Ho segnalato i problemi all’autore di ugBASIC Marco Spedaletti, il quale, dopo solo poche ore, ha rilasciato un COLDFIX che ha risolto entrambi i bug. Se solo il supporto di [inserisci qui il nome di una qualsiasi azienda fornitrice di energia/servizi telefonici] fosse altrettanto solerte, si vivrebbe in un mondo migliore, ma questa è un’altra storia…

Dopo un aggiornamento dei compilatori direttamente in ugBASIC IDE, sono riuscito ad ottenere una versione corretta dell’eseguibile, come si può osservare in questo video:

I rettangoli colorati sullo ZX Spectrum (emulatore Fuse)

Infine, dato che ugBASIC nasce come ambiente di sviluppo multipiattaforma, ho compilato una versione del programma per MSX e qui si può osservare il risultato:

I rettangoli colorati su MSX (emulatore openMSX)

Link e Riferimenti

Screenshot che mostra i rettangoli colorati sullo ZX Spectrum
I rettangoli colorati sullo ZX Spectrum