Archive for aprile 2023

Non tutte le funzioni sono uguali

Posted on 19 aprile 2023. Filed under: Senza categoria |

Continuando i miei esperimenti di matematica e astronomia, ho scoperto una cosa che magari sapete già ma me ne sono accorto solo ora.

Ho un file Excel scaricato da Internet per il calcolo di Ascensione Retta e declinazione per le varie stelle, pianeti e lune.

Il codice è scritto in VBA.

Lo traduco in codice VB.NET, e procedo pensando che il funzionamento delle funzioni, quindi gli argomenti fossero simili.

Se per esempio, le funzioni trigonometriche SIN, COS, TAN etc etc hanno il medesimo funzionamento, non si può dire la stessa cosa per la funzione ARCTAN.2, che in VB.NET si chiama ATAN2.

Vediamo un esempio:

Nel file Excel ci metto:

In A1 ci metto X e in A2 ci metto il valore di Y.

In A3 la seguente formula:

=ARCTAN.2(A1;A2)

Come risultato mi dà 0,950546841

Apro Visual Studio, creo un nuovo progetto in VB.NET e ci metto il seguente codice:

Dim A = 0.5

Dim B = 0.7

MsgBox(Math.Atan2(A,B))

Risultato: 0,620249485

Il modo corretto per ottenere l’angolo è: Math.Atan2(B,A)

Oppure

Math.Atan(B/A)

In effetti guardando i siti di riferimento:

https://support.microsoft.com/it-it/office/funzione-arctan-2-c04592ab-b9e3-4908-b428-c96b3a565033

e

https://learn.microsoft.com/en-us/dotnet/api/system.math.atan2?view=net-8.0

Notiamo che X e Y sono invertiti.

Pubblicità
Leggi l'articolo intero | Make a Comment ( None so far )

Ottenere un GUID

Posted on 7 aprile 2023. Filed under: Senza categoria |

La mia passione per la matematica con il connubio dell’informatica, mi portano sempre più in un mondo fatto di algoritmi matematici per ottenere codici, numeri etc etc.

In questo articolo vedremo cosa è un GUID, a cosa serve e come ottenerlo, ovviamente con codice VB.NET

Siete pronti? Ovviamente aprite prima Visual Studio, qualsiasi versione e create un progetto WPF o Windows Forms e poi create un pulsante. All’interno del pulsante andremo a mettere il codice.

Ma vediamo prima un po’ di teoria sul GUID.

Il GUID (Globally Unique Identifier, identificatore unico globale) è un numero pseudo-casuale usato nella programmazione software, per poter distinguere vari oggetti. Il tipo più noto di GUID è l’utilizzo di Microsoft dell’UUID, ideato dalla Open Software Foundation, ma vi sono anche altri usi, come quello all’interno di XML.

Nella pratica un GUID è un numero di 128 bit (16 byte) in formato esadecimale quale può essere:

3F 25 04 E0 4F 89 11 D3 9A 0C 03 05 E8 2C 33 01


I GUID vengono scritti tra parentesi graffe e divisi in cinque blocchi, uno di 4 byte, tre di 2 byte e uno di 6 byte. Nell’esempio precedente si avrebbe:

{3F2504E0-4F89-11D3-9A0C-0305E82C3301}
La notazione è quindi una sequenza formata dai seguenti gruppi di caratteri, divisi da un trattino (-).

Gruppo 1 (8 caratteri)
Gruppo 2 (4 caratteri)
Gruppo 3 (4 caratteri)
Due elementi iniziali del gruppo 4 (4 caratteri)
Due elementi rimanenti del gruppo 4 (4 caratteri) seguiti dal gruppo 5 (8 caratteri, per un totale di 12 caratteri)

Il GUID viene utilizzato per identificare in maniera univoca un determinato componente software COM; in questo modo due versioni (potenzialmente incompatibili) di uno stesso componente, anche con lo stesso nome, possono essere distinte tramite i loro codici GUID. Sebbene il GUID non garantisca un’effettiva unicità, il numero possibile di combinazioni (2128) è talmente elevato da scongiurare una coincidenza tra due codici. Per rendere l’idea, considerando che in tutto l’universo osservabile sono contenute 5×1022 stelle, ad ogni singola stella potrebbero essere assegnati 6.8×1015 diversi GUID.

Oltre ai componenti, sono marcati tramite GUID anche i documenti Office e i file in formato Advanced Streaming Format. La maggior parte dei GUID utilizzati da diverse applicazioni sono contenute nel registro di sistema di Windows.

Vediamo ora uno dei metodi di calcolo per ottenere un GUID. Il codice è in VB.NET:

Dim strGUID As String
strGUID = System.Guid.NewGuid.ToString()
MessageBox.Show("Nuovo codice GUI: " & strGUID)

Tutto il lavoro viene svolto dalla libreria System (mscorlib).

Il codice è in C# ma convertito in VB.NET e alleggerito diventa:

    Public Shared Function UUID_Make() As String
        Dim abData As Byte() = New Byte(15) {}
        Dim strHex As String = Nothing
        Dim rnd As Random = New Random()
        rnd.NextBytes(abData)
        abData(6) = CByte((&H40 Or (CInt(abData(6)) And &HF)))
        abData(8) = CByte((&H80 Or (CInt(abData(8)) And &H3F)))
        strHex = ByteArrayToString(abData)
        strHex = strHex.Substring(0, 8) & "-" & strHex.Substring(8, 4) & "-" & strHex.Substring(12, 4) & "-" & strHex.Substring(16, 4) & "-" & strHex.Substring(20, 12)
        Return strHex
    End Function

    Public Shared Function ByteArrayToString(ByVal ba As Byte()) As String
        Dim hex As StringBuilder = New StringBuilder(ba.Length * 2)
        For Each b As Byte In ba
            hex.AppendFormat("{0:x2}", b)
        Next
        Return hex.ToString()
    End Function

Creiamo un nuovo pulsante e lo associamo a questo codice:

    Dim strUuid As String = Nothing
    strUuid = UUID_Make()
    MessageBox.Show("Nuovo codice GUI: " & strUuid)

Faccio presente una annotazione.

L’algoritmo specificato dalla OSF e utilizzato da Microsoft per la generazione dei GUID è stato oggetto di critica. Infatti tale algoritmo utilizzava come punto di partenza gli indirizzi MAC delle schede di rete degli utenti che lo generavano. Il vantaggio di questo metodo era l’assoluta certezza dell’univocità del GUID generato (perché non esistono due indirizzi MAC uguali), ma in questo modo era possibile risalire da un GUID al computer che l’aveva generato, con potenziali conseguenze sulla privacy e sulla sicurezza.

Dopo che venne alla luce questo problema, Microsoft modificò l’algoritmo (implementato nell’API UuidCreate) in modo che non dipendesse più dagli indirizzi MAC. È ancora possibile generare volontariamente GUID dipendenti dall’indirizzo MAC usando l’API UuidCreateSequential.

Per sapere se un GUID è stato generato con la prima o con la seconda versione dell’algoritmo, bisogna fare riferimento alla prima cifra del terzo blocco. Quindi, nell’esempio

3F2504E0-4F89-11D3-9A0C-0305E82C3301


Se questa cifra è un 1, come in questo caso, il codice è generato dalla prima versione; viceversa, se la cifra è un 4, è generato dalla seconda.

Fonti:

www.wikipedia.it

https://social.msdn.microsoft.com/Forums/vstudio/en-US/4956142a-0a5d-4f1e-b102-93a3eea1b5d5/does-guidnewguid-produce-uuid-version-4-according-to-rfc4122?forum=netfxbcl

Leggi l'articolo intero | Make a Comment ( None so far )

Liked it here?
Why not try sites on the blogroll...