Monthly Archives: May 2013

[C#] Générateur de combinaisons de mots

csharp

Une fois n’est pas coutume, j’ai eu une problématique intéressante en C# avec mes élèves ingénieurs.

La problématique était la suivante: réaliser une fonction qui génère toutes les combinaisons possibles de mots en connaissant les lettres possibles et la taille des mots. Après plusieurs minutes (une bonne heure en fait) je suis parvenu à faire çà:

static public IEnumerable<string> CreateCombinations(IEnumerable<char> input, int length)
        {
            foreach (var c in input)
            {
                if (length == 1)
                    yield return c.ToString();
                else
                {
                    foreach (var s in CreateCombinations(input, length - 1))
                        yield return c.ToString() + s;
                }
            }
        }

Pour l’utiliser c’est simple:

static void Main(string[] args)
        {
            StreamWriter sw = new StreamWriter("out.txt", false);
            foreach (var s in CreateCombinations("abcdefghijklmnopqrzstuvwxyz", 2))
            {
                sw.WriteLine(s);
            }
            sw.Close();
            Console.WriteLine("end");
            Console.ReadLine();
        }

Merci Internet car j’ai trouvé l’astuce en fouillant un grand nombre de forums. Pas si simple que çà !

Cure de printemps pour ZeM.fr

zem zorro

C’est le printemps (oui oui je vous assure c’est bien le printemps, même s’il pleut des trombes d’eau) et du coup ZeM.fr change de déguisement et s’offre un relooking: des couleurs acidulées pour des articles décapants 🙂

Et quoi de mieux qu’un Tux Zorro pour Zem.fr 🙂 Cela sera donc notre nouveau logo bien représentatif de notre blog: prendre aux riches pour donner aux pauvres (je sais que celà ressemble plus à robin des bois qu’à Zorro mais les collants verts c’est pas trop çà héhé).

[.Net] Classe HardwareId, identifiant d’ordinateur

hardwareid

Dans un de mes projets, je suis amené à identifier chaque machine sur laquelle mon logiciel est installé. Pour faire çà j’ai pensé à faire un identifiant spécifique à chaque ordinateur en me basant sur des propriétés matérielles.

La classe permet de générer un Hardware Id, c’est à dire un identifiant spécifique à chaque machine.
Cet identifiant peut ensuite être utilisé pour développer un système de gestion de licences ou bien pour nommer une instance de logiciel.

Cette classe se base sur les informations matérielles de la machine en les récupérant grâce à WMI.

Voici la classe HardwareId:

Imports System.Management
Imports System.Security.Cryptography
Imports System.Text
'Classe qui permet de générer un hardware id (pratique pour la gestion des licenses par exemple)
Public Class HardwareId
Private Shared _Hash() As Byte
#Region "Constructeur"
Shared Sub New()
Try
_Hash = GenerateHash(GenerateHardString())
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
End Sub
#End Region
#Region "Fonctions de generation"
'Fonction qui genere un HardwareId sous forme de Md5
Public Shared Function GenerateMd5() As String
Dim ret As String = vbNullString
Try
ret = GenerateMd5(_Hash)
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
'Fonction qui genere un HardwareId sous forme d'entier
Public Shared Function GenerateInteger() As Integer
Dim ret As Integer = 0
Try
ret = GenerateMd5.GetHashCode
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
'Fonction qui genere un HardwareId sous forme de Guid
Public Shared Function GenerateGuid() As String
Dim ret As String = vbNullString
Try
ret = GenerateGuid(_Hash)
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
#End Region
#Region "Fonctions d'encryption"
'Fonction qui genere la chaine de base
Private Shared Function GenerateHardString() As String
Return "CPU >> " & GetCPUId() & vbCrLf & "BIOS >> " & GetBiosId() & vbCrLf & "MOTHERBOARD >> " & GetMotherboardId() & vbCrLf & "DISK >> " & GetDiskId() & vbCrLf & "GRAPHICS >> " & GetGraphicsId() & vbCrLf & "MACADDRESS >> " & GetMacId()
End Function
'Fonction qui génère le hash
Private Shared Function GenerateHash(ByVal str As String) As Byte()
Dim md5 As New MD5CryptoServiceProvider()
Dim enc As New ASCIIEncoding()
Return md5.ComputeHash(enc.GetBytes(str))
End Function
'Fonction qui formatte la sortie Guid
Private Shared Function GenerateGuid(ByVal b() As Byte) As String
Dim ret As String = vbNullString
Try
For i As Integer = 0 To b.Length - 1
Dim bb As Byte = b(i)
Dim n, n1, n2 As Integer
n = CInt(bb)
n1 = n And 15
n2 = (n >> 4) And 15
If n2 > 9 Then
ret &= Chr(n2 - 10 + Asc("A")).ToString
Else
ret &= n2.ToString
If n1 > 9 Then
ret &= Chr(n1 - 10 + Asc("A")).ToString()
Else
ret &= n1.ToString()
End If
If (((i + 1) <> b.Length) AndAlso ((i + 1) Mod 2 = 0)) Then
ret &= "-"
End If
End If
Next
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
'Fonction qui formatte la sortie Md5
Private Shared Function GenerateMd5(ByVal b() As Byte) As String
Dim ret As String = vbNullString
Try
Dim i As Integer
For i = 0 To b.Length - 1
ret &= b(i).ToString("x2")
Next i
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
#End Region
#Region "Recupération d'informations système"
'Fonction qui récupère les informations WMI
Private Shared Function GetWMI(ByVal wmiClass As String, ByVal wmiProperty As String, Optional ByVal wmiMustBeTrue As String = vbNullString) As String
Dim ret As String = vbNullString
Try
Dim mc As New ManagementClass(wmiClass)
Dim moc As ManagementObjectCollection = mc.GetInstances
For Each mo As ManagementObject In moc
Dim cont As Boolean = True
If wmiMustBeTrue <> vbNullString Then
If mo(wmiMustBeTrue) Is Nothing Or Trim(mo(wmiMustBeTrue).ToString.ToLower) <> "true" Then
cont = False
End If
End If
If cont Then
If ret = vbNullString Then
Try
If mo(wmiProperty) IsNot Nothing Then
ret = mo(wmiProperty).ToString()
Exit For
End If
Catch ex As Exception
End Try
End If
End If
Next
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
'Fonction qui retourne le numero de serie en fonctions de infos wmi recuperees
Private Shared Function GetSerial(ByVal wmiClass As String, ByVal wmiProperties() As String, ByVal stopAfterMatch As Boolean, Optional ByVal wmiMustBeTrue As String = vbNullString) As String
Dim ret As String = vbNullString
Try
For i As Integer = 0 To wmiProperties.Length - 1
Try
ret &= GetWMI(wmiClass, wmiProperties(i), wmiMustBeTrue)
If stopAfterMatch AndAlso ret <> vbNullString Then
Exit For
End If
Catch ex As Exception
End Try
Next
Catch ex As Exception
Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
End Try
Return ret
End Function
'Fonction qui retourne le CPU Id
Private Shared Function GetCPUId() As String
Return GetSerial("Win32_Processor", {"UniqueId", "Name", "Manufacturer", "MaxClockSpeed"}, True)
End Function
'Fonction qui retourne le Bios Id
Private Shared Function GetBiosId() As String
Return GetSerial("Win32_BIOS", {"Manufacturer", "SMBIOSBIOSVersion", "IdentificationCode", "SerialNumber", "ReleaseDate", "Version"}, False)
End Function
'Fonction qui retourne le Disk Id
Private Shared Function GetDiskId() As String
Return GetSerial("Win32_DiskDrive", {"Model", "Manufacturer", "Signature", "TotalHeads"}, False)
End Function
'Fonction qui retourne le Motherboard Id
Private Shared Function GetMotherboardId() As String
Return GetSerial("Win32_BaseBoard", {"Model", "Manufacturer", "Name", "SerialNumber"}, False)
End Function
'Fonction qui retourne le Graphics Id
Private Shared Function GetGraphicsId() As String
Return GetSerial("Win32_VideoController", {"DriverVersion", "Name"}, False)
End Function
'Fonction qui retourne l'addresse mac de la premiere carte reseau active
Private Shared Function GetMacId() As String
Return GetSerial("Win32_NetworkAdapterConfiguration", {"MACAddress"}, False, "IPEnabled")
End Function
#End Region
End Class

Pour utilise la classe HardwareId, il suffit de l’exécuter comme cela:

'Exemple d'utilisation:
Dim k As String = HardwareId.GenerateMd5
Console.WriteLine(k)
k = HardwareId.GenerateGuid
Console.WriteLine(k)
k = HardwareId.GenerateInteger.ToString
Console.WriteLine(k)

Vous pouvez télécharger la solution HardwareId Projet

[VB.Net] Générateur de mots

Pour la réalisation d’un nouvel outil de sécurité j’ai dû généré un dictionnaire de mots allant de 3 à 8 lettres.
Pour faire çà, j’ai donc développé la classe suivante:

'Exemple: Fonction qui génère les fichiers de words de 5 lettres
Private Sub Generator()
Call WordGenerator.Start(5)
Dim aLine As String = WordGenerator.GetString()
Dim tmp As New List(Of String)
While aLine IsNot Nothing
tmp.Add(aLine)
FileCounter += 1
If FileCounter = FileMax Then
Dim sw As New StreamWriter(Path.Combine("files", Environment.TickCount.ToString), False, System.Text.Encoding.UTF8)
For i As Integer = 0 To tmp.Count - 1
sw.WriteLine(tmp(i))
Next
sw.Close()
tmp.Clear()
FileCounter = 0
End If
aLine = WordGenerator.GetString()
End While
End Sub
'Classe qui génère des words
Public Class WordGenerator
Private Const _charStart As Integer = 33 'Code ASCII de la premiere lettre
Private Const _charEnd As Integer = 126 'Code ASCII de la dernière lettre
Public Shared Started As Boolean = False
Private Shared Arr() As Integer
Public Shared Sub Start(ByVal num As Integer)
ReDim Arr(num - 1)
For i As Integer = 0 To num - 1
Arr(i) = _charStart
Next
Started = True
End Sub
Public Shared Function GetString(Optional ByVal idx As Integer = 0) As String
Dim ret As String = Nothing
If Started Then
Arr(idx) = Arr(idx) + 1
If Arr(idx) > _charEnd Then
Arr(idx) = _charStart
If idx + 1 < Arr.Length Then
ret = GetString(idx + 1)
End If
Else
For i As Integer = 0 To Arr.Length - 1
ret &= Chr(Arr(i))
Next
End If
End If
Return ret
End Function
End Class

Vous générerez rapidement plusieurs Giga de mots uniques. Par exemple, pour 5 lettres, vous génèrerez 10000 millions de mots uniques

 

Résultat du concours CodinGame ASCII

Pour rigoler j’ai essayé de faire l’épreuve du CodinGame sur l’art ASCII.

Voici le code que j’ai fait en une vingtaine de minutes:

Imports System.IO
Module Module1
Sub Main(ByVal args() As String)
Dim s As New Stopwatch
s.Start()
If args.Length > 0 Then
If File.Exists(args(0)) Then
Dim lines() As String = File.ReadAllLines(args(0))
If lines.Count >= 4 Then
Dim largeur As Integer = CInt(lines(0))
'Dim hauteur As Integer = CInt(lines(1))
Dim mot As String = Trim(lines(2))
Dim linesParse As New List(Of String)
For i As Integer = 3 To lines.Count - 1
linesParse.Add(lines(i))
Next
Call AsciiLetter.SetLetters(largeur, linesParse)
Console.WriteLine(AsciiLetter.GetText(mot))
End If
End If
End If
s.Stop()
Console.WriteLine(s.ElapsedMilliseconds)
Console.ReadLine()
End Sub
Public Class AsciiLetter
Public Shared Letters(26) As List(Of String)
Public Shared Sub SetLetters(ByVal l As Integer, ByVal lines As List(Of String))
For i As Integer = 0 To lines.Count - 1
Dim line As String = lines(i)
Dim pos As Integer = 0
For j As Integer = 0 To 26
If i = 0 Then
Letters(j) = New List(Of String)
End If
Letters(j).Add(Mid(line, 1 + (j * l), l))
Next
Next
End Sub
Public Shared Function GetText(ByVal s As String) As String
Dim h As Integer = Letters(26).Count
Dim l As New List(Of List(Of String))
s = s.ToUpper
For i As Integer = 0 To s.Length - 1
Dim code As Integer = Asc(s(i)) - 65
If code >= 0 AndAlso code <= 25 Then
l.Add(Letters(code))
Else
l.Add(Letters(26))
End If
Next
Dim ret As String = vbNullString
For i As Integer = 0 To h - 1
For j As Integer = 0 To l.Count - 1
ret &= l(j)(i)
Next
If i < h - 1 Then ret &= vbCrLf
Next
Return ret
End Function
End Class
End Module

La solution dotnet est téléchargeable ici CodinGame ASCII.

Monter un ordinateur dédié au calcul de Bitcoin ou de Litecoin

bitcoin rig

Comme nous l’avons vu dans les articles précédents, une des manières les plus rapides pour obtenir des Bitcoins ou des Litecoins (ou tout autre cryptocoins) est d’utiliser la puissance de calcul d’un ordinateur.

Il est possible d’utiliser votre ordinateur mais le mieux reste de monter une machine, un super calculateur, dédié au mining. Ces ordinateurs dédiés au mining de bitcoins ou litecoins sont appelés rig.

Nous allons donc voir quelles sont les possibilités qui s’offrent à nous en détaillant 3 points:

  • le choix du matériel dédié au mining
  • les logiciels à installer pour pouvoir miner des cryptocurrencies
  • la supervision de votre super calculateur (rig)

Qu’est-ce qu’un rig de mining de Litecoins ?

On appelle rig un ordinateur qui va être dédié au calcul des litecoins ou des bitcoins. Ces ordinateurs sont dédiés à cette tâche et ne servent qu’à çà. Ils fonctionnent généralement 24 heures sur 24.

Les rigs utilisent plusieurs cartes graphiques (jusqu’à 5 sous Windows, jusqu’à 8 sous Linux) pour calculer les cryptocoins.

Ce sont donc des machines avec un équipement spécifique qui, comme vous allez le voir après, n’est pas forcément un matériel très cher.

L’avantage de ces machines est qu’elles font très bien leur job à savoir calculer des bitcoins ou des litecoins et qu’elles sont simples à installer, à configurer et à administrer.

Les inconvénients majeurs d’un rig sont la consommation électrique élevée (car il faut être capable de faire fonctionner plusieurs cartes graphiques), le bruit et la chaleur dégagée.

Choisir son matériel dédié au mining

Le choix de votre matériel dédié au mining de Bitcoins ou de Litecoins va dépendre de plusieurs éléments:

  • votre budget (car les cartes graphiques peuvent coûter cher)
  • votre compteur électrique (inutile de faire 5 rigs avec 5 cartes graphiques si vous avez un compteur électrique pas assez puissant)
  • l’endroit où vous allez mettre votre rig en sachant qu’il va dégager de la chaleur, faire du bruit et qu’il nécessite une connexion internet.

Les cartes graphiques

Une fois que vous serez fixé sur ces points, vous devrez décider du nombre de cartes graphiques de votre mining rig. Personnellement je vous conseille de ne pas dépasser 5 cartes graphiques simple GPU (style HD7950) ou 3 cartes graphiques bi-GPU (style HD5970).

De la même manière, ne prenez que des cartes graphiques ATI (car beaucoup plus performantes pour faire du bitcoin mining ou du litecoin mining).
Je vous conseille également de ne mettre que les même séries de cartes sur un rig. Ainsi, évitez de mettre des 7950 avec des 6950 sous peine d’avoir des soucis de drivers.

Pensez également que les rigs peuvent être évolutifs. Vous pouvez ainsi décider de faire un rig avec une seule carte graphique puis, lorsque vos finances le permettront, ajouter une ou deux cartes.

La carte mère

Une fois fixé sur les cartes graphiques, il vous faut une carte mère capable de toutes les supporter. Une carte mère avec 3 ou 4 slots pcie x16 coûte relativement cher. Par chance, il est possible de convertir des ports pcie x1 en port pcie x16. De plus, il nous faut juste le connecteur, la vitesse n’est pas très importante pour le mining.

Encore une fois, afin de limiter les coûts, je vous conseille de prendre des cartes mères AMD style Asrock Extrême 3 ou Asrock Extreme 4. Elles coûtent dans les 80€ et supportent facilement 4 cartes graphiques.

Le processeur

Concernant le processeur, prenez le moins cher car celui-ci ne joue pas un rôle très important dans le calcul des bitcoins ou des litecoins (car on utilise le GPU mining).

La mémoire

Pour la mémoire, 4Go sont suffisants car c’est la mémoire des cartes graphiques qui sera sollicitée. Toutefois, par confort (et vu le prix de la DDR3), je vous conseille de prendre une barrette de 8Go.

Le stockage

Pour installer le système d’exploitation, deux possibilités:

  • sur une clé USB: pas cher mais lent
  • sur un disque dur: un peu plus cher mais plus fiable. Je vous conseille de prendre un disque au format 2.5 qui ne consommera pas beaucoup.

L’alimentation

L’alimentation est un élément crucial dans un rig destiné au mining de bitcoins ou de litecoins. En effet, nos cartes graphiques vous tournez à 100% 24 heures sur 24. Par conséquent elles vont consommées un maximum d’électricité.

Je vous recommande de prendre une alimentation de 1000 watts si votre rig comporte 3 cartes graphiques, ou une de 1200 watts si vous avez 4 cartes graphiques (ou 3 cartes graphiques bi-gpu).

Le boitier

Pour le choix du boitier vous allez pouvoir vous faire plaisir et laisser votre imagination vous guider. En effet, même si vous pouvez acheter un boitier (cher et souvent pas conçu pour recevoir et refroidir autant de cartes graphiques), je vous conseille d’utiliser (ou de fabriquer) un châssis très aéré.
Personnellement j’utilise des cagettes plastiques achetées chez Casto pour 6€ :-).

Divers

Je ne parle par d’écran, de lecteur DVD et des autres périphériques car ceux-ci ne seront nécessaires que pour l’installation.

Le choix des cartes graphiques pour miner du Bitcoin ou du Litecoin

Il existe des dizaines de cartes graphiques ATI différentes, toutes plus ou moins performantes.
Voici celles que j’utilise:

  • HD7950: 550Mh/s pour bitcoin, 550Kh/s pour Litecoin, 200€ neuve
  • HD6950 / HD6970: 450Mh/s pour bitcoin, 450Kh/s pour Litecoin, 100€ occasion
  • HD5970: 700Mh/s pour bitcoin, 700Kh/s pour Litecoin, 250e occasion

Les cartes graphiques HD7950 et HD6950 / hd6970 sont performantes, pas chères, silencieuses, se trouvent facilement et ne chauffent pas trop.

Les cartes graphiques 5970 sont des cartes bi-GPU et donc très performantes mais elles coûtent chères, chauffent beaucoup et se trouvent difficilement.

Pour avoir plus d’informations concernant les cartes graphiques je vous recommandes de visiter les sites suivant:
* pour bitcoin: Bitcoin Hardware
* pour litecoin: Litecoin Hardware

Les logiciels nécessaires pour pouvoir miner du Bitcoin ou du Litecoin

Après  avoir installé Windows, vous devez installer les derniers drivers disponibles pour vos cartes graphiques. Je vous recommande d’utiliser l’utilitaire fourni par AMD.

Ensuite, installez le SDK AMD, qui permettra d’accéder aux fonctions avancées de vos cartes graphiques.

Ensuite, vous devez un logiciel de mining afin de pouvoir calculer des Bitcoins ou des Litecoins. Les deux principaux logiciels de mining sont:

  • Reaper: peu d’options, compatibles avec peu de cartes et gourmand en mémoire.
  • CgMiner: très complet, simple d’utilisation, permet l’overclocking, peu consommateur en ressource.

J’utilise CgMiner sur tous mes rigs car il dispose d’une panoplie de paramètres plus ou moins intéressants et surtout car il affiche les températures des cartes graphiques.

Voici un exemple de configuration de CgMiner pour les cartes graphiques HD7950:

color 0A
setx GPU_MAX_ALLOC_PERCENT 100
setx GPU_USE_SYNC_OBJECTS 1
cgminer --scrypt -o stratum+tcp://server:3333 -u user -p pass --gpu-engine 980 --gpu-memclock 1300 --failover-only --shaders 1792 --thread-concurrency 24000 -I 18 --lookup-gap 2 -g 1 -w 256

Voici un exemple de configuration de CgMiner pour les cartes graphiques HD6950:

cgminer --scrypt -o stratum+tcp://server:3333 -u user -p pass --worksize 256 --lookup-gap 2 --gpu-engine 900 --gpu-memclock 1375 --thread-concurrency 7040 -g 1 --intensity 19 --worksize 128 -g 1

Voici un exemple de configuration de CgMiner pour les cartes graphiques HD5970:

cgminer --scrypt -o stratum+tcp://server:3333 -u user -p pass --shaders 1600 --intensity 18 -Q 0 -s 60 -E 120 --worksize 128 -g 1

Superviser votre rig de mining

Une fois que tout est en place, configuré et opérationnel, il ne reste plus qu’à installer un logiciel de contrôle à distance.

Le plus complet est Teamviewer et en plus, il est gratuit.

Vous pouvez le télécharger ici.

D’autres logiciels peuvent être utilisés: VNC, le Remote Desktop de Windows, Dameware Remote, …

Pour aller plus loin

Dans cet article nous avons vu comment installé un rig de mining sous Windows pour calculer des Bitcoins et des Litecoins.

Il faut savoir qu’il existe des distributions Linux spécifiques au mining. La plus connue est basée sur Debian et se nomme BAMT.

Je l’ai essayé quelques semaines et j’ai rencontré plusieurs problèmes, c’est pourquoi je ne vous en ai pas parlé dans cet article.

Saviez-vous qu’il existe des casinos en ligne bitcoin disponibles. Jetez un coup d’oeil à cette liste de casinos en ligne qui acceptent les Bitcoins.

N’hésitez pas à me poser vos questions concernant le choix de votre matériel, je me ferai une joie de vous aider (ou de vous conseiller).

 

Mining Rig Vidéo