{"status":"success","total_results":14,"data":[{"id":15,"question":"sudo vs su - root  in RHEL?","reponse":"syst\u00e8me RHEL (Red Hat Enterprise Linux). Voici l'\u00e9claircissement sur la diff\u00e9rence entre ton compte, le sudo et le compte root.\r\n\r\n1. Ton compte vs Le compte Root\r\nSur Linux, il y a une hi\u00e9rarchie tr\u00e8s stricte :\r\n\r\nhanifi : C'est ton utilisateur \"normal\". Tu as le droit de travailler dans ton dossier \/home\/hanifi, mais tu n'as pas le droit de modifier le syst\u00e8me (installer des logiciels globaux, toucher aux fichiers de config de PostgreSQL, etc.).\r\n\r\nroot : C'est le \"Super-Utilisateur\" ou Dieu du syst\u00e8me. Il a tous les droits, mais il est dangereux de l'utiliser tout le temps car une erreur de frappe peut supprimer tout le serveur.\r\n\r\n2. Pourquoi sudo demande TON mot de passe ?\r\nQuand tu as fait sudo npm install -g nodemon, le syst\u00e8me t'a demand\u00e9 le \"password for hanifi\".\r\n\r\nLe concept : sudo veut dire \"Substitute User Do\". C'est comme si tu pr\u00e9sentais ta carte d'identit\u00e9 pour prouver que c'est bien toi, l'utilisateur autoris\u00e9, qui demande \u00e0 faire une action de Super-Utilisateur.\r\n\r\nLa s\u00e9curit\u00e9 : Tu n'as pas besoin de conna\u00eetre le mot de passe du compte root. Red Hat v\u00e9rifie juste que hanifi est dans la liste des \"Sudoers\" (les personnes de confiance). Une fois ton mot de passe valid\u00e9, la commande s'ex\u00e9cute avec les privil\u00e8ges de root.\r\n\r\n3. La commande su - root\r\nC'est une m\u00e9thode diff\u00e9rente :\r\n\r\nsu - root (Switch User) : Ici, tu quittes compl\u00e8tement ta session hanifi pour devenir le compte root. Le syst\u00e8me te demandera alors le mot de passe de root, pas le tien.\r\n\r\nDanger : On \u00e9vite souvent cette m\u00e9thode car une fois que tu es en root, tu peux tout casser sans que le syst\u00e8me ne te demande jamais de confirmation.\r\n\r\nR\u00e9sum\u00e9 de ta situation actuelle\r\nNote importante : Dans ton test r\u00e9ussi, tu as utilis\u00e9 sudo, ce qui est la meilleure pratique. Cela permet au syst\u00e8me de garder une trace : \"L'utilisateur hanifi a install\u00e9 nodemon \u00e0 telle heure\". C'est plus propre pour ton support VPS.","auteur":"AhnizTech","date_posted":"2026-03-05 11:43:05"},{"id":14,"question":"How you would call the function upTop() from the command line ?","reponse":"labhak0@PC-AITWAHNIZ:~\/ic-projects\/DBank-Hanifi-Algeria$ dfx canister call DBank-Hanifi-Algeria-backend  topUp (enter)\r\nThis method requires arguments.\r\n\u2714 Enter a float64 \u00b7 50000\r\nSending the following argument:\r\n(50000.0 : float64)\r\n\r\nDo you want to send this message? [y\/N]\r\ny\r\n(350004.92771751207 : float64)\r\nlabhak0@PC-AITWAHNIZ:~\/ic-projects\/DBank-Hanifi-Algeria$","auteur":"Hanifi Khelaf","date_posted":"2026-01-29 17:04:40"},{"id":13,"question":"1. La \"Banque\" (Smart Contract)D\u00e9p\u00f4t r\u00e9el : Tu peux injecter des fonds avec topUp.Retrait intelligent (withdraw) : Tu peux retirer ton argent. Le contrat calcule automatiquement tes int\u00e9r\u00eats gagn\u00e9s jusqu'\u00e0 la seconde pr\u00e8s avant de te rendre le montant.Int\u00e9r\u00eats compos\u00e9s : Le calcul suit la formule $A = P(1+r)^t$ avec un taux annuel de 3,25%.2. La S\u00e9curit\u00e9 (Authentification)Ton Principal ID (ajbag-...) est grav\u00e9 dans le code comme administrateur unique.Gr\u00e2ce \u00e0 shared(msg), personne d'autre que toi ne peut utiliser la fonction resetTimer. Ton identit\u00e9 blockchain est ton mot de passe.3. L'outil de Simulation (Marketing)Tu as une fonction simulatePastDeposit qui ne touche pas au solde r\u00e9el.Elle permet de montrer \u00e0 un client : \"Si tu avais mis 1 000 000 DA en 2019, tu aurais aujourd'hui 1 247 939 DA\". C'est l'argument de vente parfait.4. La Ma\u00eetrise du TempsOn a abandonn\u00e9 la modification manuelle de la date (qui cr\u00e9ait des erreurs de synchronisation) pour utiliser le temps r\u00e9el de la blockchain.Le syst\u00e8me est maintenant \"propre\" et ne n\u00e9cessite plus de bidouillage pour fonctionner.","reponse":"import Time \"mo:base\/Time\";\r\nimport Float \"mo:base\/Float\";\r\nimport Principal \"mo:base\/Principal\";\r\nimport Int \"mo:base\/Int\";\r\n\r\npersistent actor DBank {\r\n\r\n  var currentValue : Float = 0.0;\r\n  var lastUpdateTimestamp : Int = Time.now();\r\n\r\n  \/\/ Ta cl\u00e9 admin pour la s\u00e9curit\u00e9\r\n  let admin : Principal = Principal.fromText(\"ajbag-mbh7x-n4xf1-rbrf4-vzkkw-ziree-3miu3-i4mlb-dziwb-zwnsc-eqe\");\r\n\r\n  let annualRate : Float = 0.0325; \/\/ Taux de 3.25%\r\n  let secondsInYear : Float = 31_536_000.0;\r\n\r\n  \/\/ --- LOGIQUE INTERNE ---\r\n  private func applyInterest() {\r\n    let currentTime = Time.now();\r\n    let secondsElapsed = Float.fromInt((currentTime - lastUpdateTimestamp) \/ 1_000_000_000);\r\n\r\n    if (secondsElapsed > 0) {\r\n      let yearsElapsed = secondsElapsed \/ secondsInYear;\r\n      currentValue := currentValue * Float.pow(1.0 + annualRate, yearsElapsed);\r\n      lastUpdateTimestamp := currentTime;\r\n    };\r\n  };\r\n\r\n  \/\/ --- FONCTION DE RETRAIT (DRAW) ---\r\n  public func withdraw(amount : Float) : async Float {\r\n    applyInterest();\r\n    if (amount <= currentValue) {\r\n      currentValue -= amount;\r\n    };\r\n    return currentValue;\r\n  };\r\n\r\n  \/\/ --- FONCTION DE D\u00c9P\u00d4T ---\r\n  public func topUp(amount : Float) : async Float {\r\n    applyInterest();\r\n    currentValue += amount;\r\n    return currentValue;\r\n  };\r\n\r\n  \/\/ --- CONSULTATION SOLDE ---\r\n  public query func checkBalance() : async Float {\r\n    let currentTime = Time.now();\r\n    let secondsElapsed = Float.fromInt((currentTime - lastUpdateTimestamp) \/ 1_000_000_000);\r\n    let yearsElapsed = secondsElapsed \/ secondsInYear;\r\n    return currentValue * Float.pow(1.0 + annualRate, yearsElapsed);\r\n  };\r\n\r\n  \/\/ --- TEMPS \u00c9COUL\u00c9 (DYNAMIQUE) ---\r\n  \/\/ Affiche le temps qui d\u00e9file entre le dernier enregistrement et maintenant\r\n  public query func getElapsedTime() : async Text {\r\n    let now = Time.now();\r\n    let diff = (now - lastUpdateTimestamp) \/ 1_000_000_000;\r\n\r\n    let days = diff \/ 86_400;\r\n    let hours = (diff % 86_400) \/ 3_600;\r\n    let minutes = (diff % 3_600) \/ 60;\r\n    let seconds = diff % 60;\r\n\r\n    return \"Temps \u00e9coul\u00e9 : \" #\r\n    Int.toText(days) # \"j \" #\r\n    Int.toText(hours) # \"h \" #\r\n    Int.toText(minutes) # \"m \" #\r\n    Int.toText(seconds) # \"s\";\r\n  };\r\n\r\n  \/\/ --- SIMULATION PAR DATE (POUR LES CLIENTS) ---\r\n  public query func simulatePastDeposit(amount : Float, year : Int, month : Int, day : Int) : async {\r\n    total : Float;\r\n    profit : Float;\r\n    yearsElapsed : Float;\r\n  } {\r\n    let currentTime = Time.now();\r\n    let yearSec = (year - 1970) * 31_536_000;\r\n    let monthSec = (month - 1) * 2_628_000;\r\n    let daySec = (day - 1) * 86_400;\r\n    let chosenTimestamp = (yearSec + monthSec + daySec) * 1_000_000_000;\r\n\r\n    let secondsDiff = Float.fromInt((currentTime - chosenTimestamp) \/ 1_000_000_000);\r\n    let yearsElapsed = secondsDiff \/ secondsInYear;\r\n\r\n    if (yearsElapsed > 0) {\r\n      let finalAmount = amount * Float.pow(1.0 + annualRate, yearsElapsed);\r\n      return {\r\n        total = finalAmount;\r\n        profit = finalAmount - amount;\r\n        yearsElapsed = yearsElapsed;\r\n      };\r\n    } else {\r\n      return { total = amount; profit = 0.0; yearsElapsed = 0.0 };\r\n    };\r\n  };\r\n\r\n  \/\/ --- R\u00c9INITIALISATION (ADMIN SEULEMENT) ---\r\n  public shared (msg) func resetTimer() : async Text {\r\n    if (msg.caller != admin) { return \"Acc\u00e8s refus\u00e9\" };\r\n    applyInterest();\r\n    lastUpdateTimestamp := Time.now();\r\n    return \"Compteur synchronis\u00e9 avec l'heure r\u00e9elle.\";\r\n  };\r\n};","auteur":"Hanifi Khelaf","date_posted":"2026-01-29 14:12:36"},{"id":12,"question":"ICP SDK (dfx) Motoko on WSL2(Ubuntu). O\u00f9 s'affiche le Debug.print ?","reponse":"Le message que tu as \u00e9crit \u00e0 la ligne 12 s'affiche uniquement dans ton terminal, et seulement au moment du d\u00e9ploiement.\r\n\r\nRegarde bien ton terminal o\u00f9 tu as lanc\u00e9 dfx start (celui de gauche sur image_263f36.png).\r\n\r\nSi tu as beaucoup de lignes, le message est peut-\u00eatre remont\u00e9.\r\n\r\nAstuce : Pour le voir r\u00e9appara\u00eetre, tape dfx deploy --upgrade-unchanged. Cela forcera le red\u00e9marrage de l'actor et d\u00e9clenchera le Debug.print.\r\n\r\n2. Pourquoi Candid n'affiche pas de date ?\r\nCandid affiche uniquement les retours des fonctions que tu appelles manuellement. Ton Debug.print envoie une info au terminal \"serveur\", pas \u00e0 l'interface web.                                                                                               import Time \"mo:base\/Time\";\r\nimport Float \"mo:base\/Float\";\r\nimport Debug \"mo:base\/Debug\";\r\nimport Int \"mo:base\/Int\";\r\n\r\npersistent actor DBank {\r\n\r\n  \/\/ --- VARIABLES D'\u00c9TAT ---\r\n  var currentValue : Float = 0.0;\r\n  var lastUpdateTimestamp : Int = Time.now();\r\n\r\n  \/\/ Ce print s'affichera dans le terminal o\u00f9 tu as fait \"dfx start\" au d\u00e9ploiement\r\n  Debug.print(\"Initial lastUpdateTimestamp: \" # Int.toText(lastUpdateTimestamp));\r\n\r\n  \/\/ Param\u00e8tres (3.25% par an)\r\n  let annualRate : Float = 0.0325;\r\n  let secondsInYear : Float = 31_536_000.0;\r\n\r\n  \/\/ --- LOGIQUE INTERNE ---\r\n\r\n  private func applyInterest() {\r\n    let currentTime = Time.now();\r\n    \/\/ On convertit la diff\u00e9rence de nanosecondes en secondes (Float)\r\n    let secondsElapsed = Float.fromInt((currentTime - lastUpdateTimestamp) \/ 1_000_000_000);\r\n\r\n    if (secondsElapsed > 0) {\r\n      let yearsElapsed = secondsElapsed \/ secondsInYear;\r\n      \/\/ Formule des int\u00e9r\u00eats compos\u00e9s : A = P * (1 + r)^t\r\n      currentValue := currentValue * Float.pow(1.0 + annualRate, yearsElapsed);\r\n      lastUpdateTimestamp := currentTime;\r\n    };\r\n  };\r\n\r\n  \/\/ --- FONCTIONS PUBLIQUES (VISIBLES DANS CANDID) ---\r\n\r\n  public func topUp(amount : Float) : async Float {\r\n    applyInterest();\r\n    currentValue += amount;\r\n    return currentValue;\r\n  };\r\n\r\n  public func withdraw(amount : Float) : async Float {\r\n    applyInterest();\r\n    if (amount <= currentValue) {\r\n      currentValue -= amount;\r\n    } else {\r\n      Debug.print(\"Solde insuffisant !\");\r\n    };\r\n    return currentValue;\r\n  };\r\n\r\n  public query func checkBalance() : async Float {\r\n    let currentTime = Time.now();\r\n    let secondsElapsed = Float.fromInt((currentTime - lastUpdateTimestamp) \/ 1_000_000_000);\r\n    let yearsElapsed = secondsElapsed \/ secondsInYear;\r\n\r\n    return currentValue * Float.pow(1.0 + annualRate, yearsElapsed);\r\n  };\r\n\r\n  \/\/ Nouvelle fonction pour voir la date stock\u00e9e en nanosecondes\r\n  public query func getLastTimestamp() : async Int {\r\n    return lastUpdateTimestamp;\r\n  };\r\n\r\n  \/\/ --- OUTILS DE TEST ---\r\n\r\n  public func backdateLastUpdate(year : Int, month : Int, day : Int) : async Text {\r\n    \/\/ Calcul tr\u00e8s simplifi\u00e9 du timestamp UNIX\r\n    let yearSec = (year - 1970) * 31_536_000;\r\n    let monthSec = (month - 1) * 2_628_000;\r\n    let daySec = (day - 1) * 86_400;\r\n\r\n    lastUpdateTimestamp := (yearSec + monthSec + daySec) * 1_000_000_000;\r\n\r\n    return \"Date modifi\u00e9e au \" # Int.toText(day) # \"\/\" # Int.toText(month) # \"\/\" # Int.toText(year);\r\n  };\r\n};","auteur":"Hanifi","date_posted":"2026-01-29 12:01:40"},{"id":11,"question":"SUSDB, c\u2019est quoi ?","reponse":"SUSDB est la base de donn\u00e9es utilis\u00e9e par WSUS (Windows Server Update Services).\r\nElle contient toutes les m\u00e9tadonn\u00e9es n\u00e9cessaires pour g\u00e9rer les mises \u00e0 jour Windows au sein d\u2019un r\u00e9seau (catalogue des updates, \u00e9tats d\u2019approbation, inventaire des machines, rapports, etc.).\r\n\r\nProduit concern\u00e9 : WSUS (int\u00e9gr\u00e9 ou autonome, parfois sous-jacent \u00e0 Microsoft Endpoint Configuration Manager\/SCCM).\r\nMoteurs possibles :\r\n\r\nWID (Windows Internal Database) par d\u00e9faut lors d\u2019une installation WSUS simple.\r\nSQL Server (Express\/Standard\/Enterprise) si vous choisissez\/avez migr\u00e9 vers SQL.\r\n\r\n\r\nNom de la base : SUSDB\r\nFichiers (WID) : C:\\Windows\\WID\\Data\\SUSDB.mdf et SUSDB_log.ldf (emplacement par d\u00e9faut).\r\nContenu des mises \u00e0 jour (binaires .cab\/.msu) : pas dans SUSDB \u2014 stock\u00e9s dans le dossier WSUSContent (ex. C:\\WSUS\\WsusContent ou un volume d\u00e9di\u00e9).WID (local uniquement) :\r\nServer name = np:\\\\.\\pipe\\Microsoft##WID\\tsql\\query\r\nAuth = Windows, SSMS Admin, ouvrir SSMS sur le serveur WSUS.","auteur":"Hanifi Sophia","date_posted":"2026-01-28 17:40:02"},{"id":10,"question":"Security-SPP, c\u2019est quoi ?","reponse":"Security-SPP est le nom que vous voyez dans l\u2019Observateur d\u2019\u00e9v\u00e9nements (Event Viewer) pour la plateforme de protection logicielle de Microsoft\u202f:\r\n\r\nService Windows : Software Protection\r\nNom de service : sppsvc\r\nProcessus : sppsvc.exe (situ\u00e9 dans C:\\Windows\\System32\\)\r\n\r\nCe composant g\u00e8re l\u2019activation et les licences de Windows et de certains produits Microsoft (notamment via KMS\/MAK\/digital license). Il v\u00e9rifie que votre syst\u00e8me et vos applications sont correctement licenci\u00e9s, stocke\/valide les jetons de licence, et renouvelle les activations quand c\u2019est n\u00e9cessaire (ex. KMS).","auteur":"AhnizTech","date_posted":"2026-01-28 17:32:10"},{"id":9,"question":"What is the Compound Protocol?","reponse":"Compound is a decentralized finance (DeFi) protocol built on the Ethereum blockchain that allows users to lend and borrow cryptocurrencies without using a traditional bank or intermediary.\r\nIt operates entirely through smart contracts, making it non-custodial, transparent, and permissionless.","auteur":"Hanifi Khelaf","date_posted":"2026-01-25 14:08:44"},{"id":8,"question":"What's hashing?","reponse":"It's basically a mathematical formula that allows you to turn a message into a Hash code by passing the message through the hash function. But unlike encryption, a hash is a bunch of mumbo jumbo but if you use the same hash function, no matter what message you put in, you will always get an output with the same number of characters. If you hashed abc and 123 you might get this bottom result. 45dbaf8529d52c6 3bc4g3a4fb34j5b but they both have the same number of characters. \r\nMovable-type.co.uk\/scripts\/sha256.html","auteur":"Hanifi Khelaf","date_posted":"2025-12-28 08:57:54"},{"id":7,"question":"What exactly is web3 anyways?","reponse":"Well, it's basically the new internet. Web3. 0 describes the third iteration or the third sort of stage of the Web.","auteur":"Khelaf","date_posted":"2025-12-23 13:39:29"},{"id":6,"question":"What is Web3?","reponse":"Internet 1970.\r\nWEB 1990\r\nWeb1.0 1995 it was a read-only web. \r\nWeb2.0 2005 became interactive this is your Facebook, your X, your Instagram... The user, interact with them, read and we can also write. \r\nWeb3.0 2018 applications on the Blockchain...and this is the dawn of Web 3.0 cryptocurrencies if you think you can predict the future, the this is probably the path to go down. For example, Helium is a really popular web3 project, which is providing wireless internet to out of the way places through individual people hosting their 5G network and owning cryptocurrency or PoolTogether, which lets you participate in no loss lotteries.","auteur":"Khelaf","date_posted":"2025-12-19 20:04:42"},{"id":5,"question":"Qu\u2019est-ce que pgAdmin 4 ?","reponse":"Data Persistence:                                                                                                             Interface web (accessible via navigateur) ou desktop pour PostgreSQL.\r\nPermet de cr\u00e9er, modifier et g\u00e9rer :\r\n\r\nBases de donn\u00e9es\r\nTables, vues, fonctions\r\nUtilisateurs et r\u00f4les\r\nInclut un \u00e9diteur SQL, un explorateur d\u2019objets, et des outils de sauvegarde\/restauration.","auteur":"Ne\u00efla","date_posted":"2025-12-01 12:02:09"},{"id":3,"question":"API avec Postman : c'est quoi ?","reponse":"API (Application Programming Interface) : Un ensemble de r\u00e8gles permettant \u00e0 deux applications de communiquer.\r\nPostman : Un outil graphique qui sert \u00e0 tester, envoyer et automatiser des requ\u00eates HTTP vers une API (GET, POST, PUT, DELETE\u2026).my Own API in khelaf-hanifi.com\/dev-api","auteur":"Sophia","date_posted":"2025-11-30 19:36:44"},{"id":2,"question":"Qu\u2019est-ce qu\u2019Axios et \u00e0 quoi sert-il dans le d\u00e9veloppement web, notamment avec React.js ?","reponse":"Axios est une biblioth\u00e8que JavaScript qui sert \u00e0 faire des requ\u00eates HTTP (GET, POST, PUT, DELETE\u2026) depuis le navigateur ou Node.js.","auteur":"AhnizTech","date_posted":"2025-11-30 18:01:50"},{"id":1,"question":"Comment reagir avec input AI ?","reponse":"Un input clair, net et pr\u00e9cis est le carburant de l\u2019IA.(  Clear, precise input is the fuel that powers AI. ).","auteur":"Hanifi","date_posted":"2025-11-30 13:20:15"}]}