Autoblog de sametmax.com

Ce site n'est pas le site officiel de sametmax.com.
C'est un blog automatisé qui réplique les articles de sametmax.com

13558 Go de rames 25

Thu, 15 Mar 2018 06:01:04 +0000 - (source)

J’ai une tache celery qui me génère des données de test. Elle est lancée toutes les 5 minutes pour simuler le crawling d’un site qui popule une base de données, le tout piloté par l’ORM django, puis dumpé dans redis.

Jusqu’ici tout va bien.

Mais après un certain temps, ma machine rame, puis se frise.

Et j’ai du mal à y croire. J’ai 8 coeurs, un 32 Go de mémoire vive, un SSD d’un putain de To. On va pas me la faire à l’envers, c’est pas un def tout moisi qui va me faire trembler les genoux. C’est forcément un de ces cons de wallets que j’ai laissé ouvert, encore codé par un nantais ça !

Mais après une enquête minutieuse, qui a consisté en subtilement killer tous mes processus un par un avec echo "douceur" | sed s/c/l, le constat est là.

Eukekaca

Eukekaca.

Cette fonction est responsable:

def generate_fake_stats(x=1000):

    cur_stats = {
        s.currency.short_code: s
        for s in CurrencyMarketStatsFactory.build_batch(x)
    }
    
    mn_stats: Dict[str, MNMarketStats] = {
        s.masternode.coin.short_code: s
        for s in MNMarketStatsFactory.build_batch(x)
    }

    stats = []

    for code, mns in mn_stats.items():

        cstats: CurrencyMarketStats = cur_stats.get(code)

        if not cstats:
            continue

        dollar_value = float(cstats.dollar_value),
        collateral = mns.masternode.collateral

        stats = {
            'created': int(mns.created.timestamp()),
            'name': cstats.currency.name,
            'code': code,
            'title': f'{cstats.currency.name} ({code})',
            'marketcap': dollar_value * cstats.supply,
            'dollar_value': dollar_value,
            'change_rate': cstats.change_rate,
            'volume': float(cstats.volume),
            'supply': cstats.supply,
            'roi': mns.roi,
            'mn_worth': collateral * dollar_value,
            'node_count': mns.node_count,
            'required_coins': collateral,
        }

    RedisClient.get_instance().jset('marketstats', stats)
    return stats

Il m’a fallu une bonne heure pour trouver ma connerie. J’ai changé plein d’options, mis DEBUG sur False, limité la mémoire de Redis, etc.

Mais non, c’était mon code. Qui générait au bas mot 847390982*1000*16 octets de données, soit 1,355825571×10¹³ pour mes objets Python.

J'ai un nouveau mapping clavier qui permet de n'utiliser qu'un doigt

J’ai un nouveau mapping clavier qui permet de n’utiliser qu’un doigt

Il y en a un peu plus madame, je vous le mets quand même ?

Nan parce que 13 To pour une pov liste de dicos, c’est la boucherie.

Alors, sachant que je vous ai éliminé la recherche des causes parallèles et que vous savez que le bug est de ma (grande et stupide) faute, saurez-vous trouver dans ces lignes le d20 qui tombe sur un 1 à tous les jets ?

Si vous ne trouvez pas, la réponse dans quelques jours.

Explain all the humans !

Explain all the humans !

EDIT pour la réponse:

Comme plusieurs personnes l’ont compris, c’est la virgule sur:

    dollar_value = float(cstats.dollar_value),

Qui est responsable de tout ce malheur.

En effet plus loin on fait:

    'mn_worth': collateral * dollar_value,

Ce qui, au lieu de multiplier un entier par un float, multiplie un entier par un tuple. En python, c’est légal, et ça donne ça:

>>> 10 * (7808979.8989,)
(7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989, 7808979.8989)

Si collateral est élevé, ce qui est ici mon cas, ça fait de très gros tuples, et le tout dans une boucle.


Do you rotate ? 2

Mon, 05 Mar 2018 03:29:27 +0000 - (source)

L’explosion de la taille des logs a tué plus d’un serveur. Il est amusant de se dire que c’est du texte qui peut mettre à genoux un serveur de streaming vidéo avec 32 coeurs, 2To de SSD et 64 Go de RAM. Mais un bon access log non contrôlé sous nginx ou même le log de debug du wallet de la coin smartcash, ça peut prendre par surprise.

Le module logging de Python a d’excellentes options pour gérer la taille des logs, notamment le RotatingFileHandler.

Sous Linux, c’est logrotate qui fait le boulot pour le système. C’est performant, ça marche super bien, c’est hyper simple à utiliser, et c’est dispo partout.

Bref, en prod, un petit vi sur /etc/logrotate.d/ton_projet et pouf, on peut demander une rotation en 10 lignes:

/var/www/ton_projet/*.log
{
    size 100K
    daily
    rotate 5
    missingok
    notifempty
}

Y a rien à activer, un cron lance déjà logrotate tous les jours.

Par contre, si votre process utilise systemd pour démarrer, inutile de logger manuellement. Tout ce qui est sur la sortie standard est automatiquement loggué avec rotation et accessible avec un petit journalctl -u ton_process.service --since today.

Bref, attendez encore un peu avant de rajouter logstash à votre stack.


Introduction aux extensions Python avec CFFI 16

Wed, 07 Feb 2018 21:58:49 +0000 - (source)

Ceci est un post invité de Realitix posté sous licence creative common 3.0 unported.

Préambule

Vous avez réalisé une analyse de votre code et vous avez un bottleneck ?
Vous souhaitez utiliser une bibliothèque bas niveau (C/C++/Rust) ?

Pas de problème, dans cet article, je vais vous expliquer les différentes solutions et pénétrer en profondeur dans la plus charmante d’entre elles, son petit nom: CFFI.

Sam&Max me faisant l’honneur d’accepter mon article, je vais suivre la guideline du site avec un langage détendu et beaucoup d’exemples.

Qu’est-ce qu’une extension Python ?

Guido, pendant l’acte créateur, n’a pas oublié une chose importante: les extensions Python !
Une extension Python est un module compilé pouvant être importé dans votre code Python.
Cette fonctionnalité est très puissante: cela vous permet d’utiliser un langage bas niveau (et toutes ses capacités) pour créer un module Python.
Vous utilisez très probablement des extensions Python dans vos projets sans le savoir.
Par exemple, si vous souhaitez embarquer la bibliothèque de calcul physique Bullet, vous pouvez le faire au sein d’une extension Python.

Il y a deux points à différencier:

En y réfléchissant bien, créer un code performant revient à créer une bibliothèque tierce et l’importer au sein de l’interpréteur.

Ça laisse rêveur, alors comment fait-on ?

Plusieurs solutions:

  1. L’API C de CPython. Y’en a qu’ont essayé, ils ont eu des problèmes…
    En utilisant cette méthode, vous aurez accès à tout l’interpréteur Python et vous pourrez tout faire… mais à quel prix ?
    Je ne vous recommande pas cette approche, je me suis cassé les dents pendant 4 mois dessus avec un succès mitigé.
  2. Cython est une bonne solution mais plus orienté sur l’optimisation de code.
  3. CFFI: le saint Graal, alléluia!

CFFI: Première mise en bouche

CFFI va vous permettre de créer des extensions Python mais pas que…
Tout comme le module ctypes, il va permettre d’importer une bibliothèque dynamique au runtime.
Si vous ne savez pas ce qu’est une bibliothèque, c’est par ici.

CFFI va donc vous permettre:

Par rapport à ctypes, CFFI apporte une API pythonic et légère, l’API de ctypes étant lourde.
Par rapport à l’API C de CPython… Ha non! Je n’en parle même pas de celle-là!

J’ai dit qu’il y aurait beaucoup d’exemples, alors c’est parti !

D’abord, on installe le bouzin, il y a une dépendance système avec libffi, sur Ubuntu:

sudo apt-get install libffi-dev python3-dev

Sur Windows, libffi est embarquée dans CPython donc pas de soucis.
Ensuite, on conserve les bonnes habitudes avec le classique:

pip install cffi

Je vous conseille d’utiliser un virtualenv mais ce n’est pas le sujet!

Les trois modes

Il y a trois moyens d’utiliser CFFI, comprenez bien cela car c’est la partie tricky:

  1. Le mode ABI/Inline
  2. Le mode API/Out-of-line
  3. Le mode ABI/Out-of-line

On a déjà évoqué les modes ABI et API, mais je n’ai pas encore parlé de Inline et Out-of-line.
CFFI utilise une phase de “compilation” pour parser les header C. Ce n’est pas une vraie compilation mais une phase de traitement qui peut être lourde.
Le mode Inline signifie que ce traitement va être effectué à l’import du module alors que Out-of-line met en cache ce traitement à l’installation du module.

Evidemment, le mode API/Inline ne peut pas exister puisque le mode API impose une phase de “vraie” compilation.

Le mode ABI/Inline

# On commence par import le module cffi qui contient la classe de base FFI
from cffi import FFI
 
# 1 - On instancie l'object FFI, cet objet est la base de cffi
ffi = FFI()
 
# 2 - On appelle la méthode cdef.
# Cette méthode attend en paramètre un header C, c'est à dire
# les déclarations des fonctions C qui seront utilisées par la suite.
# CFFI ne connaîtra que ce qui a été déclaré dans le cdef.
# La puissance de CFFI réside dans cette fonction, à partir d'un header C,
# il va automatiquement créer un wrapper léger.
# A noter: le code dans cdef ne doit pas contenir de directive pré-processeur.
# Ici, on déclare la fonction printf appartenant au namespace C
ffi.cdef("""
    int printf(const char *format, ...);
""")
 
# 3 - On charge la bibliothèque dynamique
# dlopen va charger la biliothèque dynamique et la stocker dans la variable nommée cvar.
# L'argument passé est None, cela demande à cffi de charger le namespace C.
# On peut ici spécifier un fichier .so (Linux) ou .dll (Windows).
# Seul ce qui a été déclaré dans cdef sera accessible dans cvar.
cvar = ffi.dlopen(None)

Comme vous pouvez le voir dans ce bout de code, CFFI est très simple d’utilisation, il suffit de copier le header C pour avoir accès aux fonctions de la bibliothèque.
A noter: si les déclarations dans le cdef ne correspondent pas aux déclarations présentes dans la bibliothèque (au niveau ABI), vous obtiendrez une erreur de segmentation.

Le mode API/Out-of-line

Pour bien comprendre ce mode, nous allons implémenter la fonction factorielle.

# Comme pour le mode ABI, FFI est la classe principale
from cffi import FFI
 
# Par convention, en mode API, on appelle l'instance ffibuilder car le compilateur va être appelé
ffibuilder = FFI()
 
# En mode API, on utilise pas dlopen, mais la fonction set_source.
# Le premier argument est le nom du fichier C à générer, le 2e est le code source.
# Ce code source va être passé au compilateur, il peut donc contenir des directives pré-processeur.
# Dans l'exemple, je passe directement le code source mais en général, on va plutôt ouvrir le fichier avec open().
ffibuilder.set_source("_exemple", """
    long factorielle(int n) {
        long r = n;
        while(n > 1) {
            n -= 1;
            r *= n;
        }
        return r;
    }
""")
 
# Comme pour le mode ABI, on déclare notre fonction avec la méthode cdef.
ffibuilder.cdef("""
    long factorielle(int);
""")
 
 
# Enfin, on va appeler la méthode compile() qui génère l'extension en 2 étapes:
# 1 - Génération d'un fichier C contenant la magie CFFI et notre code C
# 2 - Compilation de ce fichier C en extension Python
if __name__ == "__main__":
    ffibuilder.compile(verbose=True)

Après éxécution du script, voici ce que l’on voit dans le terminal:

generating ./_exemple.c  -> Étape 1: Génération du fichier C
the current directory is '/home/realitix/test'
running build_ext
building '_exemple' extension  -> Étape 2: Génération de l'extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fdebug-prefix-map=/build/python3.6-sXpGnM/python3.6-3.6.3=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/realitix/venv/py36/include -I/usr/include/python3.6m -c _exemple.c -o ./_exemple.o
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-Bsymbolic-functions -specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -g -fdebug-prefix-map=/build/python3.6-sXpGnM/python3.6-3.6.3=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 ./_exemple.o -o ./_exemple.cpython-36m-x86_64-linux-gnu.so

Et vous pouvez trouver l’extension Python `_exemple.cpython-36m-x86_64-linux-gnu.so`.
Étudions le module généré, dans un interpréteur Python:

>>> from _exemple import ffi, lib
>>> dir(ffi)
['CData', 'CType', 'NULL', 'RTLD_DEEPBIND', 'RTLD_GLOBAL', 'RTLD_LAZY', 'RTLD_LOCAL', 'RTLD_NODELETE', 'RTLD_NOLOAD', 'RTLD_NOW', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'addressof', 'alignof', 'buffer', 'callback', 'cast', 'def_extern', 'dlclose', 'dlopen', 'errno', 'error', 'from_buffer', 'from_handle', 'gc', 'getctype', 'init_once', 'integer_const', 'list_types', 'memmove', 'new', 'new_allocator', 'new_handle', 'offsetof', 'sizeof', 'string', 'typeof', 'unpack']
>>> dir(lib)
['factorielle']

Les modules générés par CFFI contiennent 2 objets ffi et lib.

Ça vous dit d’utiliser notre extension avec un petit test de performance ? Allons y !

import time
from contextlib import contextmanager
 
# On import lib qui contient notre fonction factorielle
from _exemple import lib
 
# On créé l'équivalent de notre fonction C en Python
def py_factorielle(n):
    r = n
    while n > 1:
        n -= 1
        r *= n
    return r
 
# Un petit contextmanager pour mesurer le temps
@contextmanager
def mesure():
    try:
        debut = time.time()
        yield
    finally:
        fin = time.time() - debut
        print(f'Temps écoulé: {fin}')
 
def test():
    # On va réaliser un factorielle 25 un million de fois
    loop = 1000000
    rec = 25
    # Version Python
    with mesure():
        for _ in range(loop):
            r = py_factorielle(rec)
    # Version CFFI
    with mesure():
        for _ in range(loop):
            r = lib.factorielle(rec)
 
if __name__ == '__main__':
    test()

Le résultat sur ma machine:

Temps écoulé: 1.9101519584655762
Temps écoulé: 0.13172173500061035

La version CFFI est 14 fois plus rapide, pas mal !
CFFI permet de faire vraiment beaucoup de choses simplement, je ne vous ai montré que la surface afin de vous donner envie d’aller plus loin.

Où trouver des ressources

A savoir que CFFI a été créé par Armin Rigo et Maciej Fijalkowski, les deux créateurs de Pypy.
Toutes les extensions créées avec CFFI sont compatibles avec Pypy !

Conclusion

J’espère que cette introduction vous a plu. Si les retours sont bons, je pourrai m’atteler à un tuto plus conséquent.
Vive Python !

Si vous avez des remarques, n’hésitez pas à me le faire savoir: @realitix sur Twitter


Les critiques des ORM sont à côté de la plaque 38

Fri, 29 Dec 2017 10:31:05 +0000 - (source)

En ce moment, y a deux modes. Dire que les cryptomonnaies c’est génial, et dire que les ORM c’est de la merde.

Durant les derniers articles, je pense qu’on vous a assez parlé de crypto, donc on va parler des ORM.

Ou ORMs. Je sais jamais si les acronymes s’accordent.

Rappel: qu’est-ce qu’un ORM ?

Si vous avez lu le titre de l’article et que votre sang n’a fait qu’un tour, vous pouvez passer tout de suite à la partie suivante, puisqu’on va commencer par les révisions.

Un ORM, pour Object-relational Mapping, est une bibliothèque qui permet de décrire son modèle de données, et d’utiliser cette description pour faire le lien entre votre application et une base de données relationnelle. Dans sa forme la plus courante, l’ORM fournit les outils pour générer des requêtes SQL – sans écrire du SQL – et les exécuter, mais présente également les résultats sous forme d’objets du langage dans lequel il est écrit.

Par exemple, en Python, je peux faire de la base de données à la mano (sans ORM):

import sqlite3
 
# Création de la base
with sqlite3.connect('db.sqlite') as conn:
 
    # On se positionne sur la base
    c = conn.cursor()
 
    # Créer la table
    c.execute('''
        CREATE TABLE product (
            name text,
            price real
        )
    ''')
 
    # Insertion de données en base
    c.execute("INSERT INTO product VALUES ('Pizza', 5000)")
    c.execute("INSERT INTO product VALUES ('Love', 150)")
    c.execute("INSERT INTO product VALUES ('Nessie', 3.5)")
 
    # Sauvegarde des changements
    conn.commit()
 
    # Lecture de toute la base:
    for row in c.execute('SELECT * FROM product'):
        print(type(row), ':', *row)

Ce qui va me sortir:

python3 db.py
< class 'tuple' > : Pizza 5000.0
< class 'tuple' > : Love 150.0
< class 'tuple' > : Nessie 3.5

Et voici la même chose avec l’ORM peewee (apres pip install peewee :)):

import peewee as pw
 
# On créé la base
db = pw.SqliteDatabase('product2.db')
 
# Description de la table.
class Product(pw.Model):
 
    name = pw.CharField()
    price = pw.FloatField()
 
    class Meta:
        database = db
 
# Connection et création de la table
db.connect()
db.create_tables([Product])
 
# Insertion de données en base
Product.create(name='Pizza', price=5000)
Product.create(name='Love', price=150)
Product.create(name='Nessie', price=3.5)
 
for p in Product.select():
    print(type(p), ':', p.name, p.price)
 
db.close()

Ce qui sort:

python3 db.py
< class '__main__.Product' > : Pizza 5000.0
< class '__main__.Product' > : Love 150.0
< class '__main__.Product' > : Nessie 3.5

A priori, c’est la même chose, mais avec un style différent. Le premier exemple favorise l’écriture du SQL à la main, fait les requêtes explicitement et récupère les résultats sous forme de tuples. Le second a une surcouche, l’ORM, qui implique que tout est décrit en Python. Le SQL est généré sous le capot, et on récupère les résultats sous forme d’objets Product.

Il existe de nombreux ORM en Python, les plus populaires étant Peewee (pour les petits besoins), SQLAlchemy (pour les gros projets) et l’ORM de Django (ben, si vous utilisez Django ^^). Évidemment le concept des ORM n’est pas particulièrement lié à Python, et on en retrouve dans tous les langages, avec des variations de styles et de fonctionnalités.

Que reproche-t-on aux ORM ?

Avant de répondre aux détracteurs, listons d’abord leurs arguments.

Et vous savez quoi ?

Ils ont raison.

Heu ?

Toutes ces critiques sont parfaitement justifiées.

Sauf qu’elles passent complètement à côté de la problématique.

Les ORM ne servent pas à éviter d’écrire du SQL.

Ça, c’est vaguement un effet de bord.

Ils servent à créer une API unifiée inspectable, une expérience homogène, un point d’entrée unique, un socle de référence explicite et central, pour le modèle de données.

Une fois qu’on a passé pas mal de temps à faire des projets, on note toujours la même chose: certaines parties du logiciel sont réécrites encore et encore. Si un projet commence à parler à une source de données à la main (API, base de données, crawling, fichiers, etc), tôt ou tard, quelqu’un dans l’équipe va commencer à écrire une abstraction. Celle-ci va grossir, et finir par implémenter au bout de nombreux mois, pour l’accès à la base de données, un semi ORM dégueulasse, mal testé / documenté.

Mais, si les requêtes SQL à la main c’est si bien, alors pourquoi ça arrive ?

Simplement parce que tout projet qui grandit a besoin d’une forme de gestion de la complexité. Ca passe par avoir un point, et un seul où sont décrites à quoi ressemblent les données, leurs accès, leurs garanties, leurs contraintes, et leurs validations. Ca passe aussi par permettre aux autres parties du projet d’utiliser automatiquement ces informations pour leur code métier, ainsi que la logique associée.

L’exemple de Django

L’ORM Django n’est pas vraiment le projet Python le plus propre. Il a plein de limitations et bizarreries, et son principal concurrent, SQLAlchemy est probablement une des meilleures libs au monde dans cette spécialité.

Mais !

Il est au coeur de ce qui a fait autant le succès colossal de Django.

Parce que Django est organisé autour de son ORM, il peut proposer:

A cela se rajoute le fait que tous les projets Django se ressemblent. Il est très facile de passer d’une équipe à une autre, d’un projet à une autre. La formalisation du schéma devient une documentation, et la seule source de la vérité à propos des données, et pas juste celle de la base. Et qui est commité dans Git. Pour savoir ce que fait un projet Django, il suffit de regarder urls.py, settings.py et models.py, et c’est parti.

Mais ce n’est pas tout. L’ORM ne fait pas que définir un point central inspectable et des outils réutilisables. Il donne aussi une base commune sur laquelle tout le monde peut compter.

Et pour cette raison, l’écosystème Django est très, très riche en modules tierces partis qui se pluggent en 3 coups de cuillère à pot:

La cerise sur le gâteau ? Parce que tout ça utilise l’ORM, tout ça est compatible ensemble. Votre authentification social auth va produire un objet user qui pourra se logger, consulter un dashboard qui contiendra le résultat d’un sondage sur un produit de la boutique.

Et ça marche avec MySQL, Oracle, SQLite ou PosgreSQL, comme l’intégralité du framework, gratos.

Ce n’est pas l’apanage de Django hein, RoR fait pareil.

Maintenant prenez un projet NodeJS. Pour le coup, pas parce que “JS ça pue” mais parce que la culture de l’ORM n’est pas très présente dans cette communauté. Non pas que ça n’existe pas, mais il n’y a pas de Django du monde du Javascript. Même les gros framework type Meteor n’ont rien d’aussi intégré.

Vous allez devoir réapprendre toute la mécanique de gestion de données si vous changez de projet, car ça sera fait différemment à chaque fois. Vous allez devoir former des gens.

Et surtout vous allez devoir réécrire tout ça.

Oh bien sûr, vous aurez une bibliothèque pour chaque chose, mais elle sera écrite différemment. Vous n’aurez pas d’objet User sur qui compter. Votre moyen de traduire le texte ? Pas le même. Vous utilisez Oracle mais l’auteur PostgreSQL ? Pas de bol. Vous voulez générer quelque chose à partir de votre modèle de données ? Ah, pourquoi vous croyez que facebook a créé GraphQL ! Une petite migration ? Vous avez le choix de l’embarras. Bon, maintenant vous allez gérer les dates, et 4 de vos bibliothèques les sérialisent différemment et une utilise l’heure locale au lieu d’UTC.

Évidemment, on sait que votre équipe ne testera pas tout ça, et ne documentera pas tout ça. La suivante non plus.

Donc non, l’ORM, ce n’est pas parce que “mais heu SQL c’est dur”.

C’est parce que ça permet de créer un monde autour.

Objection !

On a des abstractions qui ne sont pas des ORM…

L’important est d’avoir un modèle central, pas un ORM. Mais les ORM font ça particulièrement bien.

Il existe des abstractions (ex: LINQ) qui font un excellent travail pour masquer la source de données. Mais elles ne sont pas un remplacement pour un modèle introspectable central listant nature et contraintes.

Une bonne lib propose les deux.

Par exemple SQLALchemy propose un ORM, mais en vérité l’API de base est fonctionnelle et composable. Pour cette raison, on peut utiliser toutes fonctionnalités avancées de sa base de données avec SQLAlchemy car on a cette alternative à l’ORM à tout moment, et qui est compatible avec l’ORM.

Mais les perfs !

D’abord, on optimise pour les humains. En chemin, on optimise pour la machine. Quand ton ORM arrête de scaler, c’est un BON problème à avoir. Ca veut dire que le projet a atteint un certain succès, et qu’on peut investir dans la séparation avec l’ORM.

De plus, aucune technologie n’est faite pour être utilisée partout, tout le temps, pour tout le projet.

Google a connu ses débuts de succès en Python, et avec sa taille, a réécrit une partie en Java, C puis Go. C’est logique, on ne commence pas avec un langage bas niveau directement, c’est trop lent à écrire. Mais on ne garde pas un langage haut niveau pour tout quand ça monte dans les tours. Enfin les tours… Là on parle de centrifugeuse cosmique hein.

Car gardez en tête que vous n’êtes PAS Google. L’immense majorité des projets deviennent viables, rentables, puis pleins de succès, sans jamais atteindre l’échelle qui amène aux limites de l’ORM.

Quant à l’idée que votre stagiaire peut écrire une boucle avec une requête à chaque step… Il peut tout aussi bien écrire une requête SQL sans se protéger correctement l’injection de code. C’est con un stagiaire, faut le surveiller. C’est le principe, sinon il aurait un CDI.

Mais les fonctionnalités !

Les ORM bien faits n’empêchent pas d’utiliser toutes les fonctionnalités de son système. Et tous permettent d’écrire du SQL à la main si besoin. C’est comme les blocks unsafe de rust: on empêche pas, on isole.

L’idée c’est de garder ça pour le moment où on en a vraiment besoin. SQL est à la base de données ce que l’assembleur est à la machine. On n’écrit pas tout en assembleur de nos jours, ça n’est pas utile.

Root of all evil, tout ça.

Mais on ne change pas de base de données souvent !

L’argument “l’orm supporte plusieurs bases” n’est pas destiné à la migration de données d’un projet existant d’une base de données à une autre.

Pas. Du. Tout.

C’est pas que ça arrive jamais. Ça m’est déjà arrivé 2, 3 de fois.

Mais ce n’est pas le cas courant. Le cas courant c’est la réutilisation du code d’un projet précédent dans un nouveau projet utilisant une base de données différente. C’est la création d’un écosystème de modules qui ne sont pas dépendants de la base de données.

Si vous faites une “app” Django, vous pouvez la publier et elle sera utile pour toutes les bases de données supportées. Et c’est pour ça qu’il y autant d’outils.

Mais on pourrait avoir un modèle central sans ORM !

Oui, mais toutes les formes ne se valent pas.

Par exemple, Doctrine permet d’écrire son modèle dans un fichier YAML, et Hibernate dans un fichier XML.

Au final on écrit son modèle dans un langage moins complet, moins expressif, moins facile à débugger et avec moins de tooling. On perd encore plus en faisant ça qu’en passant de SQL à un ORM, sans autant de gains.

En prime, on peut vouloir de la logique de validation très complexe ou des choses à faire hors validation (signals, génération dynamique de modèle, etc), et là, pouet.

Une alternative, ça serait de se servir d’une lib de pur modèle (ex: l’excellent marshmallow) et de tout dériver de là. Une approche intéressante qui pourrait satisfaire tous les camps, mais que je n’ai jamais vu poussée jusqu’au bout dans aucun framework. Si vous cherchez un projet pour vos week-end :)

Lib VS framework

C’est un peu le vieux débat du découplage VS intégration qu’on retrouve dans la critique des ORM (ou dans vi VS vscode, POO vs fonctionnel, ta femme vs ta mère…).

Et comme d’habitude on retrouve toujours les meilleurs programmeurs du côté de ceux qui veulent le plus de liberté (vive SQL!) parce qu’ils ignorent complètement les problématiques qui vont plus loin que leur fichier de code. Faire fleurir un écosystème, gérer une communauté, favoriser la productivité, facilité l’intégration des membres de ses équipes… Tout ça sont des problématiques moins funs que de faire la requête parfaite avec le tout nouveau champ hyperloglog de PostGres.

Difficile de convaincre des gens qui sont non seulement excellents, mais qui sauront, seuls, être très productifs sans ORM. Surtout quand les gros projets qui atteignent des centaines de millions d’utilisateurs par jour finissent toujours par se séparer de leurs abstractions initiales.

Mais voilà, il ne faut pas perdre de vue que 2 projets sur 3 en informatique, échouent. Quasiment jamais pour des raisons techniques. Généralement la cause est humaine. Et l’ORM est là pour soutenir l’humain en créant un pivot sur lequel il peut compter, quitte à investir plus tard pour s’en passer.

C’est un excellent outil et une très belle réussite de l’informatique moderne. Si on sait l’aborder sans dogmatisme.


Monter son master node Interzone (ITZ) 21

Thu, 21 Dec 2017 12:52:47 +0000 - (source)

Acheter et vendre des cryptomonnaies, tout le monde comprend le principe. J’achète un truc, j’attends, je le revends. Si le prix a monté, je gagne du pognon, s’il est descendu, j’en perds.

Mais il existe d’autres formes d’investissement. L’une d’elles est le master node, et on va apprendre à en monter un.

Attention, ça demande de savoir administrer un serveur linux. Le tutoriel n’explique pas bash, apt, ssh ou make et suppose que vous êtes à l’aise avec ces outils. Si ce n’est pas la cas… pas de bol.

C’est quoi déjà ?

Bitcoin n’est plus la seule crypto, il y en a maintenant des centaines, et certaines essayent de se distinguer technologiquement.

Quelques-unes ont le concept de master node, des machines dont les propriétaires ont acheté un certains nombre de coins, et les bloquent. En échange de quoi, le réseau donne à la machine le droit de faire certaines opérations en plus, opérations qui rendent service au réseau (rendre les exchanges anonymes, accélérer les transactions, etc).

Le but des master nodes est double:

Mais pour le propriétaire du master node, qu’est-ce qu’on y gagne ?

Et bien tous les jours, une cagnotte est répartie équitablement entre tous les masternodes en récompense de leur service.

Par exemple, j’ai monté la semaine dernière un master node Vivo. Il a couté a l’achat 3200 euros. Tous les jours, il génère 5 vivos, soit actuellement 20 euros. En plus de cela, le vivo a augmenté de prix depuis l’achat, et le master node vaut maintenant 5000 euros si je décide de revendre les coins qui sont bloquées. Mais ça voudrait dire fermer mon master node.

Choisir un master node

Tous les master nodes ont des coûts et une rentabilité différents. Il existe des listing qui permettent de se faire une idée de la question.

Aujourd’hui je vais vous faire un tuto sur le master node Interzone, car il est très peu cher à l’achat: moins de 300 euros. Évidemment, il ne rapporte que 2 euros par jour.

Mais si vous voulez apprendre à faire des master nodes, c’est plus simple que de débloquer 5000 balles pour du vivo. Ou pire, un million pour un node dash :)

Interzone est aussi un wallet très basique, et donc simple à monter.

Acheter les coins

D’abord, il faut acheter les coins. Le nombre de coins à acheter est différent pour chaque type de node. Pour Interzone, c’est 5000 à bloquer, et donc on va en acheter 5001 pour les frais de transaction.

Pour se faire, il faut d’abord acheter une monnaie plus populaire sur une plateforme d’achat. Par exemple, vous pouvez acheter du Bitcoin sur Bitstamp.

Ensuite, faite un virement (withdrawal) vers une plateforme d’échange.

Tout ça se fait en plusieurs étapes.

D’abord, ouvrir des comptes sur ces sites, et faire les putains de vérifications de sécurité. Ouai, si vous vouliez trader anonymement c’est raté. Et parfois c’est long. Très long. Par exemple pour les achats par carte bancaire, Bitstamp m’avait demandé une photo de moi tenant mon passeport. Je sais pas si ils le font toujours, mais c’est over chiant.

Je vous laisse vous occupez de tous ça, on se revoit dans quelques jours.

Ça y est, de retour ?

Ok.

D’une part on va aller sur un exchange voir le cours de l’Interzone pour savoir combien de BTC acheter.

Par exemple à cet instant je vois que je peux acheter un ITZ pour entre 0.000002699 et 0.000007300 BTC. En regardant les cours, je vois que j’ai suffisamment de vendeurs pour avoir 5001 ITZ à 0.000002990 BTC, donc 0.0149529900 BTC. On rajoute les fees de l’exchange (0.0000373824750 BTC) et on prend en compte les fees de transactions de la block chain bitcoin (0.00265914 BTC).

Total: 0.017649512 BTC, soit 281.57 euros sur Bitstamp.

Parfois c’est plus, parfois c’est moins. Ça fluctue beaucoup.

On achète ça. Ça prend encore du temps…

Quand on a tout, on fait le virement sur son autre wallet, celui sur l’exchange.

Depuis l’exchange, on achète enfin son Interzone.

Monter son master node

En théorie on peut faire ça avec un client, mais en pratique ils ne marchent jamais. En plus il faut que ça reste allumé tout le temps et il faut avoir une IP statique.

Donc on va le faire sur son propre serveur linux.

Le plus pratique est d’avoir un serveur à soi qui tourne quelque part, ou de louer un VPS au prix minimal. En effet un master node, ça consomme que dalle en ressource et vous pouvez le mettre sur un raspberry pi si ça vous chante.

Parce que je suis pas maso, je vais expliquer que pour une distro, car il va falloir compiler. On va donc faire ça pour une Ubuntu 16.04.

D’abord on s’assure d’être toujours à l’heure:

sudo apt-get install ntp ntpdate
sudo update-rc.d ntp enable

On installe la tetrachiée de dépendances:

sudo apt-get install build-essential software-properties-common nano libboost-all-dev libzmq3-dev libminiupnpc-dev libssl-dev libevent-dev   libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libboost-all-dev

Ensuite, on a besoin de downgrader une lib, donc, ppa:

sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev

On download les sources:

wget https://github.com/projectinterzone/ITZ/archive/master.zip
unzip master.zip

Et on compile:

cd ITZ-master 
./autogen.sh
./configure
make

Vous pouvez aller boire un coup, pisser, faire la sieste. Ça prend pas mal de RAM, donc si vous serveur en a pas assez, faites les sur un ordi local avec la même version de linux.

Une fois tout ça terminé, le résultat est que dans le dossier ITZ-master/src vous avez deux executable:

C’est ce qu’on va utiliser. Si vous avez compilé en local, uploadez les n’importe où sur votre serveur.

Maintenant, on se place sur le serveur, dans le dossier qui contient interzoned et interzone-cli, et on va créer un fichier de config.

Pour le fichier de config, il vous faut l’adresse IP du serveur. On peut la choper avec:

$ dig TXT +short o-o.myaddr.l.google.com @ns1.google.com | awk -F'"' '{ print $2}'
xxx.xxx.xxx.xxx

Le port, lui, est toujours 55675 (soyez sur de pas le bloquer).

Puis on choisit un mot de passe pour le client:

$ tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1
BjHQ2T95Og2VNxsVDQ5qcFBU1eVNHP

On ouvre le fichier:

mkdir .interzone
vi .interzone/interzone.conf

Et on écrit dedans:

bind=:55675
rpcuser=interzone
rpcpassword=BjHQ2T95Og2VNxsVDQ5qcFBU1eVNHP

Puis on lance le daemon:

./interzoned -daemon -reindex

Si vous êtes consciencieux, ajoutez un service qui le démarre quand votre machine boot.

Au premier lancement, il va télécharger toute la block chain, mais ici c’est seulement 140Mo car interzone est tout jeune encore. Donnez-lui 30 minutes pour être tranquille.

Au bout de quelques minutes, votre client pourra déjà se connecter au master node et voir le progrès avec:

$ ./interzone-cli getinfo 
{
...
    "blocks" : 92477,
...
}

Il est temps de loader votre master node avec du pognon ! On se fait une adresse:

./interzoned getnewaddress MN1
1MKDs1yNze7VEr4zWHTKbiV3T3fBTwtxZ4

Et là vous allez sur votre exchange où vous avez acheté vos coins, et vous faite un transfert d’EXACTEMENT 5000 coins sur cette adresse (la votre, pas 1MKDs1yNze7VEr4zWHTKbiV3T3fBTwtxZ4, bande de moules). Pas un sou de moins. Pas un sou de plus.

Vous attendez que les coins arrivent. Ça peut prendre quelques minutes. Vérifiez avec:

./interzone-cli getbalance
5000.00

Si ça dit 5000, c’est bon.

Il est temps de démarrer notre master node.

D’abord, on arrête le daemon:

./interzone-cli stop

Ensuite, on se génère une clé privée pour notre master node:

./interzone-cli masternode genkey
EHLKJHoYfNaeziVMAtLs5678G9Em861r3456xtYh1TEotpY1

Ensuite on rouvre notre fichier de config, et on le met à jour pour contenir ça:

bind=:55675
rpcuser=interzone
rpcpassword=BjHQ2T95Og2VNxsVDQ5qcFBU1eVNHP
masternode=1
masternodeprivkey=EHLKJHoYfNaeziVMAtLs5678G9Em861r3456xtYh1TEotpY1

Ne soyez pas con, n’utilisez pas la clé que je poste dans ce tuto.

On va aussi chiffrer son waller, maintenant qu’on a des sous dessus, pour éviter de se le faire tirer. On génère un nouveau mot de passe, et on encrypt:

$ tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1
efFMgBGFpVhlQ0j8o8N4TaC5XdASyG
$ ./interzone-cli encryptwallet "efFMgBGFpVhlQ0j8o8N4TaC5XdASyG"

Faites un backup de votre wallet avant et du mot de passe. Si vous perdez ça, vous êtes niqué de chez niqué.

Vous pouvez déverrouiller le wallet avec:

./interzone-cli walletpassphrase efFMgBGFpVhlQ0j8o8N4TaC5XdASyG 120

efFMgBGFpVhlQ0j8o8N4TaC5XdASyG étant à remplacer avec votre mot de passe fraichement généré et 120 est le nombre de secondes pour le garder débloqué.

Il est temps de relancer le daemon:

./interzoned -daemon

Et finalement, le passer en master node:

./interzone-cli masternode start

C’est good.

Vous pouvez vérifier que ça a été accepté par le réseau avec:

./interzone-cli masternodelist | grep PUBLIC_IP

Toutes les 24h, vous pourrez joyeusement contempler le chiffre fourni par ./interzone-cli getbalance qui augmente. Et vous pouvez envoyer vos coins où vous le souhaitez (par exemple pour les revendre) avec un joli:

./interzone-cli walletpassphrase <votre password> 120
./interzone-cli sendtoaddress

Sécurité

Votre master node est ici configuré en mode “hot wallet”, c’est-à-dire que vos coins sont sur le serveur. Il existe une méthode, plus complexe, plus longue, mais plus sure, qui permet de le configurer en “cold wallet”. Vos coins sont alors sur votre machine, et un lien est fait enter votre machine et votre master node.

Si la sécurité vous importe, je vous invite donc à étudier la question.

Renforcer la configuration du firewall aussi est une bonne idée, puisque maintenant vous êtes une cible d’attaque potentielle.

Enfin, n’oubliez pas de vider tout l’historique bash en partant, histoire de pas avoir tous les trucs en clair dedans:

cat /dev/null > ~/.bash_history && history -c && exit

Et backupez comme des porcs aussi.

Profit ?

J’espère pour vous que tout ça va fructifier (et pour moi aussi). Si c’est le cas, vous savez ce qu’il vous reste à faire: envoyez-nous une carte postale de votre ile deserte. Ou des ITZ à 1AChuSLWAHQgmkGa84AHqBRCs1Z1cxHjnU. Ça marche aussi.

Si vous avez tout perdu, sachez que c’est la faute de Max. Je peux vous donner son adresse.

Et pour tous ceux qui n’ont pas la foi de faire tout ça, je pense que je vais monter un service qui permet de cliquer et acheter des masternodes automatiquement.


Le point sur les crypto-monnaies 36

Tue, 19 Dec 2017 10:32:50 +0000 - (source)

Max est arrivé, il a posté, puis il est reparti.

Miner du Bitcoin Gold n’a pas été rentable du tout, ni pour vous, ni pour la team de GoldenShower. Et NiceHash s’est fait hacké. Mais au moins c’était fun.

Cela dit ce n’était que la partie émergée de l’iceberg, et avec tout le bordel actuel, vous avez peut-être envie d’un petit topo pour remettre tout en contexte.

Il y a 5 ans, je vous parlais du Bitcoin, un projet qui expérimentait avec l’idée de créer une monnaie décentralisée, non dirigée par les banques ou les états.

Le système Bitcoin a introduit les bases d’un système novateur:

Bitcoin est un peu le prototype de la roue, taillé dans la pierre: révolutionnaire, mais vraiment super lourd.

Malgré ça, de par le nom célèbre et la robustesse technique du système, Bitcoin reste la référence de la cryptomonnaie. En quelque sort “l’or”, la valeur refuge. Amusant quand on connait sa volatilité. Le cours a explosé (plus de 15000 euros), la bourse de Chicago ouvre les vannes de la spéculation officielle et on peut même en acheter avec sa CB de nos jours (ce qui n’était pas le cas au début).

En gros, Bitcoin est légitimé.

Et c’est ironique, car cette légitimation passe par la négation du projet original. Bitcoin n’est plus du tout une monnaie alternative aux mains du peuple, mais un instrument spéculatif de plus.

Les cryptomonnaies actuelles ont une valeur aberrante, sans rien derrière. C’est du vent total.

Alors qu’est-ce qui se passe maintenant ?

Et bien d’abord les cryptomonnaies alternatives ont fleuri. Il y en a des centaines. La plupart sans aucun projet, avec des teams branlantes et l’espoir de “mooner” (que le cours monte jusqu’à la lune).

Certaines cryptos sont très intéressantes néanmoins:

Du coup il y a une vraie exploration technique, et ça va donner des choses intéressantes. Même les états s’y mettent.

Néanmoins soyons honnête, l’utilisateur moyen s’en bat les couilles (oui les couilles, l’utilisateur moyen n’est clairement pas une utilisatrice pour le moment) et veut juste avoir de l’argent qui rentre en espérant que plus d’argent sort.

Pour répondre à cette demande, de nombreuses places de marché ont vu le jour. On peut échanger des trucs obscurs tels que le Wyvern, l’ObamaCare, le Satancoin, le CheeseCoin, le Marijuanacoin, le GirlsToken ou le CharlieChaplinCoin.

J’aimerais vraiment vous dire que je plaisante. Mais non.

Et puis tout ça va finir en bulle. Et ça va péter. Et des tas de gens vont tout perdre. Dans 6 mois ? Dans 2 ans ? Dans 10 ans. Aucune idée. Personne ne sait. On sait juste que ça va arriver. On est pas dupe, ces monnaies de singe ne valent rien: pas d’atout technique, pas de projet social, pas de team de ouf, pas de gros backers… Rien pour compenser l’absence de garantie par l’Etat qu’une vraie monnaie a.

Le petit secret, c’est que la plupart des ces cryptos sont des forks des projets principaux (Btc, eth, dash, etc) avec juste un logo différent. Ou pire, juste un smart contract sur ETH et même pas de blockchain, quand on est vraiment paresseux et doué en com, pourquoi se faire chier.

Une minorité, mais bien réelle, deviendront ancrées dans la société après la crise. Après tout la possibilité de stocker une valeur et de l’échanger sans contrôle et rapidement est trop intéressante. Le jeu du chat et de la souris avec les institutions va continuer. Il va y avoir législation. Et au bout d’un temps, acceptation sous certaines conditions.

De plus, les innovations techniques autour de la blockchain vont produire des choses vraiment utiles, et on les utilisera.

Mais la plupart des monnaies actuelles vont disparaitre au son des pleurs. Tout le monde le sait, mais tout le monde s’en fout. On espère tous que ce sera le voisin, et que nous nous on sera riche. Les gens s’identifient beaucoup plus souvent au début du “loup de wall street” qu’à la fin de “the big short”.

Déjà que je regrette la centaine de BTC que j’ai vendu avant que ça monte, alors j’imagine le sentiment quand tout s’écroule après l’achat…

Et comment je fais du pognon moi alors ?

Ben si je savais comment faire de la thune a coup sûr, je le ferais et je ne le vous le dirais pas, bande de guignols.

Mais avec Max, on essaye de profiter de la situation.

Déjà, pour le moment, acheter les cryptos les plus célèbres (Bitcoin, Ethereum, Monero, Dash, Litecoin…), a été une stratégie gagnante puisque ça monte énormément.

Ensuite il y les investissements alternatifs. Par exemple notre bande de potes investis dans des master nodes (particulièrement le Vivo, le CRC, l’interzone, etc). Comme le dit Max “20k en assurance vie m’a rapporté 200 euros en 5 ans. Sur un masternode, 7k me rapporte 40euros par jour”. Évidement…

Enfin il y a la stratégie “pendant la ruée vers l’or, vends des pelles”.

Max essaye de mettre en place un système de bot facile à scripter pour spéculer sur toutes les plateformes de manière uniformisée, et les louer.

Moi je monte un système pour gérer les master nodes des gens en échange d’une part des gains. C’est que c’est chiant à monter et maintenir ces petites bestioles.

Si vous comptez mettre du pognon là dedans, n’oubliez pas de ne jouer dans ce grand casino bordélique et immoral que ce que vous pouvez perdre.

Mais la vérité ?

En tant que dev, on s’était pas autant marré depuis les débuts du Web, quand on bricolait des services pourris en PHP pour se faire une place.


GoldenShower sera coupé, faute de miners 11

Thu, 07 Dec 2017 14:43:53 +0000 - (source)

Slt les gens,

 

On va couper le pool Goldenshower, car ça coûte en hébergement et qu’il n’y a plus de miners pour espérer choper un block. C’est la loi du “transvasationnagement” des liquides. Si vous voulez continuer l’aventure essayez les pool btgpool ou suprnova. Je vous encourage d’ailleurs à vous intéresser aux crypto-monnaies dans l’ensemble, ça fait pas de mal ^^

 

On remercie tous ceux qui ont participé à l’aventure en espérant que vous aurez appris au moins autant que nous. Pour info on a rien gagné, les coms de la pool ayant payé l’hébergement du serveur et quelques NiceHash (qui s’est fait hacker au passage…)

Possible qu’on monte un autre pool mais l’expérience nous a appris que c’est pas facile sans une forte concentration de miners.

Je pense vous faire un tuto sur les Masternodes bientôt pour voir les cryptos sous un autre angle.

Passez de bonnes fêtes!

Max,

 


NiceHash – Pump up your power, à quoi ça sert et comment ça marche ? 8

Tue, 14 Nov 2017 11:05:59 +0000 - (source)

Alors c’est quoi ce « gentil hachis » dont vous parlez sur Telegram, c’est un truc de cuisine ?

« Nicehash » c’est un service de location de puissance de « hash », en gros avoir le plaisir de posséder l’équivalent de 25000 cartes graphiques pendant un moment pour miner de la cryptomonnaie.
C’est un peu la Smartbox (vous savez celle où on peut faire 200 bornes pour conduire un R8 pendant ¼ d’heure) de la crypto, mais sans sortir de chez soi, moins de plaisir, mais plus de rendement.

D’un côté Nicehash propose aux mineurs (ceux qui ont des machines qui chauffent leur maison toute la journée) de mettre ces machines en location, et d’un autre on peut participier à des enchères pour louer la puissance (additionnée) de plein de mineurs d’un coup pour devenir un moment un gros mineur bien velu.
On voit bien sur ce graphe ce que ça donne là quand un gars s’est un peu énervé pendant ½ heure

un ptit coup de nicehash ?
Sur le chan de Goldenshower.io on a l’histoire d’un gars qui a réussi à lancer ¼ d’heure de nNicehash au tout départ du BitcoinGold et en a ramassé une bonne grosse poignée à ce moment là, mais sinon de notre expérience avec le service, il est possible de faire un 10-25% de bénéfice (on achète du hashpower en BTC, on mine une monnaie, qu’on revend ensuite, et ça fait 10-25% de BTC en plus pour recommencer ).

Allons-y “gayment”! Rendez-vous sur https://www.nicehash.com/

 

On créer un compte, on valide tout ça et on passe aux choses sérieuses. Le tuto suivant décrit la méthode pour lancer un NiceHash sur la crypto Bitcoin Gold, qui est basé sur l’algo Equihash, pour d’autres cryptos il faudra choisir l’algo approprié mais pour le reste il n’y a rien à changer.

 

  1. On va dans le marketplace (place de marché)
    On sélectionne  market place
  2. On sélectionne l’algo approprié à la crypto que l’on va miner, ici pour BTG (Bitcoin Gold) on sélectionne Equihash.
    Equihash est l'algo que l'on va utiliser pour miner du BTG (Bitcoin Gold)
  3. La partie la plus importante, Il va falloir envoyer notre puissance de calcul louée sur un pool, ici sur goldenshower.io. Pourquoi celui-là et pas un autre ?
    Parce que c’est celui de Sam&Max (et des potes) , qu’on est les plus beaux et qu’on a besoin de tunes pour aller aux putes régulièrement et vous mijoter de jolis articles tous mignons.
    PArtie la plus important, setup du pool Pool Name: Golden Show (le nom de votre pool, mettez ce que vous voulez, c’est pour le reconnaître par la suite dans la liste.)
    Stratum hostname ou IP: btg.goldenshow.io
    port: 3870
    User: là il faut mettre votre addresse de Wallet BTG que vous aurez créé en suivant notre tuto précédent ici

  4. On place son Order (et oui comme à la bourse) qui va consister à acheter de la puissance de Hash à un prix fixé par vous.
    ATTENTION! Avant de placer un order il faut créditer son compte Nicehash avec des BTC (Bitcoins), car tout se paie en BTC.
    Sur la figure suivante j’ai placé un order à 0.01258 BTC.

    PRICE: par défaut un prix est suggéré , il faut regarder dans la liste des ordres à côté que vous êtes dans les bonnes valeurs, un prix trop bas et votre ordre ne passera jamais.
    LIMIT: sert à limiter la puissance de calcul envoyée dans le temps, pour les premiers essais il vaut mieux mettre une faible valeur (attention si vous mettez 0 nicehash va envoyer toute la puissance d’un coup) en cas de mauvaise configuration du pool, ça serait con d’envoyer toute la puissance sur un truc qui mine pas :)
    AMOUNT: le budget que vous voulez allouer, là aussi au départ une petite somme pour tester l’artillerie, une fois que vous êtes sûr que ça marche, vous pouvez placez un ordre plus important.

    on achète des gigoWatts Doc !!

  5. Et C’est tout ! La puissance de calcul louée sur Nicehash va être transmise au pool goldenshow.io et c’est comme si vous aviez une ferme de GPU qui mine. Elle est pas belle la vie ?
    6_MiningStart

Si vous voulez racheter de la puissance de calcul vous éditez votre order dans la liste et vous changez les valeurs appropriées.
8_If_Need_Change_Price_or_refill
Vous l’aurez compris, Nicehash permet d’avoir l’équivalent d’une immense ferme de GPUs sans les inconvenients. Pratique pour miner à la sortie d’une crypto sans avoir à setup grand chose et pour se rendre compte immédiatement de la rentabilité de minage de la monnaie concernée.
A savoir qu’en général quand une monnaie sort la difficulté est faible donc ça vaut le coup de se lancer dessus et le Nicehash est la solution la plus rapide.

Rendez-vous sur goldenshow.io, votre pool préféré pour miner (pas exclu qu’on rajoute d’autres cryptos soon ^^ )

Les précédents Tutos:

http://sametmax.com/de-la-thune-avec-un-mining-pool-de-btg/

http://sametmax.com/tutorial-pour-miner-du-bitcoin-gold-btg/


Tutorial pour Miner du Bitcoin GOLD – BTG 49

Mon, 13 Nov 2017 11:38:22 +0000 - (source)

ça y est le pool est open, tout devrait marcher !

Comment on utilise un mining pool :

Dans peu de temps (ou depuis peu de temps c’est selon), le mainnet (blockchain de prod) de BTG est en ligne, du coup, yahoo on peut commencer à miner. Avec des potes on s’est marrer à monter un pool de minage sur lequel vous pourrez vous connecter. http://goldenshower.io, avec un nom pareil on s’es fait ban du listing du site officiel :) du coup on a pris goldenshow.io mais les 2 ndds marchent pareil.

 

Une bonne douche dorée de BTC ^^

Une bonne douche dorée de BTC ^^

Pour ceux qui ont loupé la 1ère partie c’est ici.

 

Petit tuto rapide, mais j’espère clair :

1) Créer un wallet BTG

https://btgwallet.online/ ou là https://mybtgwallet.com/
Notez bien dans un endroit sécurisé tout ce qu’ils disent de noter (si si c’est important, sinon tous ces beaux Bitcoin Golds seront perdus à jamais). Vous obtiendrez votre adresse que nous nommerons bitcoin-gold-address dans la suite.

2) Installer un logiciel de minage, selon votre système d’exploitation et la marque de votre carte graphique :

Sur ces deux repos se trouvent les versions Linux et Windos (pas encore de miner pour OSX)

Si vous avez une carte graphique NVIDIA:
EWBF v0.3.4b (NVIDIA) –  https://github.com/poolgold/ewbf-miner-btg-edition/releases

Si vous avez une carte graphique AMD:
ClaymoreZcash v12.6 (AMD) – https://github.com/poolgold/ClaymoreBTGMiner/releases

Il est possible que votre antivirus se plaigne, mais ces liens sont légitimes et utilisés par plein plein de gens sans problème.
Ces logiciels contiennent des fonctions cryptographiques (ce qui fait hurler les antivirus) parce que justement c’est leur boulot en tant que mineurs.

3) Configurer le mineur avant de le lancer :

Sous Windows:
* EWBF (les carte nvidia) : miner –server btg.goldenshow.io –user bitcoin-gold-address.worker –pass x –port 3857

* Claymore (les cartes AMD):
Editez le fichier start.bat et mettez ça :

set GPU_FORCE_64BIT_PTR=1
set GPU_MAX_HEAP_SIZE=100
set GPU_USE_SYNC_OBJECTS=1
set GPU_MAX_ALLOC_PERCENT=100
set GPU_SINGLE_ALLOC_PERCENT=100

Editer le fichier config.txt

-zpool stratum+tcp://btg.goldenshow.io:3857
-zwal bitcoin-gold-address.worker
-zpsw x
-allpools 1

et lancer ZecMiner64.exe

4) Pour les plus pointus d’entre vous, il y a quelques variantes :

ports :

3857 = PC standard à quelques GPU
3860 = petite ferme (10-15 GPU ou plus)
3870 = nicehash ou mega fermes ( + 150 gpus)

Pour linux c’est la même chose mais en créant un fichier bash à la place du .bat.

Si vous rencontrez des problèmes (et vous allez en avoir) on a un chan Telegram.

Happy mining !


Le miner pool BTG est ready: voici comment faire 9

Mon, 13 Nov 2017 00:03:52 +0000 - (source)

ATTENTION !!! Article posté par erreur, BTCGOLD ayant pris un low kick frontal par une DDoS de gniaks, ils ont tout niqué. C’est en train de sync le mainnet, on en est à 50%, je pense que ce sera fini demain matin. Je vous posterai un article/tuto quand ils seront up.

Max s’est bien marré et pour miner du bitcoin gold, nous a pondu le site http://goldenshower.io/.

Qui s’est fait insta banné des listing et donc on a du mettre un alias http://goldenshow.io. On garde l’autre pour la postérité :)

Toutes les instructions sont dessus.

Mais en résumé, vous créez un wallet sur un site type https://btgwallet.online/.

Ca donne un truc comme ça:

Non c'est pas le mien bandes de bananes

Non c’est pas le mien bandes de bananes

Sauvegardez tout ça.

Installez le miner pour votre os et carte graphique tel que listé sur http://goldenshower.io/.

Les windowsiens peuvent avoir un probleme de dll. Dans ce cas y a un truc de plus à installer:

https://superuser.com/questions/1163409/msvcp120-dll-and-msvcr120-dll-are-missing

Si vous avez un doute, essayez en premier https://www.microsoft.com/en-us/download/confirmation.aspx?id=40784

Ensuite, vous votre miner depuis le terminal et on attend :)


Powered by VroumVroumBlog 0.1.31 - RSS Feed
Download config articles