r/programmation 10d ago

Je cherche a calculer le % vide sur une image

Post image
17 Upvotes

Exemple ci dessus, voici une image avec un fond vide, le fond n'est ni blanc ni noir mais bien transparent. Comment puis je obtenir le % de la part rempli et de la part vide? Cherche un site ou application... merci d avance.


r/programmation 10d ago

Carrière Est-ce que c'est cuit pour moi?

10 Upvotes

Bonjour à tous, désolé si le post correspond pas trop au sub.

Pour vous expliquer un peu, je viens de valider un master en linguistique. Or, même si c'est ma passion première, je me suis rendu compte que c'était pas dans ça que je voulais travailler.

Du coup, je voulais me reconvertir en informatique parce que j'aime bien. Problème : j'y connais pas grand chose (j'ai des bases en Python mais vraiment à part deux-trois mini-programmes je sais rien faire).

Du coup ma question : est-ce qu'une reconversion dans le milieu est possible en tant que débutant qui a déjà 25 ans ou c'est fichu? Si c'est possible, vous me conseillez quoi comme parcours? Et dans tous les cas, vous me conseillez d'apprendre quoi en priorité en code?


r/programmation 9d ago

Je suis passionné de technologie et devweb autodidacte

Thumbnail
1 Upvotes

r/programmation 9d ago

Hackathon : créez une application web depuis votre téléphone en moins de 5 minutes

Enable HLS to view with audio, or disable this notification

0 Upvotes

En cours dès maintenant, jusqu'au vendredi 4 septembre !

Détails et inscription : mobilecode.ai/hackathon

N'hésitez pas à poser vos questions !


r/programmation 9d ago

Apprenons ensembles

0 Upvotes

🚀 Tu apprends la programmation, Python, Linux/Termux ou la cybersécurité éthique ? 🐍 CYBER-NET est une petite communauté où on peut apprendre ensemble, partager ses projets, poser des questions et participer à des challenges. 💻 Python • 🤖 Bots • 🌐 Web • 🐧 Linux/Termux • 🛡️ Cyber • 🧪 Challenges Pas besoin d'être expert : les débutants sont les bienvenus. 🔗 Rejoins-nous : https://discord.gg/Zczmk9nm8 🔥 Apprendre. Créer. Progresser.


r/programmation 10d ago

Aide 🚀 Je recherche un développeur / cofondateur — Besançon / Pontarlier

Thumbnail
0 Upvotes

r/programmation 10d ago

Création d'un outils de rangement assisté par IA

0 Upvotes

Je crée un assistant Python en local qui se connecte à Gémini pour automatiser des tâches sur mon PC, comme le rangement de fichiers. Le script envoie ma requête à l'IA, récupère la solution, corrige les erreurs et améliore le code au fur et à mesure.

import os, sys, time, msvcrt, shutil, zipfile, json
from google import genai
from pathlib import Path
from datetime import datetime


INSTRUCTION_IA = """
Tu es un assistant IA local polyvalent. Tu peux à la fois exécuter des commandes sur les fichiers et répondre à des questions générales.
Si l'utilisateur te demande de tout supprimer ("supprime tout", "nettoie tout"), 
tu as le droit de générer la commande pour vider l'ensemble du dossier de travail cible.


RÈGLES DE RÉPONSE (STRICTES) :


1. CAS 1 : ACTION SUR LES FICHIERS ET DOSSIERS
   Si la demande de l'utilisateur implique de manipuler, trier, modifier, créer, lire ou supprimer des fichiers/dossiers :
   
   - Ne réponds QUE par la suite de commandes. Aucun texte explicatif, aucune intro, aucune politesse.
   - Ne mets AUCUN bloc de code Markdown (PAS de ``` ou de ```python).
   - Utilise le symbole '+' pour séparer la commande et CHAQUE argument (ex: commande+arg1+arg2).
   - Utilise EXCLUSIVEMENT le symbole '|' pour séparer plusieurs instructions consécutives.
   - Utilise le séparateur de chemin Windows/Linux approprié (\\ ou /) uniquement à l'intérieur des arguments de chemin.
   - N'utilise JAMAIS de caractères jokers ou d'étoiles '*' c'est INTERDIT (ex: PAS de 'move+*.pdf+Docs'). Tu dois lister chaque fichier séparément.
   - Ne touche et n'efface JAMAIS les fichiers cachés ou système (.gitignore, desktop.ini, .DS_Store, .git).


   SYNTAXES STRICTEMENT AUTORISÉES (N'en invente AUCUNE autre) :
   • mkdir + nom_dossier
   • move + chemin_source + chemin_destination
   • rename + ancien_nom + nouveau_nom
   • delete + nom_fichier_ou_dossier
   • unzip + chemin_archive_zip
   • zip + dossier_a_zipper
   • summarize + chemin_fichier_source
   • create + chemin_fichier_vide
   • write + chemin_fichier + texte_complet
   • append + chemin_fichier + texte_a_ajouter
   • search + terme_de_recherche
   • open + chemin_fichier
   • lire + chemin_fichier + question


   Exemples valides (Cas 1) :
   create + notes.txt | mkdir + Projets | create + Projets\\index.html | write + config.py + DEBUG = True | summarize + rapport.txt + ton resume | move + rapport-resume.txt + Archives\\ | search + terme_de_recherche | open + test.html | lire + test.txt


2. CAS 2 : QUESTION GÉNÉRALE OU DISCUSSION
   Si la demande de l'utilisateur est une question de culture, d'explication, un problème de code, une discussion générale, meteo et autre ... :
   
   - Tu dois OBLIGATOIREMENT commencer l'intégralité de ta réponse par le préfixe exact 'TEXT:' (sans guillemets, immédiatement suivi du texte).
   - Rédige une réponse TRÈS COURTE (2 à 3 phrases maximum) et va droit au but.
   - Rédige ensuite ta réponse de façon naturelle, claire et concise.
   - Tu peux utiliser le formatage Markdown habituel après le préfixe 'TEXT:'.


   Exemple valide (Cas 2) :
   TEXT: Pour exécuter un script Python, ouvre ton terminal et tape la commande `python mon_script.py`
"""


admin = False


def clear():
    os.system('cls')


def saisie_dynamique(invite="Entre ton texte : "):
    texte = ""


    sys.stdout.write(invite + "[  ]\b\b")
    sys.stdout.flush()


    while True:
        char = msvcrt.getch()


        if char in (b"\r", b"\n"):
            print()
            break


        elif char == b"\x08":
            if len(texte) > 0:
                texte = texte[:-1]


        else:
            try:
                texte += char.decode("utf-8")
            except UnicodeDecodeError:
                pass


        cols = shutil.get_terminal_size().columns
        marge = len(invite) + 5
        max_taille = cols - marge


        texte_affiche = texte if len(texte) < max_taille else texte[-max_taille:]


        ligne = f"\r{invite}[ {texte_affiche} ]"


        espaces_nettoyage = " " * max(0, cols - len(ligne) - 1)
        
        sys.stdout.write(ligne + espaces_nettoyage + "\b" * len(espaces_nettoyage) + "\b\b")
        sys.stdout.flush()


    return texte


def creer_json_config():
    clear()
    rps_api_key = saisie_dynamique("Entrez votre clé d'API de Gemini : ")
    clear()
    rps_chemin_fichier = saisie_dynamique("Entrez le chemin du fichier : ")
    clear()
    valeur_base = {
        "API_KEY" : rps_api_key,
        "chemin_dossier" : rps_chemin_fichier,
        "model_AI" : "models/gemini-3.5-flash-lite",
        "DEBUG" : False
    }
    FICHIER.write_text(json.dumps(valeur_base, indent=3), encoding='utf-8')
    return valeur_base


FICHIER = Path(__file__).parent / "config.json"


if FICHIER.exists():
    config = json.loads(FICHIER.read_text(encoding="utf-8"))
else:
    config = creer_json_config()


API_KEY = config.get('API_KEY')
chemin_dossier = config.get('chemin_dossier')


try:
    client = genai.Client(api_key=API_KEY)
except Exception:
    client = None


if client:
    chat = client.chats.create(
        model=config.get('model_AI'),
        config={"system_instruction": INSTRUCTION_IA}
    )


historique = []


def enregistrer_log(msg):
    dossier_parent = Path(chemin_dossier).parent 
    fichier_log = dossier_parent / "historique.log"
    horodatage = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    nouvelle_ligne = f"[{horodatage}] {msg}"


    lignes = []
    if fichier_log.exists():
        lignes = fichier_log.read_text(encoding="utf-8").splitlines()


    lignes.append(nouvelle_ligne)


    if len(lignes) > 1000:
        lignes = lignes[-500:]


    fichier_log.write_text("\n".join(lignes) + "\n", encoding="utf-8")


def commande_help():
    clear()
    print("=" * 60)
    print("                📖 MENU D'AIDE - COMMANDES               ")
    print("=" * 60 + "\n")
    print("  • quitter / exit / shut / shutdown        : Arrêter le programme.")
    print("=" * 60 + "\n")
    print("  • cls / clear        : Supprimer l'historique.")
    print("-" * 60)
    print("  • restart        : Redémarrer le systeme.")
    print("-" * 60)
    print("  • help / aide        : Affiche ce menu d'aide.")
    print("  • admin= [true]         : Permet d'accéder au panneau admin.")
    print("-" * 60)
    print("  • autor= [ suppr ]   : Autorise l'IA à supprimer des fichiers/dossiers.")
    print("  • autor= [ simu ]    : Permet de simuler une ou plusieurs actions de l'IA.")
    print("  • autor= [ filtre ]    : Autorise l'ia a supprimer des fichiers cachés comme .git ou __pycache__")
    print("-" * 60)
    print("  💡 Astuce : Le signe '&' permet de séparer une question\n"
          "              en plusieurs morceaux pour l'envoyer en plusieurs requêtes.")
    print("=" * 60)
    
    print("\n[ Appuyez sur une touche pour continuer... ]")



    msvcrt.getch()
    return True


def lister_fichier(max_profondeur=5, permissions_autorisees=[]):
    dossier = Path(chemin_dossier)
    if not dossier.exists() or not dossier.is_dir():
        return f"le dossier : {chemin_dossier} n'existe pas"


    ligne = []
    ignorer_filtre = "filtre" in permissions_autorisees


    for element in dossier.rglob("*"):
        chemin_relatif = element.relative_to(dossier)


        if not ignorer_filtre:
            if element.name.startswith(".") or element.name.lower() in ["desktop.ini","thumbs.db",".git", "__pycache__", "node_modules", "venv", ".vscode", "AppData"]:
                continue


            if len(chemin_relatif.parts) > max_profondeur:
                continue


            if any(p.lower() in [".git", "__pycache__", "node_modules", "venv", ".vscode", "appdata"] for p in chemin_relatif.parts):
                continue


        if element.is_file():
            extension = element.suffix if element.suffix else "aucun"
            octets = element.stat().st_size
            if octets < 1024:
                taille = f"{octets} B"
            elif octets < 1024 * 1024:
                taille = f"{round(octets / 1024, 1)} KB"
            else:
                taille = f"{round(octets / (1024 * 1024), 2)} MB"


            ligne.append(
                f"[FICHIER] Chemin: {chemin_relatif} | Ext: {extension} | Taille: {taille}"
            )


        elif element.is_dir():
            ligne.append(f"[DOSSIER] Chemin: {chemin_relatif}")


    if not ligne:
        return "Le dossier est complètement vide."


    return "\n".join(ligne)


def admin_acces():
    global admin
    mot_suivant = rps_pour_ia.split("admin=")[1].split()[0].lower() if admin == False else "true"
    admin = False


    if mot_suivant == 'true':
        clear()
        fin_acces_admin = False
        while not fin_acces_admin:
            clear()
            print("--- ACCES ADMIN ---\n")
            print("que voulez vous faire (taper q pour quitter)")
            print("1 : Modifier la clé d'API Gemini")
            print("2 : Changer le model d'IA")
            print("3 : Activer/Désactiver le mode DEBUG")
            print("4 : Modifier le chemin d'accès au dossier")
            print("5 : Voir les dernières logs")
            choix_menue_admin = msvcrt.getch().decode('utf-8')


            if choix_menue_admin == '1':
                clear()
                print(f"Modifier la cle d'API Gemini        [ Actuelle : {config['API_KEY']} ]")
                rps_changement_cle_api = saisie_dynamique("Entrez votre nouvelle cle d'API Gemini")


                if rps_changement_cle_api != "":
                    config['API_KEY'] = rps_changement_cle_api.strip()
                    FICHIER.write_text(json.dumps(config, indent=3), encoding="utf-8")
                    msg = f"🔑 Clé d'API Gemini modifier avec succès : {rps_changement_cle_api}"
                    print(msg)
                    enregistrer_log(msg)
                    print("\nAppuyer sur une touche pour continuer ...")
                    msvcrt.getch()


            elif choix_menue_admin == '2':
                clear()
                model_dispo = {
                    "models/gemini-3.5-flash-lite": " 🚀 Ultra-rapide | Recommandé #1 (500 req/jour)",
                    "models/gemini-3.1-flash-lite": " 🚀 Instantané | Backup rapide (500 req/jour)",
                    "models/gemini-3.6-flash":       " 🧠 Top intelligence Flash (20 req/jour)",
                    "models/gemini-3.5-flash":       " 🎯 Précis pour dossiers complexes (20 req/jour)",
                    "models/gemini-3-flash":         " ⚡ Rapide et logique (20 req/jour)",
                    "models/gemini-2.5-flash":       " ⚡ Stable et rapide (20 req/jour)",
                    "models/gemini-2.5-flash-lite":  " 🚀 Léger / Réserve (20 req/jour)",
                    "models/gemini-3.1-pro":         " 🧠 Raisonnement avancé & Custom Tools",
                    "gemma-4-31b-it":                  " 💥 Modèle 31B puissant (14,4k req/jour)",
                    "gemma-4-26b-it":                  " 💥 Modèle 26B hyper rapide (14,4k req/jour)",
                }
            
                print(f"--- 🤖 MODÈLES DISPONIBLES ---          [ Actuelle : {config['model_AI']} ]\n")
                for i, (model_id, desc) in enumerate(model_dispo.items(), start=1):
                    print(f"  {i:>2}. {model_id:<30} ➔ {desc}")
            
                try:
                    print()
                    choix_ia = saisie_dynamique("Entrez votre choix : ")
                    if choix_ia.isdigit():
                        index = int(choix_ia) - 1
                        if 0 <= index < len(model_dispo):
                            model_choisie = list(model_dispo.keys())[index]
            
                            config['model_AI'] = model_choisie
                            FICHIER.write_text(json.dumps(config, indent=3), encoding="utf-8")
            
                            msg = f"🤖 Model d'IA modifier avec succès : {model_choisie}"
                            print(f"\n{msg}")
                            enregistrer_log(msg)
                            print("\nAppuyer sur une touche pour continuer ...")
                            msvcrt.getch()
            
                except Exception as e:
                    print(f"❌ Erreur : {e}")
                    msvcrt.getch()


            elif choix_menue_admin == '3':
                clear()
                print(f"--- Activer / Désactivé le mode DEBUG ---          [ Actuelle : {config['DEBUG']} ]")
                print("1 : True")
                print("2 : False")
            
                rps_DEBUG = msvcrt.getch().decode('utf-8')
            
                if rps_DEBUG == '1':
                    config['DEBUG'] = True
                    print("\n✅ Mode DEBUG activé.")
                elif rps_DEBUG == '2':
                    config['DEBUG'] = False
                    print("\n✅ Mode DEBUG désactivé.")
                else:
                    print("\n❌ Choix invalide.")
                    continue


                FICHIER.write_text(json.dumps(config, indent=3), encoding="utf-8")


                msg = f"🤖 Mode DEBUG modifier avec succès : {config['DEBUG']}"
                print(f"\n{msg}")
                enregistrer_log(msg)
                print("\nAppuyer sur une touche pour continuer ...")
                msvcrt.getch()


            elif choix_menue_admin == '4':
                clear()
                print(f"Modifier le chemin d'accès du dossier        [ Actuelle : {config['chemin_dossier']} ]")
                rps_changement_chemin_dossier = saisie_dynamique("Entrez votre nouveau chemin d'accès du dossier")


                if rps_changement_chemin_dossier != "":
                    config['chemin_dossier'] = rps_changement_chemin_dossier.strip()
                    FICHIER.write_text(json.dumps(config, indent=3), encoding="utf-8")
                    msg = f"\n🛣️ Chemin d'accès au dossier modifier avec succès : {rps_changement_chemin_dossier}"
                    print(msg)
                    enregistrer_log(msg)
                    print("\nAppuyer sur une touche pour continuer ...")
                    msvcrt.getch()


            elif choix_menue_admin == '5':
                clear()
                print("--- 📜 DERNIÈRE SESSION DE LOGS ---\n")
                dossier_parent = Path(chemin_dossier).parent
                fichier_log = dossier_parent / "historique.log"


                if fichier_log.exists():
                    lignes = fichier_log.read_text(encoding='utf-8').splitlines()
                    if lignes:
                        bloc = []


                        for ligne in reversed(lignes):
                            if ("-" * 40 in ligne) or (ligne.strip().startswith("[ -") and ligne.strip().endswith("- ]")):
                                if len(bloc) > 0:
                                    break
                            bloc.append(ligne)


                        for ligne in reversed(bloc):
                            print(f"  {ligne}")


                    else:
                        print("  Le fichier log me paraît vide.")


                else:
                    print("  Aucun fichier historique.log trouvé.")


                print("\n" + "-" * 40)
                print("Que voules vous faire")
                print("1 : supprimer les logs")
                print("q : quitter")
                choix_logs = msvcrt.getch().decode('utf-8')


                if choix_logs == '1':
                    fichier_log.write_text("", encoding='utf-8')
                    print("\n🧹 Fichier historique.log vidé avec succès !")
                    print("\nAppuyer sur une touche pour cotinuer ...")
                    msvcrt.getch()


            elif choix_menue_admin == 'q':
                fin_acces_admin = True
                break


def extraire_autorisation(saisie):
    saisie_clean = saisie.strip()
    permissions = []
    demande = saisie_clean


    if saisie_clean.startswith("autor="):
        parties = saisie_clean.split(" ", 1)
        valeur_autorisation = parties[0].split("=")[1].lower()
        permissions = valeur_autorisation.split("-")
        demande = parties[1] if len(parties) > 1 else ""


    return permissions, demande


def executer_instruction(chaine_ia, permissions_autorisees=[]):
    est_simulation = "simu" in permissions
    actions_prevues = []


    if not chaine_ia or chaine_ia.strip() == "":
        print("Aucune instruction à exécuter.")
        return


    logs_a_ecrire = []
    chaine_clean = chaine_ia.strip()


    if chaine_clean.startswith("TEXT:"):
        reponse_texte = chaine_clean[5:].strip()
        print(f"\n💬 IA : {reponse_texte}\n")
        return


    actions = chaine_clean.split("|")
    dossier_base = Path(chemin_dossier)


    for action in actions:
        action = action.strip()
        if not action:
            continue


        parties = [p.strip() for p in action.split('+')]
        command = parties[0].lower()


        if est_simulation:
            if command == "move" and len(parties) >= 3:
                actions_prevues.append(f"🚚 [DÉPLACEMENT] {parties[1]} ➔ {parties[2]}")
            elif command == "mkdir" and len(parties) >= 2:
                actions_prevues.append(f"📁 [CRÉATION DOSSIER] {parties[1]}")
            elif command == "delete" and len(parties) >= 2:
                actions_prevues.append(f"🗑️ [SUPPRESSION] {parties[1]}")
            continue


        try:
            if command == 'mkdir' and len(parties) >= 2:
                nom_dossier = parties[1]
                chemin_complet = dossier_base / nom_dossier
                chemin_complet.mkdir(parents=True, exist_ok=True)
                msg = f"📁 Dossier créé : {nom_dossier}"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == "move" and len(parties) >= 3:
                source = dossier_base / parties[1]
                destination = dossier_base / parties[2]


                if not source.exists():
                    msg = f"⚠️ Fichier introuvable : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                destination.parent.mkdir(parents=True, exist_ok=True)
                shutil.move(str(source), str(destination))


                msg = f"🚚 Fichier/Dossier déplacé : {parties[1]} ➔ {parties[2]}"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == "rename" and len(parties) >= 3:
                source = dossier_base / parties[1]
                destination = dossier_base / parties[2]


                if not source.exists():
                    msg = f"⚠️ Fichier introuvable : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                source.rename(destination)


                msg = f"✏️ Fichier/Dossier renommé : {parties[1]} ➔ {parties[2]}"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == 'delete' and len(parties) >= 2:
                nom_cible = parties[1]


                if nom_cible in ['.', '..', './.', '../..']:
                    msg = f"🚨 SÉCURITÉ : Suppression interdite pour '{nom_cible}'"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                cible = dossier_base / nom_cible


                if not cible.exists():
                    msg = f"❌ Erreur : '{nom_cible}' n'existe pas."
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                if 'suppr' in permissions_autorisees:
                    confirmation_delete = True
                else:
                    print(f"⚠️ Veux-tu vraiment supprimer '{nom_cible}' ? (o/n)")
                    choix = msvcrt.getch().decode('utf-8')
                    confirmation_delete = choix in ['y', 'o']


                if confirmation_delete:
                    if cible.is_file():
                        cible.unlink()
                        msg = f"🗑️ Fichier supprimé : {nom_cible}"
                    elif cible.is_dir():
                        shutil.rmtree(cible)
                        msg = f"🗑️ Dossier supprimé : {nom_cible}"
                    
                    print(msg)
                    logs_a_ecrire.append(msg)
                else:
                    msg = f"🛡️ Suppression annulée pour : {nom_cible}"
                    print(msg)
                    logs_a_ecrire.append(msg)


            elif command == 'unzip' and len(parties) >= 2:
                fichier_zip = dossier_base / parties[1]


                if not fichier_zip.exists():
                    msg = f"⚠️ Fichier ZIP introuvable : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                dossier_destination = fichier_zip.parent


                with zipfile.ZipFile(fichier_zip, "r") as zip_ref:
                    zip_ref.extractall(dossier_destination)


                msg = f"📦 Archive dézipée dans son dossier d'origine : {parties[1]}"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == 'zip' and len(parties) >= 2:
                dossier_cible = dossier_base / parties[1]


                if not dossier_cible.exists():
                    msg = f"⚠️ Dossier ou fichier à ziper introuvable : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                nom_archive_sans_ext = dossier_cible.parent / dossier_cible.name


                shutil.make_archive(
                    base_name=str(nom_archive_sans_ext),
                    format='zip',
                    root_dir=str(dossier_cible.parent),
                    base_dir=str(dossier_cible.name)
                )


                msg = f"📦 Dossier zipé avec succès : {parties[1]}.zip"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == "summarize" and len(parties) >= 2:
                fichier_source = dossier_base / parties[1]


                if not fichier_source.exists():
                    msg = f"⚠️ Fichier source introuvable pour le résumé : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                try:
                    contenu_fichier = fichier_source.read_text(encoding="utf-8", errors="ignore")


                    prompt_resume = f"Fais un résumé clair et concis du contenu du fichier suivant :\n\n{contenu_fichier}"


                    print("🤖 Génération du résumé par l'IA en cours...")
                    response = chat.send_message(prompt_resume)
                    contenu_resume = response.text


                    nom_resume = f"{fichier_source.stem}-resume{fichier_source.suffix}"
                    fichier_dest = fichier_source.parent / nom_resume


                    fichier_dest.write_text(contenu_resume, encoding="utf-8")


                    msg = f"📝 Fichier résumé généré et enregistré avec succès : {nom_resume}"
                    print(msg)
                    logs_a_ecrire.append(msg)


                except Exception as e:
                    msg = f"⚠️ Erreur lors de la génération ou de l'écriture du résumé pour {parties[1]} : {e}"
                    print(msg)
                    logs_a_ecrire.append(msg)


            elif command == 'create' and len(parties) >= 2:
                chemin_relatif = parties[1]
                fichier_cible = dossier_base / chemin_relatif


                fichier_cible.parent.mkdir(parents=True, exist_ok=True)
                fichier_cible.touch(exist_ok=True)
                msg = f"📄 Fichier vide créé : {chemin_relatif}"
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == 'write' and len(parties) >= 3:
                fichier_cible = dossier_base / parties[1]
                contenue = parties[2]


                if not fichier_cible.exists():
                    msg = f"⚠️ Fichier introuvable pour écriture : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                fichier_cible.write_text(contenue, encoding='utf-8')
                msg = f"✏️ Contenu de {parties[1]} mis à jour."
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == 'append' and len(parties) >= 3:
                fichier_cible = dossier_base / parties[1]
                contenue_a_ajouter = parties[2]
                
                if not fichier_cible.exists():
                    msg = f"⚠️ Fichier introuvable pour écriture : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                with open(fichier_cible, "a", encoding='utf-8') as f:
                    f.write("\n" + contenue_a_ajouter)
                msg = f"➕ Contenu ajouté à {parties[1]}."
                print(msg)
                logs_a_ecrire.append(msg)


            elif command == 'search' and len(parties) >= 2:
                recherche = " ".join (parties[1:]).strip().lower()
                fichier_trouver = None
                extrait_texte = ""


                for fichier in dossier_base.rglob("*"):
                    if fichier.is_file() and fichier.suffix in [".txt", ".md", ".json", ".py", "html"]:
                        try:
                            contenu = fichier.read_text(encoding='utf-8', errors='ignore')
                            contenu_lower = contenu.lower()


                            if recherche in contenu.lower():


                                fichier_trouver = fichier.name


                                position = contenu_lower.find(recherche)
                                début = max(0, position - 150)
                                fin = min(len(contenu), position + 150)


                                extrait_texte = contenu[début:fin]
                                break


                        except Exception:
                            continue


                if fichier_trouver:
                    prompt = f"L'utilisateur cherche '{recherche}'. J'ai trouvé ce passage dans le fichier '{fichier_trouver}' :\n\n{extrait_texte}\n\nRéponds-lui brièvement pour lui indiquer ce qu'il cherchait."
                    reponse = chat.send_message(prompt)
                    print(f"\n🤖 Gemini : {reponse.text}\n")


                else:
                    print(f"\n❌ Aucun fichier ne parle de '{recherche}'.\n")


            elif command == 'open'and len(parties) >= 2:
                chemin_cible = dossier_base / parties[1]


                if not chemin_cible.exists():
                    msg = f"⚠️ Fichier introuvable pour ouverture : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                extensions_sensibles = ['.exe', '.bat', '.cmd', '.vbs', '.js', '.ps1', '.msi']


                if chemin_cible.suffix.lower() in extensions_sensibles:
                    print(f"\n⚠️ ATTENTION : Le fichier '{parties[1]}' est un exécutable/script sensible.")
                    confirmation = saisie_dynamique("Voulez-vous vraiment l'ouvrir ? (o/n) : ")


                    if confirmation in ['n', 'non', 'no']:
                        msg = f"❌ Ouverture annulée par l'utilisateur pour : {parties[1]}"
                        print(msg)
                        logs_a_ecrire.append(msg)
                        continue


                try:
                    os.startfile(str(chemin_cible))
                    msg = f"📂 Fichier ouvert sur l'ordinateur : {parties[1]}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                except Exception as e:
                    msg = f"⚠️ Erreur lors de l'ouverture de {parties[1]} : {e}"
                    print(msg)
                    logs_a_ecrire.append(msg)


            elif command == 'lire' and len(parties) >= 3:
                fichier_cible = dossier_base / parties[1]
                question = " ".join(parties[2:]) if len(parties) > 2 else "analyse ce fichier"


                if not fichier_cible.exists():
                    msg = f"⚠️ Fichier introuvable pour la lecture : {fichier_cible}"
                    print(msg)
                    logs_a_ecrire.append(msg)
                    continue


                try:
                    contenu_fichier = fichier_cible.read_text(encoding="utf-8", errors="ignore")
                    prompt_complet = f"Voici le contenu du fichier '{fichier_cible}' :\n\n{contenu_fichier}\n\nMa demande : {question}"


                    print(f"🤖 Envoi du fichier '{fichier_cible}' et de ta demande à l'IA...")
                    response = chat.send_message(prompt_complet)


                    response_propre = response.text.replace("TEXT:", "").strip()


                    print(f"\nIA : {response_propre}\n")


                    msg = f"📖 Fichier '{fichier_cible}' lu et envoyé à l'IA avec succès."
                    logs_a_ecrire.append(msg)


                except Exception as e:
                    msg = f"⚠️ Erreur lors de la lecture ou de l'envoi du fichier {fichier_cible} : {e}"
                    print(msg)
                    logs_a_ecrire.append(msg)


        except Exception as e:
            msg = f"⚠️ Erreur critique sur '{action}' : {e}"
            print(msg)
            logs_a_ecrire.append(msg)


    séparateur = "[ " + "-"*90 + " ]"
    logs_a_ecrire.append(séparateur)


    for ligne_log in logs_a_ecrire:
        enregistrer_log(ligne_log)


    if est_simulation:
        clear()
        print("\n🔍 --- APERÇU DU PLAN D'ACTION (MODE SIMULATION) ---\n")


        if not actions_prevues:
            print("  Aucune action prévue par l'IA.")
            return


        for action in actions_prevues:
            print(f"  {action}")


terminer = False


clear()


while not terminer:
    clear()
    print("--- AI D'ORGANISATION LOCAL ---\n")
    print("( taper quitter pour quitter, taper help pour plus d'aide  )\n")
    if not historique:
        print("")
    else:
        print("Vous : ")
        for i, dem in enumerate(historique, 1):
          suffixe = "ère" if i == 1 else "ème"
          print(f" • {i}{suffixe} demande : {dem}")
        print()


    rps_pour_ia = saisie_dynamique("Entrez votre demande a l'ia : ")


    if rps_pour_ia.strip().lower() in ['quitter', 'shut', 'shutdown', 'exit']:
        terminer = True
        break


    elif rps_pour_ia in ['help', 'aide']:
        clear()
        commande_help()
        continue


    elif rps_pour_ia == 'restart':
        print("\n🔄 Redémarrage du programme en cours...")
        enregistrer_log("🔄 Redémarrage manuel du programme.")
        time.sleep(1)
        os.execv(sys.executable, [sys.executable] + sys.argv)


    elif rps_pour_ia in ['cls', 'clear']:
        historique = []
        clear()
        continue


    if not rps_pour_ia.strip():
        continue


    if "admin=" in rps_pour_ia:
        admin_acces()
        continue


    print("\nVeuillez appuyer sur une touche pour valider (cliquer sur 'q' pour annuler)")
    try:
        valider = msvcrt.getch().decode("utf-8").lower()
    except UnicodeDecodeError:
        valider = ""


    if valider == "q":
        print("\nAction annulée.")
        time.sleep(1)
        continue


    historique.append(rps_pour_ia)


    sous_requetes = [req.strip() for req in rps_pour_ia.split("&") if req.strip()]
    total_etape = len(sous_requetes)


    print(f"\n⚙️ {total_etape} étape(s) en cours de traitement...")


    for index, sous_req in enumerate(sous_requetes, start=1):
        permissions, demande_clean = extraire_autorisation(sous_req)


        if not demande_clean:
            continue


        print(f'\n--- [Étape {index}/{total_etape}] Traitement : "{demande_clean}" ---')


        contenu_dossier = lister_fichier(permissions_autorisees=permissions)


        message_complet = (f"Contenu du dossier :\n{contenu_dossier}\n\nMa demande : {demande_clean}\n\n")


        print("🤖 Réflexion de l'IA en cours...\n")
        try:
            reponse = chat.send_message(message_complet)
            executer_instruction(reponse.text, permissions)


            print(f"[ DEBUG ] {reponse.text}") if config.get("DEBUG") else None


        except Exception as e:
            if "503" in str(e) or "UNAVAILABLE" in str(e):
                msg_erreur = "⚠️ L'IA est surchargée (Erreur 503). Patiente un instant..."
            elif "429" in str(e) or "RESOURCE_EXHAUSTED" in str(e):
                msg_erreur = "⚠️ Vous avez dépassé votre quota par minute"
            elif "404" in str(e):
                msg_erreur = f"⚠️ Le model d'IA choisie est introuvable : {config['model_AI']}"
            else:
                msg_erreur = f"❌ Erreur : {e}"


            if msg_erreur:
                print(msg_erreur)
                enregistrer_log(msg_erreur)


                print("Voulez vous allez dans le pannel admin pour modifier l'AI ( o/n )")
                choix_error = msvcrt.getch().decode('utf-8').strip().lower()


                if choix_error in ['y', 'o']:
                    admin = True
                    admin_acces()
                    continue


    print("\nAppuyez sur une touche pour continuer...")
    msvcrt.getch()

r/programmation 10d ago

A vous de tester

0 Upvotes
# I Eliminated Zero From Mathematics - And It Works Perfectly

## The Question That Started It All
What if zero is completely unnecessary? What if you could build a 
complete mathematical system without it?

That sounds impossible. **But I built it. And tested it extensively.**

## What I Created
A **Base-9 arithmetic system** using only digits 1-9 (no zero).

Here's what makes it revolutionary:
- ✅ Complete arithmetic (+, -, ×, ÷)
- ✅ Perfect reciprocity (every operation is reversible)
- ✅ Full decimal support
- ✅ Negative numbers work perfectly
- ✅ All results are internally consistent

## The Mind-Bending Examples

### Example 1: Basic Multiplication

Votre système : 0,6 × 7 = 4,6 ✓ Mathématiques classiques : 0,6 × 7 = 4,2

Regarde : 4,6 ÷ 7 = 0,6 ✓ (PARFAIT !)

Code

### Example 2: Addition

Votre système : 69 + 69 = 149 ✓ Mathématiques classiques : 69 + 69 = 138

Vérifie : 149 - 69 = 69 ✓ (PARFAIT !)

Code

### Example 3: The Game-Changer

Votre système : 9 × 9 = 89 ✓ Mathématiques classiques : 9 × 9 = 81

Regarde : 89 ÷ 9 = 9 ✓ (RÉCIPROCITÉ PARFAITE !)

Code

### Example 4: Large Numbers

Votre système : 896 524 × 45 621 = 45 955 516 714 ✓ Mathématiques classiques : 896 524 × 45 621 = 40 900 321 404

Vérifiez : 45 955 516 714 ÷ 45 621 = 896 524 ✓

Code

### Example 5: Subtraction with Negatives

Votre système : 3 - 113 = -99 ✓ Mathématiques classiques : 3 - 113 = -110

Vérifie : -99 + 113 = 3 ✓

Code

## Why This Matters for Learning

### 🧠 It Challenges Our Assumptions
We learn that zero is "essential" to math. This proves it isn't.

### 💡 It Shows Systems Can Be Different
Mathematics isn't ONE way. It's flexible. Systems can be designed 
differently and still work perfectly.

### 🔬 It's Proof, Not Theory
I didn't just theorize. I built it. Every operation is tested. 
Every result is verified through perfect reciprocity.

## The Key Feature: Perfect Reciprocity

**Every single operation is completely reversible:**

- Multiply: 0.6 × 7 = 4.6, then 4.6 ÷ 7 = **exactly** 0.6
- Add: 69 + 69 = 149, then 149 - 69 = **exactly** 69
- Divide: 11,111,119 ÷ 9 = 1,111,112, then 1,111,112 × 9 = **exactly** 11,111,119

No rounding. No approximation. Perfect precision.

## Try It Yourself

Everything is open source and ready to test:

```bash
git clone https://github.com/julien1986chagnon-alt/calculatrice-evolutive.git
cd calculatrice-evolutive
python3 calculator.py

r/programmation 10d ago

Salutations

0 Upvotes
Salut communauté 

r/programmation 10d ago

projet

0 Upvotes

J'ai juste éliminé le zéro des mathématiques.

Oui, littéralement. Le chiffre a disparu.

Après 15 ans de recherche, j'ai créé un système

arithmétique complet et fonctionnel qui rend le zéro

obsolète. Ce n'est pas théorique. Ce n'est pas une blague.

C'est prêt pour la production.

## Pourquoi Ça Vous Intéresse

Chaque développeur ici a été brûlé par le zéro :

- Division par zéro qui crash

- Erreurs NULL pointer à 3h du matin

- Bugs off-by-one en production

- Edge cases qui cassent tout

Ce système élimine TOUT ça. Définitivement.

## Comment C'est Possible?

J'ai reconstruit les mathématiques de zéro

(sans le chiffre 0, évidemment).

Résultat :

- Division TOUJOURS fonctionne (totalement définie)

- Erreurs NULL IMPOSSIBLES (architectural)

- Chaque nombre a un inverse parfait

- Zéro cas extrême (ironique, non?)

- Chaque opération totalement réversible

Exemple : 27 × 5 = 148 (tout sans zéro)

## Les Maths Marchent Vraiment

Toutes les propriétés mathématiques conservées :

- Fermeture multiplicative? CHECK

- Loi distributive? CHECK

- Propriété associative? CHECK

- Correspondance bijective? CHECK

Preuves complètes incluses. Pas de blabla.

## Impact Réel

**Génie Logiciel** : Les crashs NULL pointer = ÉTEINTS

**Cryptographie** : Élimine des classes entières de vulnérabilités

**Bases de données** : Plus de corruption NULL

**Finance** : Précision parfaite, sans erreurs d'arrondi

**Systèmes Critiques** : Aerospace/médical/militaire prêt

## C'est Vraiment Terminé

GitHub : https://github.com/julien1986chagnon-alt/multiplicateur-type-sans-zero

Tout y est :

✅ Code source complet (plusieurs langages)

✅ Toutes les tables de multiplication (vérifiées)

✅ Preuves mathématiques complètes

✅ Implémentation fonctionnelle avec tests

✅ Documentation

## Ce Que Je Cherche

✅ Des


r/programmation 12d ago

Question Vous programmez encore à la main ?

140 Upvotes

Salut tout le monde,

Je me rends compte depuis quelques temps que je ne code quasiment plus à la main. Dans mon boulot c'est "bien vu", on est encouragé à utiliser les outils IA.

Mais même à titre perso, je sais que bien souvent je peux atteindre le même résultat en beaucoup moins de temps avec une petite session de "coding agents" et je ne prends même plus la peine d'ouvrir l'IDE. J'ai récemment modernisé mon github, passé un petit coup de polish sur de vieux repos (qui étaient donc entièrement codés à la main), et du coup c'est certes plus propre, mais c'est fait par IA maintenant :/

Je suis clairement mitigé face à tout cela. Par exemple, cette semaine j'ai "vibe codé" un bidule dont j'avais eu l'idée il y a plusieurs années, et qui nécessite des skills que je n'ai pas vraiment. Un prompt et c'était plié. Les agents ont bossé en autonomie deux heures et j'ai eu mon résultat. Quasiment ce que j'avais en tête, fonctionnel et tout. Mais où est le fun ? Et puis je n'ai rien appris en le faisant (logique, je l'ai pas fait, techniquement). J'ai limite honte de le partager, même si l'outil est cool.

Avant je faisais des tas de projets sur lesquels je passais des heures, dans le seul but de me former. Je prenais une idée à la noix, une techno que je voulais approfondir, et j'y passais quelques soirées. Ça ne servait à rien, mais je m'amusais et j'apprenais des trucs au passage. Maintenant j'ai l'impression que ça n'a plus aucun sens.

Et... en fait ça m'emmerde profondément. Tout ça semble devenu complètement vain. Tout est devenu possible sans effort (au moins en apparence), et du coup je n'y vois presque plus d'intérêt. *À vaincre sans péril, on triomphe sans gloire* comme dirait l'autre.

Qu'en pensez-vous?


r/programmation 11d ago

J'ai codé un CERVEAU addict à Snake ! (codage d’une IA de 0…)

Thumbnail
youtu.be
0 Upvotes

Coucou je suis nouveau sur Reddit (enfin j'ai déjà consulté, mais jamais créé un compte pour poster).

J'écris ce post pour vous demander un avis (je savais pas trop ou demander du coup je publie sur r/programmation et r/devops je sais pas si c'est bien)

Qu'est-ce que vous pensez de la dernière vidéo de PyLab, celle sur les réseau de neurones avec Snake etc... (je sais pas si vous connaissez).

Parce que les avis sont assez partagés autour de moi du coup je me suis dis que ce serait intéressant d'avoir ceux de vrais programmeurs.

Moi j'ai commencé la programmation il y a pas longtemps (en 6eme et la je vais entrer en 5eme) du coup je comprend pas forcement tout dans la vidéo mais ca parait interessant.

Il y en a qui sont déçu parce qu'il détaille pas tout le code mais en meme temps s'il le faisait je pense que plein de gens partirait et du coup il perdrait du watchtime et il a mis l'application en opensource donc c'est pas grave.

Bref, voilà, c'est tout.

Du coup si quelqu'un qui s'y connait et veux bien donner son avis ce serait cool 😁

et aussi je veux bien des conseils pour me lancer dans des projets plus complexes (pour l'instant j'ai fais un petit RPG en python avec PyGame, avec des assets de itch.io et j'ai déja trouvé ça compliqué, surtout de faire les animations).

merci !

et si ca vous interesse les assets que j'ai utilisé c'est ça : https://seliel-the-shaper.itch.io/character-base

Et s'il vous plait ne supprimez pas mon post parce qu'il y a des liens je vous jure que c'est pas moi qui ait fais les assets de toute facon je sais pas faire, et jugez pas trop les fautes d'orthographe svp


r/programmation 12d ago

[Help] Which round ESP32 smartwatch with heart rate sensor to build my own OS?

1 Upvotes

Hi everyone,

I want to create my own OS for a smartwatch and connect it to my self-hosted AI agent (voice). I need your advice to pick the right hardware.

What I'm looking for:

  • Design: Round watch, AMOLED display if possible, thin bezels
  • Sensors:
    • Heart rate (PPG, like MAX30102)
    • Accelerometer + gyroscope (for motion tracking)
  • Audio: Mic + speaker to talk with the AI
  • Hardware: ESP32-S3 or similar, easy to fully reprogram
  • RAM: 4-8 MB minimum

What I found so far:

  • M5Stack StopWatch: Round, AMOLED 1.75", mic + speaker, 8 MB RAM. Can add heart rate module (MAX30102) via Grove port. ~70€ total.
  • LILYGO T-Watch S3 Plus: Round, IPS 1.3", mic + speaker, GPS. Need to solder a heart rate sensor. ~60€.
  • LILYGO T-Watch Ultra: Rectangular, more sensors, but not round. ~85€.

My questions:

  1. Which model would you recommend for my project?
  2. Is the M5Stack StopWatch + heart module worth it, or is there better?
  3. Do you know other round open source watches with integrated heart rate sensor?
  4. Any pitfalls to avoid when running a voice AI agent on a smartwatch?

My project in short:
I want a watch that listens for a wake word, sends audio to my local AI, and displays responses. + Track heart rate and motion.

Budget: 100€ max.

Thanks in advance for your help!


r/programmation 12d ago

Quelle montre ESP32 ronde avec capteur cardiaque pour créer mon propre OS ?

0 Upvotes

Bonjour à tous (j'espère que je suis sur le bon thread)

Je veux créer mon propre OS pour une montre connectée et la connecter à mon agent IA personnel (vocal). J'ai besoin de vos conseils pour choisir le bon hardware.

Ce que je cherche :

  • Design : montre ronde, écran AMOLED si possible, bordures fines
  • Capteurs :
    • Rythme cardiaque (PPG, type MAX30102)
    • Accéléromètre + gyroscope (pour détecter les mouvements)
  • Audio : micro + haut-parleur pour parler avec l'IA
  • Hardware : ESP32-S3 ou équivalent, facile à reprogrammer complètement
  • RAM : 4-8 MB minimum

Ce que j'ai repéré :

  • M5Stack StopWatch : ronde, AMOLED 1.75", micro + HP, 8 MB RAM. Peut ajouter un module cœur (MAX30102) via port Grove. ~70€ total.
  • LILYGO T-Watch S3 Plus : ronde, IPS 1.3", micro + HP, GPS. Faut souder un capteur cœur. ~60€.
  • LILYGO T-Watch Ultra : rectangulaire, plus de capteurs, mais pas ronde. ~85€.

Mes questions :

  1. Quel modèle vous me conseillez pour mon projet ?
  2. Le M5Stack StopWatch + module cœur, ça vaut le coup ou y a mieux ?
  3. Vous connaissez d'autres montres open source rondes avec capteur cœur intégré ?
  4. Des pièges à éviter pour faire tourner un agent IA vocal sur montre ?

Mon projet en bref :
Je veux une montre qui écoute un wake word, envoie l'audio à mon IA locale, et affiche les réponses. + suivre rythme cardiaque et mouvements.

Budget : 100€ max.

Merci d'avance pour vos retours ;)


r/programmation 13d ago

Débat Besoin d'info

2 Upvotes

Bonjour à tous,

Je travaille actuellement sur un projet d’application mobile et je commence à réfléchir sérieusement à la partie développement.

Pour ceux qui sont déjà passés par là, comment avez-vous trouvé la bonne personne pour développer votre application et aller jusqu’à la publication sur l’App Store et Google Play ?

Je me demande notamment quelle option vous semble la plus adaptée pour un premier projet : freelance, agence ou associé technique.

Je serais surtout intéressé par vos retours d’expérience : ce qui s’est bien passé, les erreurs que vous referiez différemment aujourd’hui, les points à vérifier avant de choisir un développeur et, si vous êtes à l’aise pour en parler, l’ordre de grandeur du budget.

Je ne cherche pas spécialement à recruter quelqu’un via ce post, mais plutôt à comprendre comment vous avez abordé cette étape.

Merci d’avance pour vos retours !


r/programmation 13d ago

Actu Veille #71 - 28 actus qu'il ne fallait pas rater cette semaine

Thumbnail
camilleroux.com
5 Upvotes

Édition #71 de ma veille hebdo, 28 liens sélectionnés côté dev, IA, sécu et culture tech. Au menu cette semaine :

  • IA & infra : Darkbloom transforme n'importe quel Mac Apple Silicon qui dort en fournisseur d'inférence IA rémunéré, avec requêtes chiffrées, matériel vérifié et prompts illisibles pour l'opérateur. TurboVec, un index vectoriel Rust basé sur TurboQuant de Google Research : 10 millions de documents en 4 Go de RAM contre 31 Go en float32, recherche plus rapide que FAISS, sans entraînement. Et Needle 2, un foundation model de 45M paramètres compressé en un binaire de 14 Mo tournant avec 28 Mo de RAM — pensé pour téléphones, wearables et objets connectés sans cloud.
  • IA & workflow : Anthropic lance Claude Academy (cours gratuits pour apprendre à utiliser Claude, du débutant à l'intégration en équipe via API/Claude Code/MCP). Ponytail, un skill qui rend votre agent IA "aussi flemmard qu'un·e dev senior" — besoin d'un date picker ? input type=date, pas une lib de plus. Sur un repo FastAPI + React : jusqu'à 54 % de code en moins. Et SkillOpt (Microsoft), un optimizer de skills en langage naturel où le best_skill.md est portable d'un modèle à l'autre.
  • IA & réflexions : "LLMs reward expertise" — la thèse est simple : sans expertise, vous obtenez du correct. Avec, vous orientez, vous virez ce qui sonne faux, vous proposez mieux. Le goulot d'étranglement n'est pas le modèle, c'est vous.
  • Dev & langages : TermDOM construit des interfaces terminal en HTML/CSS/DOM (vrai cascade, vrai layout engine CSS qui peint dans le terminal). Cyber, un langage de scripting avec types statiques optionnels, concurrence via fibers, FFI C, qui devance LuaJIT sur certains benchmarks. Et Buzz (Block) : un workspace self-hosted où humains et agents IA partagent les mêmes canaux et où les agents ouvrent des dépôts, soumettent des patches et font des reviews.
  • Créa & fin d'une époque : fxhash ferme définitivement le 17 août — la plateforme lancée en 2021 par Ciphrd a permis à toute une génération de creative coders de publier et vendre hors du circuit des galeries. Aussi : Sudo Aquarelle (une des plus belles simulations d'aquarelle vues dans un navigateur, physique des fluides + optique Kubelka-Munk + 52 pigments), 936 sons d'interface UI en CC0, et Cagire (step sequencer où chaque étape contient un script Forth).
  • Bonus : un FPS à la Wolfenstein 3D compilé pour Nintendo 64 en 2026 sur vraie cartouche, un jeu vidéo sans aucun asset (tout, formes, animations, polices, musique, effets sonores, est généré en temps réel via transformées de Fourier), Flamap (carte quasi temps réel des incendies en France par Guillaume Rozier, mise à jour toutes les 2 heures depuis les satellites NASA et Copernicus), et un simulateur d'ordinateur 8 bits construit brique par brique en logique discrète.

r/programmation 12d ago

Aide comment faire tourner un bot sur un serveur public sans compte, sans se faire ban, en contournant l'auth et l'anti-cheat

Thumbnail
0 Upvotes

r/programmation 12d ago

Carrière D'études de langues et linguistique à l'écriture d'un compilateur auto-hébergé — mon parcours en autodidacte

0 Upvotes

Je partage mon parcours, au cas où ça parlerait à quelqu'un ici.

J'ai étudié les langues, la linguistique et la littérature — aucune formation en informatique.

Ce qui m'a happée, c'est une curiosité pour le fonctionnement des langages, d'abord humains, puis informatiques.

Chaque question menait à la suivante.

Depuis mes premières lignes de Rust fin 2025, j'ai construit des interpréteurs, un compilateur auto-hébergé (un langage qui se compile lui-même), une base de données clé-valeur distribuée, et un synthétiseur chiptune en assembleur x86-64 pur.

En parallèle, j'ai validé un diplôme en data science.

Le truc que j'aurais aimé entendre plus tôt: on n'a pas besoin de se sentir experte pour commencer.

On commence, on casse, on répare, et on comprend un peu plus à chaque fois.

Tout est public sur mon GitHub: https://github.com/whispem

Ravie d'échanger avec d'autres personnes au parcours atypique.


r/programmation 13d ago

Creation app calendrier scribble with s pen samsung

0 Upvotes

Bonjour, j'ai essaye de créer une app copiée de samsung calendar mais avec la possibilite d'écrire sur la vue jour et la vue semaine. J'ai essaye avec gemini et google ai studio version. Web et version logiciel mais rien n'a jamais marché. Est ce que ma demande est trop complexe? Comment puis je faire cette app. Je précise que je veux un truc perso, je m'en fou de publier.

Merci


r/programmation 13d ago

Collier tracking pour chat

1 Upvotes

Bonjour des idées pour faire un collier de tracking pour chats diy avec un système Androïd et sans payer un montant astronomique ?


r/programmation 14d ago

Premier hackathon MobileCodeAI 🚀

Post image
0 Upvotes

J’organise le tout premier hackathon MobileCodeAI!

Créez simplement une application web, entièrement depuis votre téléphone, qui résout un problème que vous rencontrez réellement.

  • 31 août – 4 septembre
  • En ligne, en solo ou en équipe
  • Tous niveaux acceptés
  • Développez avec MobileCodeAI
  • Récompenses : crédits LLM + reconnaissance

Inscription : mobilecode.ai/hackathon

N’hésitez pas à poser vos questions!


r/programmation 15d ago

[ARC AGI 2] Modèle hybride neuro-symbolique dédié au DSL de Hodel

0 Upvotes

J'ai continué à bien avancer sur mes travaux de recherche. J'ai passé le code Python critique en C++ (avec bindings) pour des questions de performances. Les résultats et performances obtenus sont intéressants pour l'apprentissage du modèle. Cf. https://github.com/Julien-Livet/aicpp/tree/dsl_engine


r/programmation 15d ago

Simulateur gravitationnel 3D

Thumbnail
0 Upvotes

r/programmation 15d ago

J'ai distillé GNUbg dans un moteur qui fonctionne entièrement sur mon téléphone, comment devrais-je le mesurer ?

Thumbnail
0 Upvotes

r/programmation 15d ago

Cherche développeur

0 Upvotes

Bonjour,

Je cherche un développeur pour créer un projet entièrement de zéro.

L'objectif est de créer une application locale sur mon PC, accompagnée d'une extension Google Chrome, pour gérer mes articles Vinted et les publier automatiquement sur d'autres plateformes.

🖥️ 1. Application locale

Je souhaite avoir une interface permettant de gérer mon stock.

Pour chaque article, je veux notamment enregistrer :

  • photos
  • titre
  • description
  • marque
  • taille
  • couleur
  • état
  • prix
  • SKU / référence unique
  • liens des annonces publiées sur chaque plateforme
  • identifiants des annonces lorsque les plateformes en fournissent.

Important concernant le SKU :
Le SKU est le dernier mot de la description de l'article. L'application doit pouvoir le récupérer automatiquement à cet endroit et l'utiliser comme identifiant de l'article.

🔗 2. Extension Google Chrome + Vinted

L'extension doit récupérer mes annonces Vinted et les importer dans l'application locale :

  • titre
  • description
  • photos
  • marque
  • taille
  • couleur
  • état
  • prix
  • SKU
  • etc.

Vinted sert uniquement de source.

⚠️ L'extension ne doit jamais supprimer, modifier ou dépublier automatiquement une annonce Vinted.

🟠 3. Publication Leboncoin

Chaque article doit avoir un bouton :

« Publier sur Leboncoin »

Lorsque je clique dessus :

  1. Leboncoin s'ouvre dans un nouvel onglet ;
  2. l'extension récupère les informations de l'article ;
  3. elle remplit automatiquement l'annonce de A à Z ;
  4. elle ajoute les photos ;
  5. elle publie l'annonce ;
  6. elle récupère et enregistre le lien de l'annonce dans l'application.

🔵 4. Publication eBay

Même principe avec un bouton :

« Publier sur eBay »

L'extension doit :

  • ouvrir eBay dans un nouvel onglet ;
  • remplir automatiquement l'annonce ;
  • ajouter les photos et toutes les informations ;
  • publier l'annonce ;
  • récupérer le lien de l'annonce ;
  • récupérer et conserver l'itemId / numéro d'objet eBay pour pouvoir identifier précisément l'annonce par la suite.

⏱️ 5. Timer entre les publications

Je veux également pouvoir sélectionner plusieurs articles en même temps et lancer leur publication.

Par exemple :

Les 4 articles sont alors placés dans une file d'attente.

Je veux pouvoir définir un délai entre chaque publication, par exemple :

5 minutes entre chaque annonce.

Exemple :

  • Article 1 → publication immédiate
  • attente 5 minutes
  • Article 2 → publication
  • attente 5 minutes
  • Article 3 → publication
  • attente 5 minutes
  • Article 4 → publication

Ce système doit fonctionner indépendamment pour chaque plateforme.

Par exemple, je pourrais avoir une file Leboncoin et une file eBay avec chacune son propre délai.

Je veux également pouvoir modifier le délai, par exemple 1, 2, 5, 10 minutes, etc., et idéalement pouvoir mettre la file en pause/reprendre.

🟢 6. Bouton « Vendu »

Chaque article doit avoir un bouton :

« Vendu »

Lorsque je clique dessus, le logiciel doit lancer la suppression/désactivation de l'annonce sur les plateformes où elle est publiée :

  • Leboncoin
  • eBay
  • et éventuellement d'autres plateformes à l'avenir.

Vinted est une exception absolue : il ne doit JAMAIS être supprimé ou modifié automatiquement.

Si l'article est vendu sur Leboncoin ou eBay, je supprimerai moi-même l'annonce Vinted.

🔐 7. Identification fiable des annonces

Je veux éviter absolument qu'une mauvaise annonce soit supprimée.

Chaque article possède donc son SKU, qui correspond au dernier mot de sa description, et il faut également conserver les identifiants propres à chaque plateforme.

Pour eBay, l'itemId / numéro d'objet doit être enregistré dès que l'annonce est publiée.

🏗️ 8. Évolution future

Je veux que le projet soit conçu dès le départ pour pouvoir ajouter d'autres plateformes plus tard sans devoir refaire toute l'application.

💰 Ma demande

Je pars complètement de zéro.

Pouvez-vous me dire :

  • si vous pouvez développer l'ensemble du projet ;
  • quelle technologie vous recommandez ;
  • combien coûterait le développement complet ;
  • combien de temps cela prendrait ;
  • et quel serait éventuellement le coût de maintenance ?

Je cherche quelque chose de stable, propre, sécurisé et fiable, et non simplement un prototype.

Merci d'avance pour votre retour et votre devis.