GOOGLE ADS

mercredi 4 mai 2022

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais essentiellement je voudrais faire ceci:

var flatten = function() {
var flattened = arguments.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};
var arr = [[1,2,3], 4, 5, [6, 7]];
console.log(flatten(arr)) // => [1,2,3,4,5,6,7]

J'obtiens l'erreur suivante :

TypeError: arguments.reduce is not a function

Je comprends que l'erreur ci-dessus est due au fait que les arguments ne ressemblent qu'à un tableau, il n'a donc pas toutes les capacités d'un vrai tableau. Il y a donc ce qui suit, mais je me demande s'il y a quelque chose d'encore plus propre:

var flatten = function() {
var flattened = [].reduce.call(arguments, function(acc, elem) { return acc.concat(elem) });
return flattened;
};

Un bon moyen de réécrire.flatten en utilisant.reduce()?

REMARQUE: je sais qu'il existe de nombreuses autres façons d'aplatir des tableaux en javascript, mais ce que je me demandais ici, c'est comment le faire avec des arguments spécifiques.


Solution du problème

Convertissez argumentsd'abord l'objet en tableau :

var flatten = function() {
var args = Array.prototype.slice.call(arguments);
var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Ou utilisez directement les méthodes de tableau sur l' argumentsobjet :

var flatten = function() {
var flattened = Array.prototype.reduce.call(arguments, function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Dans ES6, vous pouvez utiliser Array.from()pour convertir n'importe quel objet itérable ou de type tableau en un tableau réel :

var flatten = function() {
var args = Array.from(arguments);
var flattened = args.reduce(function(acc, elem) { return acc.concat(elem) }, []);
return flattened;
};

Mise à jour en 2021 à l'aide des fonctionnalités de langage moderne :

function flatten(...args) {
return args.flat();
}

Et, vous pouvez passer une profondeur à .flat(n)(la valeur par défaut est 1) si vous souhaitez aplatir à un niveau plus profond qu'un seul niveau vers le bas.

Bien que, puisque nous avons maintenant ces fonctionnalités plus modernes intégrées dans le langage, vous pouvez probablement les utiliser plus directement plutôt que de les transmettre à une fonction pour y travailler, mais nous devrions voir des cas d'utilisation particuliers pour faire des suggestions pour inline façons de résoudre votre problème plutôt que d'utiliser cette fonction.

Pour votre information, il existe de nombreuses façons d'aplatir un tableau :

Fusionner/aplatir un tableau de tableaux

Comment aplatir un tableau imbriqué en javascript?

Aplatir les tableaux multidimensionnels en JavaScript

Méthode Array.prototype.flat()

Certificats publics vs privés dans Azure

Je parcourais les documents Azure pour App Service et j'ai trouvé les termes certificat public et certificat privé. J'ai du mal à comprendre ce que signifient ces termes.

J'ai lu quelque part que les certificats publics sont destinés à être utilisés sur Internet et que les certificats privés sont destinés à sécuriser la communication du réseau interne.

Mais

L'extrait ci-dessous de la documentation Azure ajoute encore à la confusion :

Les certificats publics ne sont pas utilisés pour sécuriser les domaines personnalisés, mais vous pouvez les charger dans votre code si vous en avez besoin pour accéder à des ressources distantes.

Donc ma question est:

  • Que signifie certificat privé et public dans azur?

  • Que signifient certificat privé et public au sens normal?

  • Pourquoi ne puis-je pas utiliser de certificats publics pour sécuriser des domaines personnalisés dans Azure App Service?


  • Solution du problème

    Les certificats privés sont utilisés pour chiffrer, souvent la connexion. Donc, si vous avez besoin de https sur www.votredomaine.com, vous utilisez un certificat privé.

    Public est utilisé si vous devez vous connecter à un service qui utilise un certificat qui n'est pas inclus dans les certificats de confiance MS. Vous devrez peut-être appeler un domaine interne qui utilise des certificats auto-signés ou, pour une raison quelconque, n'utilisez pas de certificats couramment approuvés.

    L'intégration de Facebook avec ios échoue avec un message d'erreur sur le simulateur

    Après l'intégration avec Facebook lorsque j'appuie sur Continuer avec le bouton FaceBook sur le simulateur, cette fenêtre s'affiche sur le simulateur. app, et je ne reçois aucune donnée utilisateur avec.cette

    Voici les étapes que j'ai faites

  • Installation du pod : pod 'FBSDKLoginKit'

  • Ajout de l'ID de bundle dans le guide de démarrage rapide de developer.facebook

  • L'option Activer le signe unique est sélectionnée sur NON

  • Ajout du code suivant tel qu'il se trouve dans info.plist
    info.plist

  • Ajout du code suivant dans AppDelegate

    Selon le document Facebook, nous devons importer FacebookCore dans AppDelegate lorsque nous l'importons, nous recevons un avertissement Aucun module de ce type 'FacebookCore'

    import FBSDKCoreKit
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    ApplicationDelegate.shared.application(
    application,
    didFinishLaunchingWithOptions: launchOptions
    )
    return true
    }
    func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any] = [:]
    ) -> Bool {
    ApplicationDelegate.shared.application(
    app,
    open: url,
    sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
    annotation: options[UIApplication.OpenURLOptionsKey.annotation]
    )
    }

    Ajout du code suivant dans SceneDelegate

    Selon le document Facebook, nous devons importer FacebookCore dans SceneDelegate lorsque nous l'importons, nous recevons un avertissement Aucun module de ce type 'FacebookCore'

    import FBSDKCoreKit 

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let url = URLContexts.first?.url else {
    return
    }
    ApplicationDelegate.shared.application(
    UIApplication.shared,
    open: url,
    sourceApplication: nil,
    annotation: [UIApplication.OpenURLOptionsKey.annotation]
    )
    }

    Ajout du code suivant dans ViewController

    Selon le document Facebook, nous devons importer FacebookLogin dans ViewController lorsque nous l'importons, nous recevons un avertissement Aucun module de ce type 'FacebookLogin'

    import FBSDKLoginKit

    class ViewController: UIViewController, LoginButtonDelegate
    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    if let token = AccessToken.current,
    !token.isExpired {
    let token = token.tokenString
    let request = FBSDKLoginKit.GraphRequest(graphPath: "me", parameters: ["fields": "email,name"], tokenString: token, version: nil, httpMethod:.get)
    request.start { connecton, result, error in
    print("\(result)")
    }
    } else{
    let loginButton = FBLoginButton()
    loginButton.center = view.center
    loginButton.delegate = self
    loginButton.permissions = ["public_profile", "email"]
    view.addSubview(loginButton)
    }
    }

    func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?) {
    let token = result?.token?.tokenString
    let request = FBSDKLoginKit.GraphRequest(graphPath: "me", parameters: ["fields": "email,name"], tokenString: token, version: nil, httpMethod:.get)
    request.start { connecton, result, error in
    print("\(result)")
    }
    }

    J'ai essayé l'étape 2 à partir de cela, mais j'obtiens cette erreur lors de la configuration de l'environnement de développement.


    Solution du problème

    Je pense que vous vous êtes trompé d'étape de connexion à Facebook.

    étape 1 :- installez les pods ci-dessous

    pod 'FacebookCore'
    pod 'FacebookLogin'
    pod 'FacebookShare'

    étape 2:- ajoutez les informations d'identification facebook nécessaires (facebook App Id) et CFBundleURLTypesdans info.plistle fichier

    entrez la description de l'image ici

    entrez la description de l'image ici

    étape 3:- importez FacebookCoreet FacebookLogindans votre UIViewControlleroù vous voulez la fonction de connexion Facebook.

    appelez cette méthode pour vous connecter avec facebook.

    func setupFacebookLogin(){
    let loginManager = LoginManager()
    loginManager.logOut()
    loginManager.logIn(permissions: ["public_profile", "email"], from: self, handler: { result, error in
    if error!= nil {
    print("ERROR: Trying to get login results")
    } else if result?.isCancelled!= nil {
    print("The token is \(result?.token?.tokenString?? "")")
    if result?.token?.tokenString!= nil {
    print("Logged in")
    let graphRequest: GraphRequest = GraphRequest(graphPath: "me", parameters: ["fields": "id, first_name, middle_name, last_name, name, picture, email, gender, birthday"])
    graphRequest.start { _, result, error in
    if error!= nil {
    let data: [String: AnyObject] = result as! [String: AnyObject]
    print("Facebook user data - ",data)
    }
    } else {
    print("Cancelled")
    }
    }
    })
    }

    La documentation indique d'utiliser un paramètre de confiance, mais elle génère une erreur

    Modifier pour inclure l'extrait de code.

    Je développe une application avec pyautogui. Je veux faire correspondre une région sur le bureau et cliquer dessus. En appelant la fonction locateOnscreen, je passe le nom du fichier contenant l'image à faire correspondre, ainsi qu'un paramètre de confiance, qui génère une erreur.

    import pyautogui as pag
    button_login = pag.locateOnScreen("button_login.png", confidence=0.7)
    File ".\test.py", line 23, in <module>
    button_login = pag.locateOnScreen("button_login.png", confidence=0.7)
    ...
    TypeError: _locateAll_python() got an unexpected keyword argument 'confidence'

    La version installée est 0.9.47. Les docs font référence à la version 1.0.0. Je ne trouve cette version nulle part, y compris pypi et github.


    Solution du problème

    Cela se produit parce que la fonction locateOnScreenpeut atteindre deux fonctions différentes ( code source ) :


    • _locateAll_opencvsi cv2 / OpenCV est installé


    • _locateAll_pythonsi cv2 / OpenCV est introuvable ou si vous utilisez python3 avec une version de cv2 inférieure à 3



    Et _locateAll_pythonne gère pas le confidenceparamètre.

    Vous pouvez donc essayer d'installer/mettre à jour OpenCV si vous avez besoin de cette fonctionnalité: https://pypi.org/project/opencv-python/

    pip install opencv-python

    Ou si vous avez python 2 & 3 sur votre système :

    pip3 install opencv-python

    Utiliser la date comme variable dans la condition where C# [fermé]

    Fermé. Cette question a besoin de détails ou de clarté. Il n'accepte pas de réponses actuellement.


    Solution du problème

    C# peut faire votre rendez-vous :

    using var cmd = new SqlCommand("select price from employee WHERE date_dep = @d", cnx);
    cmd.Parameters.Add(new SqlParameter("@d", SqlDbType.DateTime2) { Scale = 3, Value = new DateTime(year_somme,1,1) };
    Reader = cmd.ExecuteReader();
    table_raw.Load(Reader);

    Ajustez le type, l'échelle, etc. pour correspondre à votre base de données. Faites votre SqlConnection en un usingtrop

    Redirection d'intégration Webflow | (Utilisation de la pile de membres)

    J'ai une application de tableau de bord dans Webflow et j'utilise Memberstack pour les utilisateurs et les autorisations.

    Maintenant, le problème que j'ai est le suivant : je crée un nouvel utilisateur Memberstack avec Zapier, puis je me connecte à Webflow avec le nouvel utilisateur créé et cela ouvre la page du tableau de bord. Le problème est que je souhaite, si un utilisateur se connecte pour la première fois, le rediriger vers une autre page appelée "Onboarding".

    Mon approche consistait à le résoudre dans Memberstack, mais cela ne semble pas fonctionner lorsque je crée l'utilisateur avec Zapier. Ensuite, j'ai essayé de trouver une solution dans Webflow, pour créer une redirection si une variable dans l'élément CMS n'est pas définie (par exemple "onboarding" = false).

    Quelqu'un peut-il m'aider à faire ce travail?


    Solution du problème

    Laissez-moi savoir si cela fonctionne! J'ai adapté du code que j'avais qui ajoutera également la première fois que le membre se connecte à ses métadonnées Memberstack.

    Essayez d'ajouter ce code avant la balise </ body > à l'échelle du site :

    <script>
    MemberStack.onReady.then(async function(member) {
    // if member is logged in
    if(member.loggedIn){
    var first_logged_in_timestamp = member["first-logged-in-timestamp"];
    if(first_logged_in_timestamp === undefined || first_logged_in_timestamp == null || first_logged_in_timestamp.length < 1)
    { // set first-logged-in-timestamp
    var first_logged_in_timestamp = timestamp;
    member.updateProfile({
    "first-logged-in-timestamp": timestamp,
    }, false)
    }
    window.location.href='https://RedirectHereIfFirstLogIn.com';
    }
    else{
    window.location.href='https://RedirectHereIfNotLoggedIn.com';
    }
    }
    </script>

    les données ne parviennent pas de la manière appropriée que je veux dans la jointure interne multiple postgresql

    im essayant de faire une jointure interne sur deux tables. 1. utilisateurs, 2. manèges. dans la table des utilisateurs, il existe deux types d'utilisateurs (0 pour l'utilisateur, 1 pour le conducteur). et dans la table de trajet, je stocke user_id et provide_id qui proviennent de la table des utilisateurs. alors maintenant, le problème est que je ne peux pas obtenir d'informations sur les deux utilisateurs simultanément.

    SELECT name,mobile, email, name as driverName
    FROM users
    INNER JOIN rides
    ON users._id = rides.user_id
    INNER JOIN rides as ride
    ON users._id = ride.provider_id;

    cela me renvoie une table nulle.










    NomNuméroe-mailnom du conducteur

    Solution du problème

    Je serais peut-être enclin à exprimer votre requête en utilisant la logique existante :

    SELECT u.name, u.mobile, u.email
    FROM users u
    WHERE EXISTS (SELECT 1 FROM rides r WHERE u._id = r.user_id) AND
    EXISTS (SELECT 1 FROM rides r WHERE u._id = r.provider_id);

    Cela renverra tous les utilisateurs pour lesquels il existe à la fois un trajet d'utilisateur et de fournisseur.

    mardi 3 mai 2022

    Mettre en pause une boucle for, enregistrer la progression et la reprendre une autre fois ?

    En python (3), je code un script qui utilise une boucle for récursive (la boucle for appelle sa propre fonction plusieurs fois) et je sais que le script ne se terminera qu'après environ 45 heures, donc je cherche un moyen de enregistrez la progression dans un fichier, fermez python, désactivez-le puis reprenez-le un autre jour.

    Existe-t-il un moyen de sauvegarder la progression puis de la reprendre dans une autre (nouvelle) session ?

    Exemple de boucle récursive:

    i=1
    def for_loop(i):
    if i==10:
    print(i)
    #code
    else:
    for x in range(0, 10):
    #code
    for_loop(i+1)

    Code entier :

    def TheLoop(num_N, num_a, num_A, num_S, i):
    global Key
    global num_Keys
    global num_Declined
    global KeyTogether
    global f
    if i > 8:
    if (num_N > 0) and (num_a > 0) and (num_A > 0) and (num_S > 0):
    num_Keys = num_Keys + 1
    KeyTogether = ''
    for t in range(8):
    try:
    number = int(Key[t])
    Key[t] = str(Key[t])
    except ValueError:
    pass
    KeyTogether += Key[t]
    #Output Key to a file
    f.write(KeyTogether + "\n")
    else:
    # Invalid Key
    num_Declined = num_Declined + 1
    else:
    if (num_N < 4) and ((i < 8) or ((num_a > 0) and (num_A > 0) and (num_S > 0))):
    num_N = num_N + 1
    for x in range(0, 10):
    Key[i-1] = x
    TheLoop(num_N, num_a, num_A, num_S, i+1)
    if (num_a < 4) and ((i < 8) or ((num_N > 0) and (num_A > 0) and (num_S > 0))):
    num_a = num_a +1
    for c in "abcdefghijklmnopqrstuvwxyz":
    Key[i-1] = c
    TheLoop(num_N, num_a, num_A, num_S, i+1)
    if (num_A < 4) and ((i < 8) or ((num_N > 0) and (num_a > 0) and (num_S > 0))):
    num_A = num_A + 1
    for c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
    Key[i-1] = c
    TheLoop(num_N, num_a, num_A, num_S, i+1)
    if (num_S < 4) and ((i < 8) or ((num_N > 0) and (num_a > 0) and (num_A > 0))):
    num_S = num_S + 1
    for c in '"'"!#$%&'()*+,-./:;<=>?@[\]^_`{|}~":
    Key[i-1] = c
    TheLoop(num_N, num_a, num_A, num_S, i+1)
    Start = time.time()
    TheLoop(0,0,0,0,1)
    duration = time.time() - Start
    print("Duration: " + str(duration))
    print("Declined Keys: ", num_Declined)
    print("Valid Keys: ", num_Keys)
    duracionstr = str(duration)
    f.write("Duration: " + durationstr)


    Solution du problème

    J'ai eu le même problème avec certaines boucles de longue durée dans un projet. J'ai créé une fonction qui exécute la boucle avec quelques mérites supplémentaires.


    • La progression est enregistrée toutes les N itérations (pickle)

    • Continuez là où vous vous étiez arrêté

    • Si l'entrée se compose de plus d'un itérable, je boucle sur leur permutation.

    • Barre de progression pour de beaux visuels.


    Faites-moi savoir en cas de problème et je serai heureux de vous aider.

    La fonction est disponible sur pip:

    pip install daves_utilities

    Usage:

    from daves_utilities.for_long import for_long
    letters = ["a","b","c","d"]
    numbers = [10,20,40,100,500,1000]
    attribute_dict = {"letters": letters, "numbers": numbers, "input_bool":True}
    df_out = for_long(iter_fun = my_function, iter_attr = attribute_dict,\
    save_every_n = 10, path = "./")

    Problèmes avec la désinstallation de create-react-app

    Je cours npm uninstall create-react-appet ça revient

    npm WARN saveError ENOENT: no such file or directory, open '/Users/me/Documents/package.json'
    npm WARN enoent ENOENT: no such file or directory, open '/Users/me/Documents/package.json'
    npm WARN Documents No description
    npm WARN Documents No repository field.
    npm WARN Documents No README data
    npm WARN Documents No license field.

    Je souhaite mettre à jour ma version create-react-app, et apparemment, ils ne prennent plus en charge les installations globales. Lorsque j'ai installé CRA pour la première fois (il y a quelque temps), il a été installé globalement. Maintenant, j'essaie de le mettre à jour et je rencontre des problèmes. J'ai couru npm update create-react-app, mais mon terminal clignote juste pendant une seconde et revient à l'invite. J'ai donc décidé de le désinstaller create-react-appcomplètement et de le réinstaller, mais maintenant je rencontre les avertissements/problèmes ci-dessus.

    Des idées sur ce qui peut se passer?

    Modifier:

    Quand je lance npm i create-react-app, il lance également les WARNs ci-dessus, mais il dit aussi

    + create-react-app@3.3.0 // <---
    added 1 package and audited 578 packages in 1.787s

    Cependant, lorsque je relance la commande create-react-app --version, il dit3.2.0

    Édition 2 :

    J'ai couru npm i -g create-react-appplusieurs fois, mais cela jette:

    Michaels-MacBook-Pro:Documents me$ npm i -g create-react-app
    npm ERR! code EEXIST
    npm ERR! syscall symlink
    npm ERR! path../lib/node_modules/create-react-app/index.js
    npm ERR! dest /usr/local/bin/create-react-app
    npm ERR! errno -17
    npm ERR! EEXIST: file already exists, symlink '../lib/node_modules/create-react-app/index.js' -> '/usr/local/bin/create-react-app'
    npm ERR! File exists: /usr/local/bin/create-react-app
    npm ERR! Remove the existing file and try again, or run npm
    npm ERR! with --force to overwrite files recklessly.
    npm ERR! A complete log of this run can be found in:
    npm ERR! /Users/me/.npm/_logs/2019-12-23T08_07_29_158Z-debug.log


    Solution du problème

    Après la désinstallation globale create-react-app, j'obtenais toujours une erreur indiquant que mon create-react-appétait obsolète. Voici ce qui a résolu cela pour moi:

    Après

    sudo npm uninstall -g create-react-app

    Cours

    npx clear-npx-cache

    Essayez ensuite de réinstaller create-react-appdans le répertoire de travail approprié :

    npx create-react-app my-app

    Ajout de ifcondition dans componentdidupdate dans react mais aussi boucle infinie

    J'ai une balise de lien que je l'envoie au même composant mais avec un paramètre différent. Pour cela, j'utilise componentdidupdate.Si j'aurais utilisé une balise d'ancrage, ce n'était pas nécessaire. J'ai ajouté une condition if dans componentdidupdate, puis une demande d'url et défini l'état mais obtenant une boucle infinie. Requête infinie allant au serveur Code du lien

    Link to={`/tutorials/${id}/${courseid}`}>{title}</Link>

    Dans componentdidupdate

    async componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.params.id!== prevState.id ) {
    const { id } = this.props.params;
    const { courseid } = this.props.params;
    let url = `https://localhost:7058/Dashboard/api/Tutorial?ID=${courseid}`;
    this.setState({
    loading: true,
    });
    let data = await fetch(url);
    let parsedData = await data.json();
    this.setState({
    lectures: parsedData,
    courseid: courseid,
    id: id,
    loading: false,
    });
    //now api request for description
    let durl = `https://localhost:7058/Dashboard/api/Tutorial/GetTutorial?ID=${courseid}&TutorialID=${id}`;
    this.setState({
    loading: true,
    });
    let ddata = await fetch(durl);
    let dparsedData = await ddata.json();
    // console.log(dparsedData);
    this.setState({
    desc: dparsedData,
    loading: false,
    });
    }

    }

    export default (props) => <Tutorial {...props} params={useParams()} />;

    J'utilise React 18 et React Router Dom 6. Fournissez une solution pour cette version, veuillez ne pas suggérer de dégrader la version ou de la changer en composant basé sur la fonction


    Solution du problème

    Je pense que la condition est mal formée, vous voulez probablement comparer avec prevProps.params.id, ou peut-être this.state.idpuisqu'elle aurait été mise à jour lors d'un cycle de rendu précédent.

    Exemple:

    async componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.params.id!== prevProps.params.id ) {
    ...
    }
    }

    ou alors

    async componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.params.id!== this.state.id ) {
    ...
    }
    }

    Écrasement dans CPP

    J'écris un morceau de code, en utilisant C++, j'aimerais éviter d'écraser et d'écrire divers fichiers tous les 1000 pas de temps. C'est dans une boucle temporelle:

    fstream out("ux.odt");
    for (auto &row: ux) {
    for (auto col: row)
    out << col << ',';
    // cout << col <<',';
    out << '\n';

    Il me donne les résultats uniquement pour le dernier pas de temps. Comment puis-je obtenir des fichiers pour, disons, le pas de temps 1000, 2000, 3000 ?


    Solution du problème

    Essayons quelque chose comme ceci :

    std::ofstream out;
    static bool first_pass = true;
    if (first_pass)
    {
    out.open("ux.odt");
    first_pass = false;
    }
    if ((timestamp % 1000) == 0)
    {
    out.close();
    std::ostringstream filename;
    filename << "ux_" << timestamp << ".odt";
    out.open(filename.str());
    }
    //... code to write to the file.

    La première ligne crée une variable de flux pour l'écriture.

    La deuxième ligne déclare une variable booléenne qui est initialisée au démarrage du programme à "true" pour indiquer une première passe ou non.

    La première instruction "if", initialisera le nom du fichier de sortie à "ux.odt", lors du premier passage dans le code.

    La deuxième ifinstruction fermera le fichier existant et créera un nouveau fichier, tous les 1000 horodatages.

    Phaser 3 hitarea interactif d'un conteneur

    J'ai un conteneur contenant une image et du texte ; Nous rencontrons un problème avec la zone d'accès interactive du conteneur

    this.image = this.add.image(0, 0, 'GreenButtonBox').setOrigin(0.5).setScale(2);
    this.text = this.add.text(0, 0, "Click", { font: "bold 35px Arial", fill: '#ffffff' }).setOrigin(0.5).setScale(1);
    this.container = this.add.container(400, 400, [this.image, this.text])
    .setSize(this.image.width, this.image.height)
    .setInteractive()
    .on('pointerup', this.SubmitAnswer);

    Dans le cas ci-dessus la partie interactive du bouton est située au milieu (peut-être à cause de l'échelle de l'image?

    J'ai aussi essayé d'ajouter new Phaser.Geom.Rectangleà la fonction interactive en tant que telle

    .setInteractive(new Phaser.Geom.Rectangle(0, 0, this.image.width, this.image.height), Phaser.Geom.Rectangle.Contains)

    mais la zone cliquable devient le coin inférieur droit du bouton; alors qu'avec

    .setInteractive(new Phaser.Geom.Rectangle((this.image.width / 2) * -1, (this.image.height / 2) * -1, this.image.width, this.image.height), Phaser.Geom.Rectangle.Contains)

    la zone cliquable devient la partie supérieure gauche du bouton;

    Dois-je rendre compte de l'échelle moi-même ? comme

    .setInteractive(new Phaser.Geom.Rectangle((this.image.width / 2) * -1, (this.image.height / 2) * -1, this.image.width * 2, this.image.height * 2), Phaser.Geom.Rectangle.Contains)

    Cela fonctionne réellement

    Je ne comprends pas pourquoi j'ai besoin de redimensionner l'image lorsque je prends la largeur et la hauteur de l'image pour la largeur et la hauteur du conteneur.

    Est-ce que je manque quelque chose?


    Solution du problème

    Vous avez raison heightet widthcela ne fonctionnera pas (ils conservent la taille d'origine), mais vous pouvez simplement utiliser les propriétés displayWidthet displayHeight, ces propriétés vous donnent la bonne taille (surtout après la mise à l'échelle), le calcul est géré par phaser.

    Voici une petite démo illustrant ceci:


    let Scene = {
    preload(){
    this.load.image('ship', 'https://labs.phaser.io/assets/sprites/ship.png');
    },
    create(){

    this.image = this.add.image(0, 0, 'ship').setOrigin(0.5)
    console.info(`before Scale width: ${this.image.width}, height: ${this.image.height}, displayWidth: ${this.image.displayWidth}, displayHeight:${this.image.displayHeight}` );
    this.image.setScale(2);
    console.info(`after Scale width: ${this.image.width}, height: ${this.image.height}, displayWidth: ${this.image.displayWidth}, displayHeight:${this.image.displayHeight}` );
    }
    }

    const config = {
    type: Phaser.AUTO,
    width:400,
    height:200,
    scene: Scene,
    banner: false
    }
    const game = new Phaser.Game(config)

    <script src="https://cdn.jsdelivr.net/npm/phaser@3.55.2/dist/phaser.js"></script>

    Comment vérifier le jeton d'accès AWS Cognito sur NodeJS

    J'ai trouvé un exemple sur la façon de vérifier les jetons d'accès Cognito avec Python. Comment puis-je faire la même chose avec NodeJS ? N'y a-t-il pas de fonction SDK pour faire cela?

    Jusqu'ici j'ai

    authorizeCognitoJwt(token) {
    const COGNITO_POOL_ID = 'ap-southeast-1_xxx'
    const COGNITO_JWT_SET = {
    'keys': [
    {
    'alg': 'RS256',
    'e': 'AQAB',
    'kid': 'ChkV+...=',
    'kty': 'RSA',
    'n': 'tkjexS...johc5Q',
    'use': 'sig'
    },
    {
    'alg': 'RS256',
    'e': 'AQAB',
    'kid': 'Ve...Eb8dw6Y=',
    'kty': 'RSA',
    'n': 'hW19H...0c9Q',
    'use': 'sig'
    }
    ]
    }
    const decodedJwt = jwt.decode(token, {complete: true})
    console.log(decodedJwt)
    if (decodedJwt.payload.iss!== `https://cognito-idp.us-east-1.amazonaws.com/${COGNITO_POOL_ID}`) {
    return 'INVALID_ISSUER'
    }
    if (decodedJwt.payload.token_use!== 'access') {
    return 'INVALID_TOKEN_USE'
    }
    var jwtKey = COGNITO_JWT_SET.keys.find(k => k.kid === decodedJwt.header.kid)
    if (!jwtKey) {
    return 'INVALID_TOKEN_KID'
    }
    var verifiedKey = jwt.verify(token, /* how do I get the key? */)
    return 'VALID'
    }

    Mais je suis bloqué sur la façon d'obtenir les clés deCOGNITO_JWT_SET


    Solution du problème

    Vous pouvez obtenir le COGNITO_JWT_SETen utilisant cette URL.

    Reportez-vous au billet de blog Integrating Amazon Cognito User Pools with API Gateway in AWS Mobile Blog pour un exemple complet avec code.

    Vaut-il la peine de hacher les mots de passe côté client

    Lorsque je veux mettre en place un système de connexion, je compare toujours le MD5 du mot de passe donné avec sa valeur dans la table des utilisateurs côté serveur.

    Cependant, un de mes amis m'a dit qu'un mot de passe "clair" pouvait être reniflé par un logiciel réseau.

    Ma question est donc la suivante : est-ce une bonne idée de hacher le mot de passe côté client ? Est-ce mieux que de le hacher côté serveur ?


    Solution du problème

    En fait, je ne suis pas d'accord pour dire que le hachage côté client est plus sécurisé dans ce cas. Je pense que c'est moins sûr.

    Tout l'intérêt de stocker un hachage du mot de passe dans votre base de données par opposition au vrai mot de passe (ou même un mot de passe crypté) est qu'il est mathématiquement impossible d'obtenir le mot de passe d'origine à partir d'un hachage (bien qu'il soit théoriquement possible d'obtenir un mot de passe en collision entrée de hachage, dont la difficulté dépend de la force de sécurité de l'algorithme de hachage). Le vecteur d'attaque possible ici est que si un attaquant potentiel compromettait d'une manière ou d'une autre votre base de données de stockage de mots de passe, il ne serait toujours pas en mesure d'obtenir les mots de passe originaux de vos utilisateurs.

    Si votre mécanisme d'authentification envoie un hachage du mot de passe, alors dans ce scénario de faille de sécurité, l'attaquant n'a pas besoin de connaître le vrai mot de passe - il envoie simplement le hachage qu'il a et hop, il a accès au compte d'un utilisateur particulier, et par extension, tout votre système. Cela va complètement à l'encontre de l'intérêt de stocker un mot de passe haché en premier lieu !

    Le moyen vraiment sécurisé de le faire est d'envoyer au client une clé publique à usage unique pour qu'il chiffre le mot de passe, puis de le déchiffrer et de le re-hacher côté serveur.

    Soit dit en passant, ce genre de question obtiendra probablement plus de réponses d'experts sur Security StackExchange.

    Impossible d'initialiser l'objet source de données du fournisseur OLE DB "OraOLEDB.Oracle" pour le serveur lié

    J'essaie d'interroger les données du serveur lié. Il me donne l'erreur suivante:

    TNS : l'auditeur ne connaît pas actuellement le service demandé dans le descripteur de connexion". Msg 7303, niveau 16, état 1, ligne 4 Impossible d'initialiser l'objet source de données du fournisseur OLE DB "OraOLEDB.Oracle" pour le serveur lié


    Solution du problème

    Il y a de fortes chances que le nom de votre service ne corresponde pas à un nom dans votre fichier tnsnames.ora. Il est soit non enregistré, soit enregistré sous un autre nom.

    Le billet de blog suivant contient une très bonne série d'étapes pour vous guider à travers ce qu'il faut vérifier, et pour d'autres causes courantes:

    https://logic.edchen.org/how-to-resolve-ora-12514-tns-listener-does-not-currently-know-of-service-requested-in-connect-descriptor/

    Impossible d'installer le package Sys Go, j'ai essayé la méthode normale mais cela n'a aucun sens. Veuillez trouver ci-dessous mon Go env ci-dessous

    Je n'arrive pas à installer le package GoLang Sys.
    entrez la description de l'image ici

    De plus, ci-dessous est mon Go env:

    GO111MODULE="auto"
    GOARCH="amd64"
    GOBIN=""
    GOCACHE="/home/zahidk/.cache/go-build"
    GOENV="/home/zahidk/.config/go/env"
    GOEXE=""
    GOEXPERIMENT=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="linux"
    GOINSECURE=""
    GOMODCACHE="/home/zahidk/gocode/pkg/mod"
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="linux"
    GOPATH="/home/zahidk/gocode"
    GOPRIVATE=""
    GOPROXY="https://proxy.golang.org,direct"
    GOROOT="/usr/local/go"
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
    GOVCS=""
    GOVERSION="go1.17.6"
    GCCGO="gccgo"
    AR="ar"
    CC="gcc"
    CXX="g++"
    CGO_ENABLED="1"
    GOMOD=""
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2915773640=/tmp/go-build -gno-record-gcc-switches"

    J'ai essayé d'utiliser go get -u golang.org/x/sys et GOPATH/src/golang.org/x/sys du site Web ( https://pkg.go.dev/golang.org/x/sys#section- readme ) pour installer le package sys mais pour une raison quelconque, cela ne fonctionne pas. De plus, dans mon répertoire src se trouvent tous mes fichiers GoLang. C'est ça.


    Solution du problème

    Votre go envindique que vous utilisez le mode GOPATH (au lieu des modules) :

    GO111MODULE="auto"
    GOPATH="/home/zahidk/gocode"
    GOMOD=""

    Le message d'erreur indique que l'éditeur GOPATHest /home/zahidk/GoLangdifférent de votre go env( /home/zahidk/gocode). Cela explique probablement pourquoi le code téléchargé n'est pas trouvé lors du développement via l'éditeur.

    Vous devez vous assurer que la GOPATHvariable d'environnement est correctement définie partout, ou migrer vers les modules.

    L'utilisation de modules est recommandée si vous n'avez pas de besoin spécifique pour GOPATH. Les modules facilitent la gestion des dépendances et sont probablement mieux pris en charge par votre éditeur.


    • Utilisation des modules Go

    • Premiers pas avec Go -- tutoriel interactif démontrant les modules d'un nouveau projet.

    Impossible d'accéder à postgres via le service à partir du conteneur postgres lui-même

    J'essaie de vérifier que mon pod postgres est accessible via le service que je viens de configurer. Pour l'instant, je ne peux pas le vérifier. Ce que je peux faire, c'est me connecter au conteneur exécutant postgres lui-même et tenter de parler au serveur postgres via l'adresse IP du service. Cela ne réussit pas. Cependant, je ne sais pas s'il s'agit d'un test valide pour savoir si d'autres pods du cluster peuvent parler à postgres via le service ou s'il y a un problème avec la façon dont je fais le test, ou s'il y a un problème fondamental dans mon configurations de service ou de pod.

    Je fais tout cela sur un cluster minikube.

    Configurez le pod et le service :

    $> kubectl create -f postgres-pod.yml
    $> kubectl create -f postgres-service.yml

    postgres-pod.yml

    apiVersion: v1
    kind: Pod
    metadata:
    name: postgres
    labels:
    env: prod
    creation_method: manual
    domain: infrastructure
    spec:
    containers:
    - image: postgres:13-alpine
    name: kubia-postgres
    ports:
    - containerPort: 5432
    protocol: TCP
    env:
    - name: POSTGRES_PASSWORD
    value: dave
    - name: POSTGRES_USER
    value: dave
    - name: POSTGRES_DB
    value: tmp
    # TODO:
    # volumes:
    # - name: postgres-db-volume

    postgres-service.yml

    apiVersion: v1
    kind: Service
    metadata:
    name: postgres-service
    spec:
    ports:
    - port: 5432
    targetPort: 5432
    selector:
    name: postgres

    Vérifiez que le service est opérationnel kubectl get services:

    kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35d
    postgres-service ClusterIP 10.110.159.21 <none> 5432/TCP 71m

    Ensuite, connectez-vous au conteneur postgres :

    $> kubectl exec --stdin --tty postgres -- /bin/bash

    from there, attempt to hit the service's IP:

    bash-5.1# psql -U dave -h 10.110.159.21 -p 5432 tmp
    psql: error: could not connect to server: Connection refused
    Is the server running on host "10.110.159.21" and accepting
    TCP/IP connections on port 5432?

    Donc, en utilisant cette approche, je ne peux pas me connecter au serveur postgres en utilisant l'adresse IP du service.

    Je ne suis pas sûr de plusieurs étapes de ce processus :

  • Le bloc de sélection par nom dans la configuration du service yaml est-il correct ?

  • Pouvez-vous accéder à l'adresse IP d'un service à partir de pods situés "derrière" le service ?

  • Est-ce, en fait, un moyen valide de vérifier que le serveur de base de données est accessible via le service, ou existe-t-il un autre moyen ?


  • Solution du problème

    Bonjour, j'espère que vous envoyez votre voyage Kubernetes !

    Je voulais essayer ceci sur mon cluster type (Kubernetes dans docker) localement. Alors voilà ce que j'ai fait:

    J'ai d'abord configuré un cluster kind localement avec cette configuration (info ici: https://kind.sigs.k8s.io/docs/user/quick-start/ ):

    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    name: so-cluster-1
    nodes:
    - role: control-plane
    image: kindest/node:v1.23.5
    - role: control-plane
    image: kindest/node:v1.23.5
    - role: control-plane
    image: kindest/node:v1.23.5
    - role: worker
    image: kindest/node:v1.23.5
    - role: worker
    image: kindest/node:v1.23.5
    - role: worker
    image: kindest/node:v1.23.5

    after this I created my cluster with this command:

    kind create cluster --config=config.yaml

    Ensuite, j'ai créé un espace de noms de test (manifeste obtenu avec : kubectl create ns so-tests -o yaml --dry-run) :

    apiVersion: v1
    kind: Namespace
    metadata:
    name: so-tests

    À partir de là, j'ai configuré mon environnement, j'ai donc dû déployer un postgres dessus, mais voici ce que j'ai changé :

    1- Au lieu de créer un pod singleton, j'ai créé un statefulset (dont le but est de déployer des bases de données)

    2- J'ai décidé de continuer à utiliser votre image docker "postgres:13-alpine" et j'ai ajouté un contexte de sécurité à exécuter en tant qu'utilisateur postgres natif (pas dave ni root) - pour savoir quel est l'identifiant de l'utilisateur postgres, j'ai d'abord déployé le statefulset sans le contexte de sécurité et exécuté ces commandes :

    ❯ k exec -it postgres-0 -- bash
    bash-5.1# whoami
    root
    bash-5.1# id
    uid=0(root) gid=0(root) groups=1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
    bash-5.1# id postgres
    uid=70(postgres) gid=70(postgres) groups=70(postgres),70(postgres)
    bash-5.1# exit

    donc, une fois que j'ai su que l'id de l'utilisateur postgres était 70, j'ai juste ajouté ceci dans le manifeste statefulset:

    securityContext:
    runAsUser: 70
    fsGroup: 70

    3- Au lieu d'ajouter la configuration et les secrets comme variable d'environnement directement dans la configuration du pod du statefulset, je décide de créer un secret et un configmap :

    Commençons par créer un secret kubernetes avec votre mot de passe, voici le manifeste (obtenu à partir de cette commande : "k create secret generic --from-literal password=dave postgres-secret -o yaml --dry-run=client"):

    apiVersion: v1
    data:
    password: ZGF2ZQ==
    kind: Secret
    metadata:
    name: postgres-secret

    Après cela, j'ai créé un configmap pour stocker notre configuration postgres, voici le manifeste (obtenu en exécutant: kubectl create configmap postgres-config --from-literal user=dave --from-literal db=tmp --dry-run=client -o yaml )

    apiVersion: v1
    data:
    db: tmp
    user: dave
    kind: ConfigMap
    metadata:
    name: postgres-config

    Comme c'est juste à des fins de test, je n'ai pas configuré de provisionnement de volume dynamique pour l'ensemble d'états, ni de volume pré-provisionné. Au lieu de cela, j'ai configuré un simple emptyDir pour stocker les données postgres (/var/lib/postgresql/data).

    NB: Par défaut, les volumes emptyDir sont stockés sur n'importe quel support qui sauvegarde le nœud - qui peut être un disque ou un SSD ou un stockage réseau, selon votre environnement. Cependant, vous pouvez définir le champ emptyDir.medium sur "Mémoire" pour dire à Kubernetes de monter un tmpfs (système de fichiers basé sur RAM) pour vous à la place. (cela vient d'ici Créer un nouveau volume lors du redémarrage du pod dans un statefulset )

    Comme il s'agit d'un statefulset, il doit être exposé par un service kubernetes headless ( https://kubernetes.io/fr/docs/concepts/services-networking/service/#headless-services )

    Voici les manifestes :

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: postgres
    spec:
    serviceName: "postgres"
    replicas: 2
    selector:
    matchLabels:
    env: prod
    domain: infrastructure
    template:
    metadata:
    labels:
    env: prod
    domain: infrastructure
    spec:
    terminationGracePeriodSeconds: 20
    securityContext:
    runAsUser: 70
    fsGroup: 70
    containers:
    - name: kubia-postgres
    image: postgres:13-alpine
    env:
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    name: postgres-secret
    key: password
    - name: POSTGRES_USER
    valueFrom:
    configMapKeyRef:
    name: postgres-config
    key: user
    - name: POSTGRES_DB
    valueFrom:
    configMapKeyRef:
    name: postgres-config
    key: db
    ports:
    - containerPort: 5432
    protocol: TCP
    volumeMounts:
    - name: postgres-test-volume
    mountPath: /var/lib/postgresql
    resources:
    requests:
    memory: "64Mi"
    cpu: "250m"
    limits:
    memory: "128Mi"
    cpu: "500m"
    volumes:
    - name: postgres-test-volume
    emptyDir: {}
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: postgres-service
    labels:
    env: prod
    domain: infrastructure
    spec:
    ports:
    - port: 5432
    protocol: TCP
    targetPort: 5432
    name: pgsql
    clusterIP: None
    selector:
    env: prod
    domain: infrastructure
    ---
    apiVersion: v1
    data:
    password: ZGF2ZQ==
    kind: Secret
    metadata:
    name: postgres-secret
    ---
    apiVersion: v1
    data:
    db: tmp
    user: dave
    kind: ConfigMap
    metadata:
    name: postgres-config
    ---

    J'ai déployé ceci en utilisant:

    kubectl apply -f postgres.yaml

    J'ai testé pour me connecter au pod postgres-0 pour connecter ma base de données avec les informations d'identification $POSTGRES_USER et $POSTGRES_PASSWORD :

    ❯ k exec -it pod/postgres-0 -- bash
    bash-5.1$ psql --username=$POSTGRES_USER -W --host=localhost --port=5432 --dbname=tmp
    Password:
    psql (13.6)
    Type "help" for help.
    tmp=#

    J'ai listé les bases de données:

    tmp=# \l
    List of databases
    Name | Owner | Encoding | Collate | Ctype | Access privileges
    -----------+-------+----------+------------+------------+-------------------
    postgres | dave | UTF8 | en_US.utf8 | en_US.utf8 |
    template0 | dave | UTF8 | en_US.utf8 | en_US.utf8 | =c/dave +
    | | | | | dave=CTc/dave
    template1 | dave | UTF8 | en_US.utf8 | en_US.utf8 | =c/dave +
    | | | | | dave=CTc/dave
    tmp | dave | UTF8 | en_US.utf8 | en_US.utf8 |
    (4 rows)

    et je me suis connecté à la base de données "tmp":

    tmp=# \c tmp
    Password:
    You are now connected to database "tmp" as user "dave".

    réussi.

    J'ai également essayé de connecter la base de données à l'aide de l'adresse IP, comme vous avez essayé :

    bash-5.1$ ip a | grep /24
    inet 10.244.4.8/24 brd 10.244.4.255 scope global eth0
    bash-5.1$ psql --username=$POSTGRES_USER -W --host=10.244.4.8 --port=5432 --dbname=tmp
    Password:
    psql (13.6)
    Type "help" for help.
    tmp=#

    réussi.

    J'ai ensuite téléchargé dbeaver (d'ici https://dbeaver.io/download/ ) pour tester l'accès depuis l'extérieur de mon cluster :

    avec un transfert de port kubectl :

    kubectl port-forward statefulset/postgres 5432:5432
    Forwarding from 127.0.0.1:5432 -> 5432
    Forwarding from [::1]:5432 -> 5432

    J'ai créé la connexion sur dbeaver et j'ai pu accéder facilement à la base de données "tmp" de localhost: 5361 avec dave: dave informations d'identification

    kubectl port-forward statefulset/postgres 5432:5432
    Forwarding from 127.0.0.1:5432 -> 5432
    Forwarding from [::1]:5432 -> 5432
    Handling connection for 5432
    Handling connection for 5432

    parfait.

    postgresql-statefulset-port-forward-avec-dbeaver

    idem qu'avant (avec dbeaver), j'ai essayé de connecter la db en utilisant un port forward, non pas du pod, mais du service:

    ❯ kubectl port-forward service/postgres-service 5432:5432
    Forwarding from 127.0.0.1:5432 -> 5432
    Forwarding from [::1]:5432 -> 5432
    Handling connection for 5432
    Handling connection for 5432

    Ça a marché aussi!

    J'ai également créé un pod autonome, basé sur notre config pour accéder à la db qui se trouve dans un autre pod (via le nom servine comme nom d'hôte), voici le manifeste du pod:

    apiVersion: v1
    kind: Pod
    metadata:
    name: postgres
    labels:
    app: test
    spec:
    terminationGracePeriodSeconds: 20
    securityContext:
    runAsUser: 70
    fsGroup: 70
    containers:
    - name: kubia-postgres
    image: postgres:13-alpine
    env:
    - name: POSTGRES_PASSWORD
    valueFrom:
    secretKeyRef:
    name: postgres-secret
    key: password
    - name: POSTGRES_USER
    valueFrom:
    configMapKeyRef:
    name: postgres-config
    key: user
    - name: POSTGRES_DB
    valueFrom:
    configMapKeyRef:
    name: postgres-config
    key: db
    ports:
    - containerPort: 5432
    protocol: TCP
    volumeMounts:
    - name: postgres-test-volume
    mountPath: /var/lib/postgresql
    resources:
    requests:
    memory: "64Mi"
    cpu: "250m"
    limits:
    memory: "128Mi"
    cpu: "500m"
    volumes:
    - name: postgres-test-volume
    emptyDir: {}

    voici le résultat de la connexion depuis l'intérieur du podtest:

    bash-5.1$ psql --username=$POSTGRES_USER -W --host=postgres-service --port=5432 --dbname=tmp
    Password:
    psql (13.6)
    Type "help" for help.
    tmp=#


    • Voici comment vous pouvez y accéder depuis l'extérieur du pod/espace de noms (assurez-vous qu'aucune règle réseau ne bloque la connexion) :


    StatefulSetName-Ordinal.Service.Namespace.svc.cluster.local

    i.e: postgres-0.postgres-service.so-tests.svc.cluster.local


    • Pour accéder aux charges de travail statefulsets depuis l'extérieur du cluster, voici un bon début : Comment exposer un service sans tête pour un StatefulSet en externe dans Kubernetes


    J'espère que cela vous aidera. Merci pour votre question. Devinez

    Comment implémenter la pagination pour fastapi avec mongo db (Motor)

    J'ai une API REST simple qui est une librairie créée avec FastAPI et mongo db comme backend (j'ai utilisé Motorcomme bibliothèque au lieu de Pymongo). J'ai un GETpoint de terminaison pour obtenir tous les livres de la base de données qui prend également en charge les chaînes de requête (par exemple: un utilisateur peut rechercher des livres avec un seul auteur ou avec un type de genre, etc.).

    Vous trouverez ci-dessous les codes correspondants pour ce point de terminaison :
    routers.py


    @router.get("/books", response_model=List[models.AllBooksResponse])
    async def get_the_list_of_all_books(
    authors: Optional[str] = None,
    genres: Optional[str] = None,
    published_year: Optional[str] = None,
    ) -> List[Dict[str, Any]]:
    if authors is None and genres is None and published_year is None:
    all_books = [book for book in await mongo.BACKEND.get_all_books()]
    else:
    all_books = [
    book
    for book in await mongo.BACKEND.get_all_books(
    authors=authors.strip('"').split(",") if authors is not None else None,
    genres=genres.strip('"').split(",") if genres is not None else None,
    published_year=datetime.strptime(published_year, "%Y")
    if published_year is not None
    else None,
    )
    ]
    return all_books

    Le modèle correspondant:

    class AllBooksResponse(BaseModel):
    name: str
    author: str
    link: Optional[str] = None
    def __init__(self, name, author, **data):
    super().__init__(
    name=name, author=author, link=f"{base_uri()}book/{data['book_id']}"
    )

    Et la fonction backend pour obtenir les données :

    class MongoBackend:
    def __init__(self, uri: str) -> None:
    self._client = motor.motor_asyncio.AsyncIOMotorClient(uri)
    async def get_all_books(
    self,
    authors: Optional[List[str]] = None,
    genres: Optional[List[str]] = None,
    published_year: Optional[datetime] = None,
    ) -> List[Dict[str, Any]]:
    find_condition = {}
    if authors is not None:
    find_condition["author"] = {"$in": authors}
    if genres is not None:
    find_condition["genres"] = {"$in": genres}
    if published_year is not None:
    find_condition["published_year"] = published_year
    cursor = self._client[DB][BOOKS_COLLECTION].find(find_condition, {"_id": 0})
    return [doc async for doc in cursor]

    Maintenant, je veux implémenter la pagination pour ce point de terminaison. Ici j'ai quelques questions:

  • Est-il bon de faire de la pagination au niveau de la base de données ou au niveau de l'application?

  • Avons-nous des bibliothèques prêtes à l'emploi qui peuvent m'aider à le faire dans fastapi? J'ai vérifié la documentation pour https://pypi.org/project/fastapi-pagination/, mais cela semble être plus ciblé vers les bases de données SQL

  • J'ai aussi consulté ce lien: https://www.codementor.io/@arpitbhayani/fast-and-efficient-pagination-in-mongodb-9095flbqr qui parle de différentes façons de faire cela dans Mongo db mais je ne pense que le premier l'option (utiliser limitet skip) fonctionnerait pour moi, car je veux également le faire fonctionner lorsque j'utilise d'autres paramètres de filtre (par exemple pour l'auteur et le genre) et il n'y a aucun moyen de connaître les ObjectId à moins que je fasse la première requête à obtenir les données et ensuite je veux faire la pagination.

  • Mais le problème est partout où je vois utiliser limitet skipest découragé.

    Quelqu'un peut-il me faire savoir quelles sont les meilleures pratiques ici et quelque chose peut-il s'appliquer à mes besoins et à mon cas d'utilisation ?

    Merci d'avance.


    Solution du problème

    Il n'y a pas de bonne ou de mauvaise réponse à une telle question. Cela dépend beaucoup de la pile technologique que vous utilisez, ainsi que du contexte dont vous disposez, compte tenu également des orientations futures du logiciel que vous avez écrit ainsi que du logiciel que vous utilisez (mongo).

    Répondre à vos questions:

  • Cela dépend de la charge que vous devez gérer et de la pile de développement que vous utilisez. Habituellement, cela se fait au niveau de la base de données, car récupérer les 110 premiers et supprimer les 100 premiers est assez stupide et consomme des ressources (la base de données le fera pour vous).


  • Pour moi, c'est assez simple sur la façon de le faire via fastapi: il suffit d'ajouter à votre getfonction les paramètres limit: int = 10et skip: int = 0de les utiliser dans la fonction de filtrage de votre base de données. Fastapivérifiera les types de données pour vous, tandis que vous pourrez vérifier que la limite n'est pas négative ou supérieure, par exemple, à 100.


  • Il dit qu'il n'y a pas de solution miracle et que puisque skipla fonction de mongo ne fonctionne pas bien. Ainsi, il pense que la deuxième option est meilleure, juste pour les performances. Si vous avez des milliards et des milliards de documents (par exemple amazon), eh bien, il peut être judicieux d'utiliser quelque chose de différent, bien qu'au moment où votre site Web aura autant grandi, je suppose que vous aurez l'argent pour payer toute une équipe de des experts pour faire le tri et éventuellement développer votre propre base de données.


  • TL ; RD

    En conclusion, l' approche limitet skipest la plus courante. Cela se fait généralement au niveau de la base de données, afin de réduire la quantité de travail de l'application et la bande passante.

    Mongo n'est pas très efficace pour sauter et limiter les résultats. Si votre base de données contient, disons, un million de documents, je ne pense pas que vous le remarquerez même. Vous pouvez même utiliser une base de données relationnelle pour une telle charge de travail. Vous pouvez toujours comparer les options dont vous disposez et choisir la plus appropriée.

    Je ne connais pas grand-chose à mongo, mais je sais qu'en général, les index peuvent aider à limiter et à ignorer les enregistrements (docs dans ce cas), mais je ne sais pas si c'est également le cas pour mongo.

    erreur d'affichage flottant : "La fenêtre d'affichage horizontale a reçu une hauteur illimitée"

    ce code affiche l'erreur "La fenêtre d'affichage verticale a reçu une hauteur illimitée"

    La hauteur de l'ensemble de conteneurs est correcte, mais existe-t-il une solution de hauteur adaptative ?

     @override
    Widget build(BuildContext context) {
    return ListView(
    children: [
    Container(
    height: 50,
    child: Swiper(
    itemBuilder: (context, index) {
    return Text(index.toString());
    },
    itemCount: 5),
    )
    ],
    );
    }


    Solution du problème

    Essayez d'utiliser la version développée :

    @override
    Widget build(BuildContext context) {
    return ListView(
    children: [
    Expanded(
    child: Swiper(
    itemBuilder: (context, index) {
    return Text(index.toString());
    },
    itemCount: 5),
    )
    ],
    );
    }

    Fonctionnalité ASP.NET 4.8 non disponible dans IIS 8.5 (Windows Server 2012 R2)

    Windows Server 2012 R2, IIS 8.5,.NET 4.8 est installé (vérifié via le Registre, voir capture d'écran).

    Sur mon ordinateur Windows 10, je vois l'option permettant de sélectionner la fonctionnalité ASP.NET 4.8 dans la boîte de dialogue "Activer ou désactiver les fonctionnalités Windows". Cependant, dans l'assistant Ajouter un rôle de serveur sur Windows 2012 R2, seule l'option ASP.NET 4.5 est répertoriée. Voir capture d'écran pour comparaison.

    Ma question: Est-ce normal que Windows Server 2012 R2 n'affiche qu'une option ASP.NET 4.5? Même si une version supérieure du.NET Framework (par exemple 4.8) est installée?

    .NET Framework 4.8 est installé

    Comparaison des fonctionnalités côte à côte


    Solution du problème

    Comme l'installation par défaut de Windows Server est livrée avec un.NET Framework spécifique (4.5 par exemple), Microsoft a codé en dur les noms de version (comme.NET Framework 4.5) dans certains éléments de l'interface utilisateur, tels que le Gestionnaire de serveur.

    Cela devient un problème critique lorsque vous mettez à niveau vers une version plus récente de.NET Framework (telle que 4.6), car le programme d'installation ne met pas à jour ces noms codés en dur.

    Ce problème est bien connu depuis des années, votre seule option est donc de l'accepter.

    Défilement vertical d'une page latérale

    J'essaie de comprendre comment faire défiler un côté d'une page. Un exemple serait quelque chose comme https://shop.luxonis.com/. La solution que j'ai trouvée consistait à styliser la colonne de droite en tant que telle

    .right-column {
    overflow-y: scroll;
    height: 100vh;
    }

    Mais cela fait que la page a deux molettes de défilement. Des idées? Je sais que le site que j'ai donné utilise la position collante, mais je ne sais pas quoi d'autre.

    Merci!


    Solution du problème

    Vous pouvez utiliser position: stickypour le panneau de gauche

    Voici la cour de récréation


    .main {
    width: 100%;
    height: 100%;
    }
    .header {
    height: 2rem;
    background-color: orange;
    }
    .flexbox {
    display: flex;
    }
    .left-panel {
    position: sticky; /* Set the element to become sticky */
    height: 100vh;
    width: 50%;
    background-color: red;
    top: 0; /* Set the sticky positon top */
    }
    .right-panel {
    height: 1000rem;
    width: 50%;
    background-color: blue;
    }
    .footer {
    height: 5rem;
    background-color: yellow;
    }

    <div class="main">
    <div class="header">
    </div>
    <div class="flexbox">
    <div class="left-panel">
    Content
    </div>
    <div class="right-panel">
    Scrolling content
    </div>
    </div>
    <div class="footer">

    </div>
    </div>

    Comment mettre à jour les enregistrements de table, mais uniquement les champs de formulaire contenant des données ?

    Dans mon contrôleur, j'ai ma méthode de création d'enregistrement, mais je souhaite modifier les enregistrements existants, mais ne mettre à jour que les champs remplis. J'essaie de ne remplir qu'un ou deux champs du fichier de propriétés d'édition, mais quel que soit le champ que je remplis, il renvoie la même erreur :

    Tentative d'assignation de la propriété "property_title" sur null

    Méthode de mise à jour dans mon contrôleur :

    public function update(Request $request, $id)
    {
    // Find the record
    $prop = Property::find($id);
    if ($request->hasFile('prop_img')) {
    $file = $request->file('prop_img');
    $filenameWithExtension = $file->getClientOriginalName();
    $Extension = $file->getClientOriginalExtension();
    $filenameOnly = pathinfo($filenameWithExtension, PATHINFO_FILENAME);
    $filename = $filenameOnly. time(). '.'. $Extension;
    $file->move('property_images', $filename);
    $prop->property_image = $filename;
    }
    $prop->property_title = $request->input('prop_title');
    $prop->property_description = $request->input('prop_desc');
    $prop->bedrooms = $request->input('prop_beds');
    $prop->bathrooms = $request->input('prop_baths');
    $prop->square_feet = $request->input('prop_ft');
    $prop->finished_basement = $request->input('prop_basement');
    $prop->prop_tax = $request->input('prop_tax');
    $prop->heat_type = $request->input('prop_heat');
    $prop->water_heater = $request->input('prop_waterheater');
    $prop->year_built = $request->input('prop_year');
    $prop->save();
    return view('admin.properties');
    }

    Itinéraires :

    Route::group(['prefix' => 'admin'], function() {
    Route::get('/', function() {
    return view('admin.dashboard');
    })->name('admin')->middleware('auth');
    Route::get('/properties', [PropertiesController::class, 'index'])->name('all-properties')->middleware('auth');
    Route::get('/properties/create', [PropertiesController::class, 'create'])->middleware('auth');
    Route::post('/properties/store-property', [PropertiesController::class, 'store'])->name('admin.store_properties')->middleware('auth');
    Route::get('/properties/delete/{id}', [PropertiesController::class, 'destroy'])->middleware('auth');

    // Edit property
    Route::get('/properties/edit/{id}', [PropertiesController::class, 'edit'])->name('admin.edit')->middleware('auth');
    Route::post('/properties/update/{id}', [PropertiesController::class, 'update'])->middleware('auth');
    });

    Modifier le fichier de lame de propriétés :

    @extends( 'layouts.admin' )
    @section( 'content' )
    <h1 class="admin-header">Edit Listing</h1>
    @if($errors->any())
    <h4>{{$errors->first()}}</h4>
    @endif
    <form method="POST" action="/admin/properties/update/{id}" class="add_edit_property_form" enctype="multipart/form-data">
    @csrf
    <div>
    <label for="prop_title">Property Title</label>
    <input type="text" name="prop_title" id="prop_title" />
    </div>
    <div>
    <label for="prop_desciption">Property Description</label>
    <textarea name="prop_desc" id="prop_desc"></textarea>
    </div>
    <div>
    <label for="prop_img">Property Image</label>
    <input type="file" name="prop_img" id="prop_img" />
    </div>
    <div>
    <label for="prop_beds">Number of Bedrooms</label>
    <input type="number" name="prop_beds" id="prop_beds" steps="1" min="1" />
    </div>
    <div>
    <label for="prop_baths">Number of Bathrooms</label>
    <input type="number" name="prop_baths" id="prop_baths" />
    </div>
    <div>
    <label for="prop_ft">Sqaure Feet</label>
    <input type="number" name="prop_ft" id="prop_ft" />
    </div>
    <div>
    <label for="props_basement">Finished Basement?</label>
    <select name="prop_basement" id="prop_basement">
    <option value="" selected disabled>Select an option</option>
    <option value="yes">Yes</option>
    <option value="no">No</option>
    </select>
    </div>
    <div>
    <label for="prop_tax">Property Tax</label>
    <input type="number" name="prop_tax" id="prop_tax" />
    </div>
    <div>
    <label for="props_heat">Heat Type</label>
    <select name="prop_heat" id="prop_heat">
    <option value="" selected disabled>Select an option</option>
    <option value="gas">Gas</option>
    <option value="oil">Oil</option>
    <option value="electric">Electric</option>
    </select>
    </div>
    <div>
    <label for="props_waterheater">Finished Basement?</label>
    <select name="prop_waterheater" id="prop_waterheater">
    <option value="" selected disabled>Select an option</option>
    <option value="yes">Yes</option>
    <option value="no">No</option>
    </select>
    </div>
    <div>
    <label for="prop_year">Year Built</label>
    <input type="number" name="prop_year" id="prop_year" />
    </div>
    <button type="submit">Add New Listing</button>
    </form>
    @endsection


    Solution du problème

    cette erreur signifie que cette ligne

     $prop = Property::find($id);

    retourne null, presque parce qu'une valeur nulle est passée à la $idvariable en raison de l'absence de $signe à l'action du formulaire d'édition,

    il faut donc changer cette ligne

    <form method="POST" action="/admin/properties/update/{id}" class="add_edit_property_form" enctype="multipart/form-data">

    à cela et cela devrait fonctionner avec vous

    <form method="POST" action="/admin/properties/update/{$id}" class="add_edit_property_form" enctype="multipart/form-data">

    je viens d'ajouter un $signe

    lundi 2 mai 2022

    React ERROR:TypeError : Impossible de lire la propriété 'pathname' d'undefined

    C'est mon Menucomposant. Je l'importe plus tard dans routes.js. J'obtiens cette erreur.

    TypeError: Cannot read property 'pathname' of undefined

    TypeError : Impossible de lire la propriété 'pathname' d'undefined

    Après l'avoir recherché et examiné certaines solutions, il semble que cela pourrait être un fichier route.js. Il y avait quelques solutions, où il a été suggéré d'utiliser this.props.history.location.pathnamemais cela ne fonctionne pas.

    J'ai également posté routes.jsci-dessous.

    Composant Navbar.js

    class Menu extends Component {
    constructor(props) {
    super(props);
    this.state = {
    collapseOpen: false,
    modalSearch: false,
    color: "navbar-transparent",
    isFull: false,
    };
    }
    goFull = () => {
    this.setState({ isFull: true });
    };
    componentDidMount() {
    window.addEventListener("resize", this.updateColor);
    }
    componentWillUnmount() {
    window.removeEventListener("resize", this.updateColor);
    }
    // function that adds color white/transparent to the navbar on resize (this is for the collapse)
    updateColor = () => {
    if (window.innerWidth < 993 && this.state.collapseOpen) {
    this.setState({
    color: "bg-white",
    });
    } else {
    this.setState({
    color: "navbar-transparent",
    });
    }
    };
    // this function opens and closes the collapse on small devices
    toggleCollapse = () => {
    if (this.state.collapseOpen) {
    this.setState({
    color: "navbar-transparent",
    });
    } else {
    this.setState({
    color: "bg-white",
    });
    }
    this.setState({
    collapseOpen:!this.state.collapseOpen,
    });
    };
    // this function is to open the Search modal
    toggleModalSearch = () => {
    this.setState({
    modalSearch:!this.state.modalSearch,
    });
    };
    render() {
    return (
    <Fullscreen
    enabled={this.state.isFull}
    onChange={(isFull) => this.setState({ isFull })}
    >
    <Navbar
    className={classNames("navbar-absolute", {
    [this.state.color]:
    this.props.location.pathname.indexOf("full-screen-map") === -1,
    })}
    expand="lg"
    >
    <Container fluid>
    <div className="navbar-wrapper">
    <div className="navbar-minimize d-inline">
    <Button
    className="minimize-sidebar btn-just-icon"
    color="link"
    id="tooltip209599"
    onClick={this.props.handleMiniClick}
    >
    <i className="icon-align-center visible-on-sidebar-regular" />
    <i className="icon-bullet-list-67 visible-on-sidebar-mini" />
    </Button>
    <UncontrolledTooltip
    delay={0}
    target="tooltip209599"
    placement="right"
    >
    Sidebar toggle
    </UncontrolledTooltip>
    </div>
    <div
    className={classNames("navbar-toggle d-inline", {
    toggled: this.props.sidebarOpened,
    })}
    >
    <button
    className="navbar-toggler"
    type="button"
    onClick={this.props.toggleSidebar}
    >
    <span className="navbar-toggler-bar bar1" />
    <span className="navbar-toggler-bar bar2" />
    <span className="navbar-toggler-bar bar3" />
    </button>
    </div>
    <NavbarBrand href="#pablo" onClick={(e) => e.preventDefault()}>
    {this.props.brandText}
    </NavbarBrand>
    </div>
    <button
    className="navbar-toggler"
    type="button"
    data-toggle="collapse"
    data-target="#navigation"
    aria-expanded="false"
    aria-label="Toggle navigation"
    onClick={this.toggleCollapse}
    >
    <span className="navbar-toggler-bar navbar-kebab" />
    <span className="navbar-toggler-bar navbar-kebab" />
    <span className="navbar-toggler-bar navbar-kebab" />
    </button>
    <Collapse navbar isOpen={this.state.collapseOpen}>
    <Nav className="ml-auto" navbar>
    <InputGroup className="search-bar" tag="li">
    <Button
    color="link"
    data-target="#searchModal"
    data-toggle="modal"
    id="search-button"
    onClick={this.toggleModalSearch}
    >
    <i className="icon-zoom-split" />
    <span className="d-lg-none d-md-block">Search</span>
    </Button>
    </InputGroup>
    <UncontrolledDropdown nav>
    <DropdownToggle
    caret
    color="default"
    data-toggle="dropdown"
    nav
    >
    <div className="notification d-none d-lg-block d-xl-block" />
    <i className="icon-sound-wave" />
    <p className="d-lg-none">Notifications</p>
    </DropdownToggle>
    <DropdownMenu className="dropdown-navbar" right tag="ul">
    <NavLink tag="li">
    <DropdownItem className="nav-item">
    Mike John responded to your email
    </DropdownItem>
    </NavLink>
    <NavLink tag="li">
    <DropdownItem className="nav-item">
    You have 5 more tasks
    </DropdownItem>
    </NavLink>
    <NavLink tag="li">
    <DropdownItem className="nav-item">
    Your friend Michael is in town
    </DropdownItem>
    </NavLink>
    <NavLink tag="li">
    <DropdownItem className="nav-item">
    Another notification
    </DropdownItem>
    </NavLink>
    <NavLink tag="li">
    <DropdownItem className="nav-item">
    Another one
    </DropdownItem>
    </NavLink>
    </DropdownMenu>
    </UncontrolledDropdown>
    <UncontrolledDropdown nav>
    <DropdownToggle
    caret
    color="default"
    data-toggle="dropdown"
    nav
    onClick={(e) => e.preventDefault()}
    >
    <div className="photo">
    <img alt="user preferences" src={UserIcon} />
    </div>
    <b className="caret d-none d-lg-block d-xl-block" />
    <p className="d-lg-none">Log out</p>
    </DropdownToggle>
    <DropdownMenu className="dropdown-navbar" right tag="ul">
    <NavLink tag="li">
    <DropdownItem className="nav-item">Profile</DropdownItem>
    </NavLink>
    <NavLink tag="li">
    <DropdownItem className="nav-item">Settings</DropdownItem>
    </NavLink>
    <DropdownItem divider tag="li" />
    <NavLink tag="li">
    <DropdownItem className="nav-item">Log out</DropdownItem>
    </NavLink>
    </DropdownMenu>
    </UncontrolledDropdown>
    <li className="separator d-lg-none" />
    </Nav>
    </Collapse>
    </Container>
    </Navbar>
    </Fullscreen>
    );
    }
    }
    export default Menu;

    routes.js

    import React from "react";
    import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
    import AdminNavbar from "../components/Menu/Navbar";
    const AppRouter = () => {
    return (
    <Router>
    <div>
    <Switch>
    <Route path="/navbar">
    <AdminNavbar />
    </Route>
    </Switch>
    </div>
    </Router>
    );
    };
    export default AppRouter;


    Solution du problème

    react-router-dom@5

    Pour "injecter" des accessoires de route dans le composant

    Vous pouvez soit rendre AdminNavbaren tant que méthodescomponent, render, ou render:children

    const AppRouter = () => {
    return (
    <Router>
    <div>
    <Switch>
    <Route path="/navbar" component={AdminNavbar} />
    </Switch>
    </div>
    </Router>
    );
    };

    Ou décorez AdminNavbaravec le composant d'ordre supérieur du routeur

    import { withRouter } from "react-router-dom";
    class Menu extends Component {
    ...
    render() {
    return (
    <Fullscreen
    enabled={this.state.isFull}
    onChange={isFull => this.setState({ isFull })}
    >
    <Navbar
    className={classNames("navbar-absolute", {
    [this.state.color]:
    this.props.location.pathname.indexOf("full-screen-map") === -1
    })}
    expand="lg"
    >
    ...
    </Navbar>
    </Fullscreen>
    );
    }
    }
    export default withRouter(Menu);

    react-router-dom@6

    react-router-domv6 Suppression des accessoires de route. Si vous avez besoin d'accéder aux "accessoires de route" dans un composant de classe, vous devrez créer un withRouterHOC personnalisé car il a également été supprimé dans la v6. Gardez à l'esprit qu'une navigate fonction a remplacé l' history objet.

    Exemple:

    import { useLocation, useNavigation, useParams } from 'react-router-dom';
    const withRouter = Component => props => (
    <Component
    {...props}
    location={useLocation()}
    navigate={useNavigate()}
    params={useParams()}
    />
    );
    export default withRouter;

    comment fscanf fonctionne-t-il avec différents types de variables ?

    Je regardais la documentation MSDN pour fscanf. J'ai essayé de changer l'exemple de code dans la documentation, mais cela n'a pas fonctionné comme prévu.

    Si, par exemple, j'ai un fichier "x" avec le contenu :

    "chaîne" 7 3.13 'x'

    After scanf("%s", string_input)est exécuté pour que les données "string"soient lues dans string_input, vont-elles à la ligne suivante ou à the 7pour la lecture suivante?

    Ensuite, supposons que les exécutions suivantes :

    char test;
    fscanf("%c", &test)

    Le programme sautera-t-il au 'x'ou lira-t-il le 7comme sa valeur ASCII?

    Voici ma réécriture de l'exemple de code de la documentation :

    #include <stdio.h>
    FILE *stream;
    int main( void )
    {
    long l;
    float fp,fp1;
    char s[81];
    char c,t;
    stream = fopen( "fscanf.out", "w+" );
    if( stream == NULL )
    printf( "The file fscanf.out was not opened\n" );
    else
    {
    fprintf( stream, "%s %d %c%f%ld%f%c", "a-string",48,'y', 5.15,
    65000, 3.14159, 'x' );
    // Security caution!
    // Beware loading data from a file without confirming its size,
    // as it may lead to a buffer overrun situation.
    /* Set pointer to beginning of file: */
    fseek( stream, 0L, SEEK_SET );
    /* Read data back from file: */
    fscanf( stream, "%s", s );
    fscanf( stream, "%c", &t );
    fscanf( stream, "%c", &c );
    fscanf( stream, "%f", &fp );
    fscanf( stream, "%f", &fp1 );
    fscanf( stream, "%ld", &l );

    printf( "%s\n", s );
    printf("%c\n", t);
    printf( "%ld\n", l );
    printf( "%f\n", fp );
    printf( "%c\n", c );

    printf("f\n",fp1);
    getchar();
    fclose( stream );
    }
    }

    Voici la sortie :

    un string
    -858553460
    8.000000
    4
    F

    Pourquoi est-ce la sortie ? Je m'attendais à:

    un string
    0
    65000
    5.15
    Oui
    3.14159


    Solution du problème

    Spécificateur de format manquant :

    printf("f\n",fp1);

    devrait être:

    printf("%f\n",fp1);

    Plus important encore: vérifiez la valeur de retour defscanf(). Il renvoie le nombre d'affectations réussies : il doit s'agir 1ici de chaque appel, car il doit y avoir exactement une affectation par fscanf()appel. Si fscanf()échoue, la variable n'est pas modifiée. Comme les variables dans le code ne sont pas initialisées, en cas fscanf()d'échec de leur affectation elles contiendront des valeurs aléatoires, ce qui est le cas ici:

      /* a-string 48 y 5.15 65000 3.14159 x */
    fscanf(stream, "%s", s); /* ^ (s is assigned "a-string") */
    fscanf(stream, "%c", &t); /* ^ (t is assigned space) */
    fscanf(stream, "%c", &c); /* ^ (c is assigned 4) */
    fscanf(stream, "%f", &fp); /* ^ (fp is assigned 8) */
    fscanf(stream, "%f", &fp1); /* ^ (fail: 'y' is not a float) */
    fscanf(stream, "%ld", &l); /* ^ (fail: 'y' is not a long) */

    Comment désinstaller complètement Anaconda de macOS

    Comment puis-je désinstaller complètement Anaconda de MacOS Sierra et revenir au Python d'origine ? J'ai essayé d'utiliser conda-clean -yesmais cela ne fonctionne pas. Je supprime également les éléments ~/.bash_profilemais il utilise toujours le python Anaconda et je peux toujours exécuter la condacommande.


    Solution du problème

    Pour supprimer les configurations :

    conda install anaconda-clean
    anaconda-clean --yes

    Une fois les configurations supprimées, vous pouvez supprimer le dossier d'installation d'anaconda, qui se trouve généralement sous votre répertoire personnel :

    rm -rf ~/anaconda3

    De plus, la anaconda-clean --yescommande crée une sauvegarde dans votre répertoire personnel au format ~/.anaconda_backup/<timestamp>. Assurez-vous de supprimer celui-là également.

    EDIT (v5.2.0): Maintenant, si vous voulez tout nettoyer, vous devrez également supprimer les deux dernières lignes ajoutées à votre fichier .bash_profile. Ils ressemblent à:

    # added by Anaconda3 5.2.0 installer
    export PATH="/Users/ody/anaconda3/bin:$PATH"

    Les données de la table ne s'alignent pas sur thead lors de l'imbrication de tbody dans React

    J'essaie de créer une table réductible dans React, en utilisant ce codepen (construit avec HTML5 et Jquery) comme référence. J'ai converti le code en React codepen, cependant, les données du tableau ne s'alignent pas sur le titre. De plus, je reçois l'avertissement ci-dessous. Quelqu'un peut-il me dire comment aligner correctement les données de la table ? Toute aide que vous pouvez fournir serait grandement appréciée.

    ATTENTION : validateDOMNesting(...) : tbody ne peut pas apparaître comme un enfant de tbody.

    Image:
    entrez la description de l'image ici

    Extrait de code:

    <table>
    <thead>
    <tr>
    <th>Regian</th>
    <th>Q1 2010</th>
    <th>Q2 2010</th>
    <th>Q3 2010</th>
    <th>Q4 2010</th>
    </tr>
    </thead>
    <tbody>
    <tbody className="labels">
    <tr>
    <td colSpan="5">
    <label htmlFor="accounting">Accounting</label>
    <input
    type="checkbox"
    name="accounting"
    id="accounting"
    data-toggle="toggle"
    onClick={showNestedData}
    ></input>
    </td>
    </tr>
    </tbody>
    <tbody className="hide">
    <tr>
    <td>Australia</td>
    <td>$7,685.00</td>
    <td>$3,544.00</td>
    <td>$5,834.00</td>
    <td>$10,583.00</td>
    </tr>
    <tr>
    <td>Central America</td>
    <td>$7,685.00</td>
    <td>$3,544.00</td>
    <td>$5,834.00</td>
    <td>$10,583.00</td>
    </tr>
    </tbody>
    </tbody>
    </table>


    Solution du problème

    On dirait que commenter l'élément parent tbody a fait l'affaire. Voir codepen mis à jour.

    Enregistrer DLL dans GAC (CMD ou PowerShell)

    J'essaye d'enregistrer un .DLLdans le GAC. Actuellement, j'ai du mal à prouver qu'il a été ajouté à l'assemblage.

    Utilisation de la commande

    C:\Windows\System32>%programfiles(x86)%\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe -i "path\to\my\file.dll"

    L'invite m'indique que l'assembly a été ajouté au cache.

    Lors de la vérification avec

    C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>gacutil.exe -l file.dll

    Il dit qu'il y a 0 éléments dans l'assemblage.

    Via Powershelldes commandes, j'essaie d'ajouter DLLceci :

    PS C:\WINDOWS\system32> Add-Type -AssemblyName "System.EnterpriseServices"


    PS C:\WINDOWS\system32> $publish = Nouvel objet System.EnterpriseServices.Internal.Publish


    PS C:\WINDOWS\system32> $publish.GacInstall("file.dll")

    Qu'ai-je fait de mal? Comment puis-je ajouter le .DLLau GAC? La meilleure façon (pour moi) serait de le faire avec Powershell.


    Solution du problème

    N'oubliez pas d'exécuter PowerShell en tant qu'administrateur, sinon cela ne fonctionnera pas.

    $dllpath = c:\path\yourdll.dll
    [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
    $publish = New-Object System.EnterpriseServices.Internal.Publish
    $publish.GacInstall($dllpath)

    Vous devrez probablement redémarrer tout service ou programme connexe après cela, par exemple :

    if (Get-Service "YourService" -ErrorAction SilentlyContinue)
    {
    Stop-Service -Name 'YourService'
    Start-Service -Name 'YourService'
    }

    Ou redémarrez simplement votre ordinateur.

    Recherche de support GPU sur Markov-chain Monte-Carlo (MCMC) en Python - méthode Hamiltonian MCMC

    Solution du problème

    Je ne connais pas la bibliothèque que vous utilisez, mais je ne vois pas comment y ajouter le support GPU. Cependant, pour votre problème spécifique, je recommanderais une bibliothèque appelée Pyro. Il est construit sur PyTorch, il prend donc en charge le GPU. Voici un exemple d'utilisation de MCMC dans Pyro : https://pyro.ai/examples/mcmc.html

    Faire une tornade pour servir une demande sur un fil séparé

    J'ai un service Web écrit en Flask, enveloppé dans un WSGIContaineret servi par Tornado en utilisant son FallbackHandlermécanisme. L'une de mes routes dans le service Web Flask exécute une opération très longue (elle prend environ 5 minutes), et lorsque cette route est déclenchée, tous les autres appels vers n'importe quelle route sont bloqués jusqu'à la fin de l'opération. Comment puis-je contourner ce problème ?

    Voici comment mon application Flask est servie avec Tornado:

    parse_command_line()
    frontend_path = os.path.join(os.path.dirname(__file__),"..","webapp")
    rest_app = WSGIContainer(app)
    tornado_app = Application(
    [
    (r"/api/(.*)", FallbackHandler, dict(fallback=rest_app)),
    (r"/app/(.*)", StaticFileHandler, dict(path=frontend_path))
    ]
    )


    Solution du problème

    J'ai créé une coutume WSGIHandlerqui prend en charge les requêtes multithreads pour les applications WSGI dans Tornado en utilisant un fichier ThreadPoolExecutor. Tous les appels dans l'application WSGI sont effectués dans des threads séparés, de sorte que la boucle principale reste libre même si votre réponse WSGI prend beaucoup de temps. Le code suivant est basé sur ce Gist et étendu de sorte que :


    • Vous pouvez diffuser une réponse (à l'aide d'une réponse d'itérateur) ou des fichiers volumineux directement depuis l'application WSGI vers le client, de sorte que vous pouvez maintenir une faible utilisation de la mémoire même lorsque vous générez des réponses volumineuses.

    • Vous pouvez télécharger des fichiers volumineux. Si le corps de la demande dépasse 1 Mo, le corps entier de la demande est vidé dans un fichier temporaire qui est ensuite transmis à l'application WSGI.


    Actuellement, le code n'a été testé qu'avec Python 3.4, donc je ne sais pas s'il fonctionne avec Python 2.7. Il n'a pas encore été testé sous contrainte, mais semble bien fonctionner jusqu'à présent.

    # tornado_wsgi.py
    import itertools
    import logging
    import sys
    import tempfile
    from concurrent import futures
    from io import BytesIO
    from tornado import escape, gen, web
    from tornado.iostream import StreamClosedError
    from tornado.wsgi import to_wsgi_str
    _logger = logging.getLogger(__name__)
    @web.stream_request_body
    class WSGIHandler(web.RequestHandler):
    thread_pool_size = 20
    def initialize(self, wsgi_application):
    self.wsgi_application = wsgi_application
    self.body_chunks = []
    self.body_tempfile = None
    def environ(self, request):
    """
    Converts a `tornado.httputil.HTTPServerRequest` to a WSGI environment.
    """
    hostport = request.host.split(":")
    if len(hostport) == 2:
    host = hostport[0]
    port = int(hostport[1])
    else:
    host = request.host
    port = 443 if request.protocol == "https" else 80
    if self.body_tempfile is not None:
    body = self.body_tempfile
    body.seek(0)
    elif self.body_chunks:
    body = BytesIO(b''.join(self.body_chunks))
    else:
    body = BytesIO()
    environ = {
    "REQUEST_METHOD": request.method,
    "SCRIPT_NAME": "",
    "PATH_INFO": to_wsgi_str(escape.url_unescape(request.path, encoding=None, plus=False)),
    "QUERY_STRING": request.query,
    "REMOTE_ADDR": request.remote_ip,
    "SERVER_NAME": host,
    "SERVER_PORT": str(port),
    "SERVER_PROTOCOL": request.version,
    "wsgi.version": (1, 0),
    "wsgi.url_scheme": request.protocol,
    "wsgi.input": body,
    "wsgi.errors": sys.stderr,
    "wsgi.multithread": False,
    "wsgi.multiprocess": True,
    "wsgi.run_once": False,
    }
    if "Content-Type" in request.headers:
    environ["CONTENT_TYPE"] = request.headers.pop("Content-Type")
    if "Content-Length" in request.headers:
    environ["CONTENT_LENGTH"] = request.headers.pop("Content-Length")
    for key, value in request.headers.items():
    environ["HTTP_" + key.replace("-", "_").upper()] = value
    return environ
    def prepare(self):
    # Accept up to 2GB upload data.
    self.request.connection.set_max_body_size(2 << 30)
    @gen.coroutine
    def data_received(self, chunk):
    if self.body_tempfile is not None:
    yield self.executor.submit(lambda: self.body_tempfile.write(chunk))
    else:
    self.body_chunks.append(chunk)
    # When the request body grows larger than 1 MB we dump all receiver chunks into
    # a temporary file to prevent high memory use. All subsequent body chunks will
    # be directly written into the tempfile.
    if sum(len(c) for c in self.body_chunks) > (1 << 20):
    self.body_tempfile = tempfile.NamedTemporaryFile('w+b')
    def copy_to_file():
    for c in self.body_chunks:
    self.body_tempfile.write(c)
    # Remove the chunks to clear the memory.
    self.body_chunks[:] = []
    yield self.executor.submit(copy_to_file)
    @web.asynchronous
    @gen.coroutine
    def get(self):
    data = {}
    response = []
    def start_response(status, response_headers, exc_info=None):
    data['status'] = status
    data['headers'] = response_headers
    return response.append
    environ = self.environ(self.request)
    app_response = yield self.executor.submit(self.wsgi_application, environ, start_response)
    app_response = iter(app_response)
    if not data:
    raise Exception('WSGI app did not call start_response')
    try:
    exhausted = object()
    def next_chunk():
    try:
    return next(app_response)
    except StopIteration:
    return exhausted
    for i in itertools.count():
    chunk = yield self.executor.submit(next_chunk)
    if i == 0:
    status_code, reason = data['status'].split(None, 1)
    status_code = int(status_code)
    headers = data['headers']
    self.set_status(status_code, reason)
    for key, value in headers:
    self.set_header(key, value)
    c = b''.join(response)
    if c:
    self.write(c)
    yield self.flush()
    if chunk is not exhausted:
    self.write(chunk)
    yield self.flush()
    else:
    break
    except StreamClosedError:
    _logger.debug('stream closed early')
    finally:
    # Close the temporary file to make sure that it gets deleted.
    if self.body_tempfile is not None:
    try:
    self.body_tempfile.close()
    except OSError as e:
    _logger.warning(e)
    if hasattr(app_response, 'close'):
    yield self.executor.submit(app_response.close)
    post = put = delete = head = options = get
    @property
    def executor(self):
    cls = type(self)
    if not hasattr(cls, '_executor'):
    cls._executor = futures.ThreadPoolExecutor(cls.thread_pool_size)
    return cls._executor

    Ce qui suit est une simple application Flask qui illustre le WSGIHandler. La hello()fonction se bloque pendant une seconde, donc si vous ThreadPoolExecutorutilisez 20 threads, vous pourrez charger 20 requêtes en même temps (en une seconde).

    La stream()fonction crée une réponse d'itérateur et transmet 50 blocs de données au client en 5 secondes. Il convient de noter qu'il ne sera probablement pas possible d'utiliser le stream_with_contextdécorateur de Flask ici : étant donné que chaque chargement de l'itérateur entraîne un nouveau executor.submit(), il est très probable que différents morceaux de la réponse en continu seront chargés à partir de différents threads, ce qui interrompra l'utilisation de thread par Flask. -des locaux.

    import time
    from flask import Flask, Response
    from tornado import ioloop, log, web
    from tornado_wsgi import WSGIHandler
    def main():
    app = Flask(__name__)
    @app.route("/")
    def hello():
    time.sleep(1)
    return "Hello World!"
    @app.route("/stream")
    def stream():
    def generate():
    for i in range(50):
    time.sleep(0.1)
    yield '%d\n' % i
    return Response(generate(), mimetype='text/plain')
    application = web.Application([
    (r'/.*', WSGIHandler, {'wsgi_application': app}),
    ])
    log.enable_pretty_logging()
    application.listen(8888)
    ioloop.IOLoop.instance().start()
    if __name__ == '__main__':
    main()

    Réagir Empêcher la récupération lors du changement de page

    Je travaille actuellement sur une application de réaction qui récupère du contenu de mon backend, ce qui s'avère très lourd. Mon intention est de maintenir le composant en vie et d'empêcher un nouveau rendu à chaque fois que l'utilisateur passe d'une page à une autre. Actuellement, je récupère toutes les données et les stocke avec react-redux et thunk.

    J'aimerais conserver l'option d'actualisation via un clic sur un bouton.

    J'ai essayé d'encapsuler le composant dans un composant React.memo mais je n'ai pas eu de chance.

    Voici mon code au cas où vous pourriez m'aider:

    C'est le composant que j'aimerais ne pas restituer à moins que l'état d'actualisation ne change :

    import React, { useEffect, useState } from "react";
    import { useDispatch, useSelector } from "react-redux";
    import { getNFTs } from "../../actions/NFT";
    export const LandList = React.memo(() => {
    const { gettingNFTs, NFTs } = useSelector((state) => state.NFT);
    const [refresh, setRefresh] = useState(0);
    const dispatch = useDispatch();
    useEffect(() => {
    dispatch(getNFTs());
    }, []);
    return (
    <div>
    <h2>LandList</h2>
    {gettingNFTs? <p>getting nfts...</p>: <p>Done</p>}
    </div>
    );
    });

    Et voici mon action au magasin (j'utilise thunk ici):

    export const getNFTs = () => {
    return async (dispatch) => {
    dispatch(getNFTsAction());
    const resp = await fetchWithoutToken("marketplace");
    const body = await resp.json();
    dispatch(finishGetNFTsAction(body.publishedLands));
    console.log(body);
    };
    };
    const getNFTsAction = () => ({
    type: types.NFTsGetStart,
    });
    const finishGetNFTsAction = (NFT) => ({
    type: types.NFTsGetFinished,
    payload: NFT,
    });

    Toute aide serait grandement appréciée!


    Solution du problème

    Vous pouvez utiliser redux ou un crochet contextuel pour le faire, créer un indicateur global et le modifier après la première requête réussie, et créer une condition dans le crochet useEffect

    export const LandList = React.memo(() => {
    const { gettingNFTs, NFTs } = useSelector((state) => state.NFT);
    const [refresh, setRefresh] = useState(0);
    const dispatch = useDispatch();
    useEffect(() => {
    // here is the global variable or property, check it before your dispatch
    if(!fetched){
    dispatch(getNFTs());
    }
    }, []);
    return (
    <div>
    <h2>LandList</h2>
    {gettingNFTs? <p>getting nfts...</p>: <p>Done</p>}
    </div>
    );
    });

    Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique&nbsp;?

    Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...