GOOGLE ADS

Samstag, 30. April 2022

.nuget-Ordner im Benutzerbereich

Aufgrund eines Problems mit meinem Speicher muss ich den Speicherort vieler Ordner in meinem Benutzerbereich löschen oder ändern, aber ich sehe einen.nuget-Ordner und ich würde gerne wissen, ob es in Visual Studio 2016 eine Möglichkeit gibt, den Speicherort von zu ändern dieser Ordner?

Es enthält alle für meine Projekte heruntergeladenen Pakete und nimmt viel Platz ein.

Speicherort des.nuget-Ordners


Lösung des Problems

Legen Sie die Eigenschaft globalPackagesFolder in Ihrer nuget.config fest, und Sie können diese auf einen beliebigen Speicherort auf Ihrem Laufwerk verweisen. Einen Überblick über die NuGet.config-Datei finden Sie hier in unserer Dokumentation.

Z.B

<configuration>
<config>
<add key="globalPackagesFolder" value="..\..\GlobalPackages2" />
</config>
</configuration>

Wie kann ich einen Python-Code in einer virtuellen Umgebung mit VSCode debuggen?

BEARBEITEN

Bei der Verwendung von VSCode hatte ich ein Problem beim Debuggen in einer virtuellen Umgebung mit verschiedenen Paketen, die nicht in der baseUmgebung installiert sind. Nachdem ich die Umgebung mit dem Befehl aktiviert activate my_envhabe, kann ich die Pakete in der Umgebung mit dem üblichen Python-Befehl als verwenden python main.py. Aber während des Debuggens kann ich die Pakete nicht verwenden, die nur in installiert sind my_env. Wie kann ich einen Python-Code in einer virtuellen Umgebung mit VSCode debuggen?

Dies ist die Zusammenfassung der Frage. Der Rest enthält einige spezifische Informationen zu meinem Fall.

VOR BEARBEITEN

Ich versuche, xmltodictein Paket mit einem einfachen Code mit Visual Studio-Code zu verwenden.

import xmltodict
with open('C:\\Users\\user\\foo.xml') as f:
db_dict = xmltodict.parse(f.read())
print(db_dict)

Ich habe eine virtuelle Umgebung mit dem Namen my_env, und ich habe das xmltodictPaket darin installiert. Wenn ich die Umgebung mit aktiviere activate my_env, funktioniert dieser Code einwandfrei. Aber wenn ich versuche, die Debug - Option vscode zu verwenden, gibt es einen No module named 'xmltodict'Fehler. Da die vscode-Debug-Schaltfläche ein neues cmd öffnet und den Debugging-Befehl darin ausführt, habe ich das Debuggen angehalten und activate my_envdieses cmd eingegeben und versucht, erneut zu debuggen, aber das Modul kann immer noch nicht gefunden werden. Außerdem habe ich das Jupiter-Notebook in vscode ausprobiert, es sieht das Paket auch nicht.

Ich sehe, dass import xmltodictdas in vscode rot unterstrichen ist und es sagt Unable to import 'xmltodict', aber es funktioniert, wenn ich es normal von cmd ausführe. Dies passiert manchmal bei anderen Modulen und ich weiß nicht warum. Ich habe das xmltodictModul mit installiert pip, vielleicht verursacht es das.

Ich verwende Visual Studio Code 1.30.1 mit Anaconda Python 3.7.1 unter Windows 10.

Wie kann ich einen Python-Code in einer virtuellen Umgebung mit VSCode debuggen? Ich habe diese Frage gesehen, aber ich glaube nicht, dass es genau das ist, was ich will?


Lösung des Problems

Stellen Sie sicher, dass die Umgebung, die Sie verwenden möchten, in der Python-Erweiterung für VS Code ausgewählt ist, indem Sie den Select InterpreterBefehl oder über die Statusleiste ausführen. Andernfalls können Sie den beim Debuggen zu verwendenden Python-Interpreter explizit über die pythonEinstellung für Ihre Debug-Konfiguration festlegen.

Wie können bei gegebenen H3-Zellen aus Polyfill Zellen identifiziert werden, die vollständig enthalten, teilweise enthalten oder mit dem Polygon zusammenhängen?

Wie in der akzeptierten Antwort zum Identifizieren von überlappenden Sechsecken erwähnt, bin ich verwirrt darüber, wie wir vollständig enthaltene, teilweise enthaltene oder zusammenhängende Zellen eines Polygons identifizieren können (überprüfen Sie, ob es das Polygon schneidet).


Lösung des Problems

Die Veredelung des H3 polyfill-Ausgangs ist im Allgemeinen ein zweistufiger Prozess:

  • Puffern Sie bei Bedarf die polyfillAusgabe so, dass sie Zellen enthält, die Ihren ausgewählten Kriterien entsprechen, aber keinen Mittelpunkt innerhalb des Polygons haben. Dies ist für teilweise geschlossene oder zusammenhängende Fälle erforderlich. Die Pufferoperation kann durchgeführt werden, indem kRing(cell, 1)für jede Zelle genommen und die Ausgabe zu einem neuen Satz hinzugefügt wird (z. B. in JS: Set(cells.flatMap(cell => kRing(cell, 1)))).


  • Filtern Sie den Satz von Zellen nach den von Ihnen gewählten Kriterien. Dies erfordert möglicherweise eine externe räumliche Bibliothek mit Funktionen wie touchesoder intersects, oder Sie müssen diese möglicherweise selbst implementieren. Im Allgemeinen würden Sie die Grenze jeder Zelle nehmen und mit Ihrem Polygon vergleichen, z


  • cells.filter(cell => intersects(h3ToGeoBoundary(cell), myPolygon)))

    Hapi basic auth validate wird nicht aufgerufen

    Die Validate-Funktion für basic

    await server.register(require('@hapi/basic'));
    const validate = async (request, email, password, id_customer) => {
    console.log(request)
    if (!email ||!password ||!id_customer) {
    return { credentials: null, isValid: false };
    }

    const results = await getHash(id_customer);

    if (results.length == 0) {
    return { credentials: null, isValid: false };
    }

    if (bcrypt.compareSync(password, results[0]['passwd'])) {
    const credentials = { id: id_customer, email: email };

    return { isValid: true, credentials };
    }
    return { credentials: null, isValid: false };
    };
    server.auth.strategy('simple', 'basic', { validate });

    Streckenbeispiel:

    {
    method: 'POST',
    path: '/home/getCategories',
    config: {
    auth: 'simple',
    description: 'Get Home',
    payload: {
    multipart: true
    },
    handler: Home.getCategories
    },
    /* options: {
    auth: 'simple'
    },*/
    //handler: Home.getCategories
    },

    Hier ist der Axios-Aufruf aus der App:

    axios.post('https://api.domain.com/home/getCategories', {
    code: code
    },
    {
    headers: {
    'email': email,
    'password': password,
    'id_customer': id_customer
    },
    })

    Wenn ich den Anruf mache, bekomme ich einen 401-Fehler, aber ich kann die Ausgabe von 'console.log (request)' nicht sehen.

    Irgendeine Hilfe?


    Lösung des Problems

    Haben Sie Folgendes versucht? Welche Version von Hapi.js verwenden Sie?

    const categoryPostValidation = {
    payload: Joi.object({
    name: Joi.string().label("Name").min(1).max(30).error((errors) => new Error('Name is invalid, and must be 1 to 30 characters in length')).required(),
    description: Joi.string().label("Description").min(1).max(255).error((errors) => new Error('Description is invalid, and must be 1 to 255 characters in length')).required()
    }),
    failAction: async (request, h, err) => {
    throw err;
    }
    };
    const categoryPostRouteOptions = {
    description: "Posts one category.",
    cors: true,
    payload: {
    output: 'data', // These are default options
    parse: true // These are default options
    },
    auth: {
    mode: 'required' // or 'try', etc
    strategy: 'simple'
    },
    validate: categoryPostValidation,
    handler: Home.getCategories
    };
    {
    method: 'POST',
    path: '/home/getCategories',
    options: categoryPostRouteOptions
    },

    Gibt es eine geeignete Möglichkeit, Cursor zu behandeln, die von einer Postgresql-Funktion in psycopg zurückgegeben werden?

    Ich versuche, mich mit postgresql (14.0 Build 1914 64-Bit unter Windows), psycopg2 (2.9.1 installiert mit Pip) und Python 3.8.10 unter Windows anzufreunden.

    Ich habe eine Postgresql-Funktion in einer Datenbank erstellt, die einen Cursor zurückgibt, so etwas wie unten

    CREATE get_rows 
    ...
    RETURNS refcursor
    ...
    DECLARE
    res1 refcursor;
    BEGIN
    OPEN res1 FOR
    SELECT some_field, and_another_field FROM some_table;
    RETURN res1;
    END

    Die Funktion kann vom pgAdmin4 Quert-Tool ausgeführt
    SELECT get_rows(); werden und gibt dann einen Cursor wie „<unbenanntes Portal 1>" zurück.

    Noch im Abfragetool in pgAdmin4 kann ich Folgendes ausgeben:

    BEGIN;
    SELECT get_rows();
    FETCH ALL IN "<unnamed portal 2>"; -- Adjust counter number

    Und das bringt mir die Zeilen, die vom Cursor zurückgegeben werden.

    Jetzt möchte ich dies mit psycopg anstelle von pgAdmin4 replizieren

    Ich habe den folgenden Code

    conn = psycopg2.connect("dbname='" + db_name + "' "\
    "user='" + db_user + "' " +\
    "host='" + db_host + "' "+\
    "password='" + db_passwd + "'")
    cursor = conn.cursor()
    cursor.callproc('get_rows')
    print("cursor.description: ", end = '')
    print(cursor.description)
    for record in cursor:
    print("record: ", end = '')
    print (record)

    Der obige Code gibt nur den Namen der Cursorzeichenfolge (wie von der Postgresql-Funktion „get_rows" zurückgegeben) in dem einzelnen Datensatz des Cursors an, der von psycopg erstellt wurde.

    Wie kann ich ein Objekt der Cursorklasse von psycopg erhalten, das Zugriff auf den von 'get_rows' zurückgegebenen Cursor bietet?

    https://www.psycopg.org/docs/cursor.html sagt, dass cursor.name schreibgeschützt ist und ich sehe keinen offensichtlichen Weg, den Cursor von ‚get_rows' mit einer psycopg-Cursor-Instanz zu verbinden


    Lösung des Problems

    Der von Ihnen angezeigte Cursor-Link bezieht sich auf den Python-DB-API-Cursor, nicht auf den Postgres-Cursor. Hier finden Sie ein Beispiel dafür, wie Sie das tun können, was Sie möchten Serverseitiger Cursor im Abschnitt:

    Hinweis Es ist auch möglich, einen benannten Cursor zu verwenden, um einen Cursor zu verbrauchen, der auf andere Weise als mit dem von execute() ausgeführten DECLARE erstellt wurde. Beispielsweise können Sie eine PL/pgSQL-Funktion haben, die einen Cursor zurückgibt:

    CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS $$
    BEGIN
    OPEN $1 FOR SELECT col FROM test;
    RETURN $1;
    END;
    $$ LANGUAGE plpgsql;

    Sie können den Cursorinhalt lesen, indem Sie die Funktion mit einem normalen, unbenannten Psycopg-Cursor aufrufen:

    cur1 = conn.cursor()
    cur1.callproc('reffunc', ['curname'])
    and then use a named cursor in the same transaction to "steal the cursor":
    cur2 = conn.cursor('curname')
    for record in cur2: # or cur2.fetchone, fetchmany...
    # do something with record
    pass

    AKTUALISIEREN

    Stellen Sie sicher, dass named cursor(cur2) geschlossen wird, um den serverseitigen Cursor freizugeben. So:

    cur2.close()

    So fragen Sie das Container-Speicherlimit in Prometheus ab

    Ich verwende das Prometheus-Tool zur Überwachung meines Kubernetes-Clusters.

    Ich habe in meinen Bereitstellungen ein Ressourcenlimit (Speicherlimit) festgelegt und muss ein Fenster zum Anzeigen des verfügbaren Gesamtspeichers konfigurieren. Bitte teilen Sie mir die Abfrage mit, die in Prometheus ausgeführt werden muss, um das für meine Bereitstellung verfügbare Gesamtspeicherlimit abzurufen.


    Lösung des Problems

    Es ist möglich, die Metriken kube_pod_container_resource_limits_memory_bytes (bereitgestellt von kube-state-metrics ) und container_memory_usage_bytes (bereitgestellt von kubelet/cAdvisor) zu verwenden.

    label_replace(
    label_replace(
    kube_pod_container_resource_limits_memory_bytes{},
    "pod_name",
    "$1",
    "pod",
    "(.+)"
    ),
    "container_name",
    "$1",
    "container",
    "(.+)"
    )
    -
    on(pod_name,namespace,container_name)
    avg(
    container_memory_usage_bytes{pod_name=~".+"}
    )
    by (pod_name,namespace,container_name)

    Eine kleine Erklärung zur Abfrage: Es handelt sich um eine Subtraktion des Speicherlimits und der tatsächlichen Nutzung. label_replaceFunktionen sind erforderlich, um die Bezeichnungsnamen beider Metriken abzugleichen, da sie von unterschiedlichen Zielen abgerufen werden. avgwird verwendet, um den Durchschnitt zwischen Pod-Neustarts zu erhalten, da jeder Pod-Neustart eine neue Metrik erstellt. {pod_name=~".+"}wird verwendet, um Metriken herauszufiltern container_memory_usage_bytes, die für diesen Fall nicht nützlich sind

    Warum kann auf das Ereignisobjekt nicht zugegriffen werden, wenn ich zwei Funktionen in eine anonyme Funktion im Submit-Handler umschließe?

    Also habe ich zwei Funktionen wie folgt in einen onClick-Handler gepackt:

    const PlannerDetailsFooter = (props) => {
    const [checked, setChecked] = useState(false);
    const handleChange = () => {
    setChecked((prev) =>!prev);
    };
    return (
    <div className="details-footer w-full p-4 bottom-0 absolute border-t-1">
    {props.emailConfig.isHidden? null:
    <button id="mail-button"

    onClick={() => {props.emailHandler(); handleChange()}}
    >{props.emailConfig.buttonText}</button>
    </div>
    )
    }

    Dies ist eine der beiden aufgerufenen Funktionen, die sich in der übergeordneten Komponente befindet

     const emailHandler = (event) => {
    if (event.target.id === "mail-button") {
    setEmailConfig({...emailConfig, isHidden: false, buttonText: 'Send Now'})
    } else {
    setEmailConfig(event.target.value)
    }
    }

    Jetzt bekomme ich den Fehler

    Eigenschaften von undefined können nicht gelesen werden (Lesen von 'Ziel')

    Mit dieser Lösung kann der Handler in der übergeordneten Komponente auf das Ereignisobjekt zugreifen:

    onClick={props.emailHandler}


    Lösung des Problems

    Wenn Sie verwenden onClick={props.emailHandler}, binden Sie emailHandler an onclick und erhalten die von onclick übergebenen Parameter.

    Wenn Sie jetzt verwenden, übergeben Sie () => {props.emailHandler();...}die Parameter nicht an emailHandler. Um dies zu beheben, können Sie tun(e) => {props.emailHandler(e);...}

    Fügen Sie alle 4 Zeichen von rechts nach links ein Leerzeichen in eine Zeichenfolge ein [geschlossen]

    Geschlossen. Diese Frage braucht Details oder Klarheit. Antworten werden derzeit nicht akzeptiert.


    Lösung des Problems

    Wenn die Eingabe tatsächlich eine Zahl ist, können Sie dafür die Zahlenformatierung verwenden:

    const long num = 121234123412341234;
    var nfi = new NumberFormatInfo
    {
    NumberGroupSeparator = " ",
    NumberGroupSizes = new[] { 4 }
    };
    var result = num.ToString("#,#", nfi);

    Und resultist12 1234 1234 1234 1234

    Wie tauschen Sie zwei Attribute in einer Array-Spalte in Bigquery aus?

    Ich habe eine Tabelle mit zwei Spalten: group_id, students (Array of student). Jeder Schüler hat zwei Attribute: name und last_name. Wie tauschen Sie den Namen mit dem Nachnamen für jeden Schüler aus?

    Students table:
    group_id | students.name | students.last_name
    ---------------------------------------------
    1 | Perez | Juan
    ---------------------------------------------
    2 | Caicedo | Pedro

    Ich muss students.name in students.last_name tauschen, hast du eine Idee?


    Lösung des Problems

    Sie können versuchen, den folgenden Ansatz in Betracht zu ziehen.

    with a as (
    select [struct("Perez" as name,"Juan" as last_name),
    struct("Caicedo" as name,"Pedro" as last_name)]as students
    )
    select stdnts.name last_name, stdnts.last_name name
    from a,unnest(students) as stdnts

    Wir haben den verschachtelten Spaltennamen anstelle der Attributwerte ausgetauscht.

    Von hier aus können Sie basierend auf den Abfrageergebnissen ein weiteres Schema mit den aktualisierten verschachtelten Spaltennamen für nameund erstellen last_name.

    Oder wenn Ihr Schema zu groß ist und es in BigQuery nicht neu erstellt werden kann, können Sie Ihre Tabelle überschreiben, indem Sie die Array-Spaltentabelle der Schüler löschen und sie dann mit den aktualisierten verschachtelten Spaltennamen neu erstellen und die Daten weiterhin basierend auf der obigen Abfrage beibehalten.

    Der Ansatz leitet sich von dieser Dokumentation zum Ändern von Spaltennamen ab, aber stattdessen werden wir die Namen der verschachtelten Spalten ändern.

    Was ist der beste Weg, um JavaFX-Anwendungen bereitzustellen, JAR- und eigenständige Anwendungen und native Installationsprogramme zu erstellen

    Ich verwende IntelliJ IDEA und habe meine JavaFX-Anwendung bereit für die Bereitstellung. Das Problem ist, dass, wenn ich die JAR-Datei generiere, sie nicht ausgeführt wird, wenn ich sie in der Befehlszeile ausführe, erhalte ich eine Ausnahme, FXMLLoadException, obwohl das Projekt in meiner IDE perfekt funktioniert.

    Ameisenaufgaben enden mit Fehlern, nach 15 Minuten Bauzeit verstehe ich wirklich nicht, was genau das Problem ist.

    Meine Frage also, was die richtigen Schritte sind, um eine JavaFX-Anwendung richtig bereitzustellen, jedes Tutorial oder jede Anleitung ist willkommen.


    Lösung des Problems

    Eine Java-Anwendung kann auf verschiedene Weise verpackt werden. Bitte sehen Sie sich die Java-Packaging-Übersicht an, um alles darüber zu erfahren. Eine der Verpackungen ist eine self-contained Java application.

    Es gibt verschiedene Möglichkeiten, diese Pakete zu erstellen:


    • Verwenden Sie die javapackagerTools, die mit Ihrem JDK geliefert werden

    • JavaFX Ant-Aufgaben

    • JavaFX Maven Plugin für ein Maven-Projekt


    Eigenständige Anwendung ist eine der Möglichkeiten, wie Ihre Anwendung paketiert werden kann und plattformspezifisch ist. Das Paket enthält:


    • Das Bewerbungspaket

    • Eine private Kopie der JRE


    Eine Liste der verfügbaren Bundles finden Sie hier.

    Schauen wir uns die verschiedenen Tools an, die uns zur Verfügung stehen, und wie man sie verwendet:

    JavaPackager-Tool

    JavaPackager Tool ist das einfachste Tool und hilft Ihnen beim Kompilieren, Packen, Signieren und Bereitstellen Ihrer Java(FX)-Anwendungen, ohne zusätzliche Skripte schreiben zu müssen. Die javapackager.jarDatei befindet sich im bin-Verzeichnis der JDK-Installation.

    Die Liste der Befehle, die damit verwendet werden können, ist hier verfügbar.

    JavaFX Ant-Aufgaben

    JavaFX Ant Tasks hilft Ihnen, Ihre Anwendung zu verpacken, indem Sie einfach eine build.xmlDatei für Ihr Projekt erstellen.

    Eine Reihe von Beispielen zur Verwendung von Ant-Skripten für Ihr Projekt finden Sie hier.

    Die Liste der Befehle, die damit verwendet werden können, ist hier verfügbar.

    JavaFX-Maven-Plugin

    Das JavaFX-Maven-Plug -in nutzt die Verwendung von Java-Anwendungspaketen für die Maven-Plattform. Sie können es verwenden, um Ihre Maven-basierte Java-Anwendung zu verpacken, indem Sie dem Projekt ein Plugin hinzufügen.

    Dieses Plugin IMHO, wenn das easiestvon den dreien verwendet werden soll. Es ist ein sehr gut geschriebenes, leicht verständliches Tool und verfügt über eine umfangreiche Dokumentation.

    JavaFX-Gradle-Plugin

    Das JavaFX Gradle Plugin stammt ebenfalls vom Autor des Maven-Plugins. Es hat alle Funktionen, die das Maven-Plugin hat, aber für Gradle:)

    Weiterführende Literatur:


    • Native Paketierung für JavaFX

    • Aktualisierung der JavaFX-Paketierungstools

    Gibt es eine Möglichkeit, Documentum dazu zu bringen, zeichenbasierten Speicher für Unicode zu verwenden?

    Jeder da draußen mit ausreichendem Wissen über EMC Documentum und Oracle weiß, ob es möglich ist, ein Documentum-Repository auf Oracle einzurichten, sodass es zeichenbasierte Feldlängen anstelle von bytebasierten verwendet.

    Standardmäßig scheint Documentum Byte-basierte Felder zu verwenden. Wenn also ein Feld eine Zeichenfolge (32) ist, kann es 32 Bytes anstelle von Zeichen enthalten. In diesem Fall würde ein aus 32 Zeichen bestehender Satz von Unicode-Zeichen abgeschnitten, da sie mehr als 32 Byte umfassen.

    Weiß jemand, ob es möglich ist, dies durch die Einrichtung der Oracle- und Documentum-Einstellungen zu ändern?


    Lösung des Problems

    Nein, es ist nicht möglich. Ich habe viel darüber recherchiert, da wir nach der Migration einer Docbase von 5.2.5 auf 5.3 mehrere Probleme hatten und einige Abfragen nicht mehr funktionierten und wir in Webtop Trunkierungsfehler erhalten, da wir einen nicht unterstützten Zeichensatz verwenden.

    So blockieren Sie alle Felder und entsperren ausgewählte Felder für eine HTML-Datumsauswahl

    Ich möchte fast alle Kontrollkästchen blockieren, ich möchte, dass nur 2 und 4 Tage der Woche verfügbar sind. Weiß jemand, wie das geht?

    Habe derzeit diesen Code:

    <input class="unstyled" type="date" id="datapicker">
    const date = new Date();
    currentDate = date.toISOString().slice(0,10);
    document.getElementById('datapicker').value = currentDate;
    document.getElementById('datapicker').min = currentDate;


    Lösung des Problems

    Es gibt einen Artikel zu diesem Problem: Datumsauswahl in HTML5. Sehen Sie sich den Abschnitt „Tage können nicht eliminiert werden, aber hier ist ein Lösungsvorschlag" an. Sie können bestimmte Tage nicht einschränken, indem Sie nur Markup verwenden, aber der Autor schlägt die folgende Problemumgehung vor:

    var date = document.querySelector('[type=date]');
    function noMondays(e){
    var day = new Date( e.target.value ).getUTCDay();
    // Days in JS range from 0-6 where 0 is Sunday and 6 is Saturday
    if( day == 1 ){
    e.target.setCustomValidity('OH NOES! We hate Mondays! Please pick any day but Monday.');
    } else {
    e.target.setCustomValidity('');
    }
    }
    date.addEventListener('input',noMondays);

    Es gibt auch ein Schrittargument, aber es lässt Sie nur bestimmte Lücken zwischen den Tagen begrenzen (z. B. jeden zweiten Tag):

    <input class="unstyled" type="date" id="datapicker" step="2">

    Fehler beim Analysieren von Anwendungsnummern aus einer Karte mithilfe von Anfragen

    Lösung des Problems

    Nicht sicher, ob dies hilfreich sein wird.

    Ich konnte diese API finden

    Sie müssen die Eingabe zurückentwickeln, um diese Ausgabe zu erhalten, aber dies sollte ein guter Anfang für Sie sein, da Sie /DevelApps_MuniBdry_Parcels anstelle von /AllDevelopmentApplications verwendet haben.

    Sehen Sie sich auch eine der ersten gestellten Anfragen an

    Zusammenfassend denke ich, dass Sie die Netzwerk-Tabs überwachen sollten, da sie anscheinend alle Daten von ihren APIs abrufen und dann mit einer Logik Ihren Mausklick -> Koordinieren -> Objekt abgleichen, was Sie selbst ohne ihr Frontend tun können sollten. würde aber noch dauern.

    Wie zeichnet man mit Plotly in Python ein Streudiagramm und ein Liniendiagramm in demselben Diagramm?

    Ich habe mich kürzlich mit Plotly beschäftigt und liebe es absolut, also versuche ich, es in jedem Projekt zu verwenden, das ich mache.

    Mit Matplotlib kann ich mit dem folgenden Code ein Liniendiagramm und ein Streudiagramm in demselben Diagramm zeichnen.

    plt.figure(figsize = (20,5))
    plt.scatter(x, y)
    plt.plot(x, y_pred, color = "r")
    plt.show()

    Mit dem trendlineParameter in der scatterFunktion im Inneren plotly.expresskann ich eine Linie der besten Anpassung durch die verstreuten Punkte zeichnen, aber ich möchte das nicht, da ich versuche zu demonstrieren, wie diese Linie berechnet wird.

    Danke für die Hilfe im Voraus!


    Lösung des Problems

    Unter Verwendung gleich definierter Arrays/Listen, x, y, y_pred. Ein gleichwertiger Ansatz besteht darin, mit Plotly Express eine Figur zu erstellen und ihr dann zusätzliche Spuren hinzuzufügen.

    import pandas as pd
    import numpy as np
    import plotly.express as px
    x = np.linspace(1, 20, 16)
    y = np.random.uniform(1, 6, 16)
    y_pred = y * 1.1
    fig = px.scatter(x=x, y=y, color_discrete_sequence=["yellow"])
    fig.add_traces(px.line(x=x, y=y_pred, color_discrete_sequence=["red"]).data)

    Geben Sie hier die Bildbeschreibung ein

    Gibt es eine Möglichkeit, die Farben in Ant Design Switch Component zu überschreiben

    Ich muss das Standardblau (Primärfarbe) auf Antd Switch Component überschreiben, wenn es aktiviert ist, und es in rote Farbe ändern. Gibt es eine Möglichkeit, wie ich das tun kann?

    Ich habe versucht, das Stilattribut zu verwenden, aber es hat nicht funktioniert.


    Lösung des Problems

    .ant-switch-checkedSie können die Klasse so überschreiben

    .ant-switch-checked {
    background-color: red;
    }

    Legende in Matplotlib - Subplotting durch eine For-Schleife

    Ich bin neu in Python und Matplotlib und würde mich über jede Hilfe freuen, wie man Legenden für jeden Subplot erstellt, den ich mit einer FOR-Schleife erstellt habe. Hier ist der Code und das Beste, was ich der Beschriftung meiner Figuren nahe bringen konnte.

    import matplotlib.pyplot as plt
    import numpy as np
    n_rows=2
    n_cols=2
    leg=['A','B','C','D']
    fig, axes = plt.subplots(n_rows,n_cols)
    for row_num in range(n_rows):
    for col_num in range (n_cols):
    ax = axes[row_num][col_num]
    ax.plot(np.random.rand(20))
    ax.set_title(f'Plot ({row_num+1}, {col_num+1})')
    ax.legend(leg[row_num+col_num])
    fig.suptitle('Main Title')
    fig.tight_layout()
    plt.show()

    Hier ist die Ausgabe des Codes:
    Bild mit falschen Legenden


    Lösung des Problems

    Sie verwenden ax.legend(leg[row_num+col_num])aber row_num+col_numkeine korrekte Darstellung für einen Index einer Liste.

    Dies ist, was passiert

    row_num | col_num | idx=row_num+col_num | leg[idx]
    0 | 0 | 0 | A
    0 | 1 | 1 | B
    1 | 0 | 1 | B
    1 | 1 | 2 | C

    Wenn Sie verwenden leg[row_num+col_num], erhalten Sie den falschen Legendeneintrag.

    Es gibt viele Möglichkeiten, dies zu beheben. Eine einfache besteht darin, einen Zähler (die Variable jim folgenden Code) einzuführen, der bei jeder Schleife inkrementiert wird.

    import matplotlib.pyplot as plt
    import numpy as np
    n_rows=2
    n_cols=2
    leg=['A','B','C','D']
    fig, axes = plt.subplots(n_rows,n_cols)
    j = 0
    for row_num in range(n_rows):
    for col_num in range(n_cols):
    ax = axes[row_num][col_num]
    ax.plot(np.random.rand(20))
    ax.set_title(f'Plot ({row_num+1}, {col_num+1})')
    ax.legend(leg[j])
    j += 1
    fig.suptitle('Main Title')
    fig.tight_layout()
    plt.show()

    Wie setze ich einen Standardwert für das Jahr auf eine Eingabe mit dem Typ Datum?

    Ich möchte wissen, ob es möglich ist, eine Eingabe des Typs date zu haben, um das Standardjahr als 2017 zu haben. Alles, was ich tun kann, ist ein Standarddatum festzulegen, das auch den Tag und den Monat enthält:


    <input type="date" value="2017-12-21">
    <br><br>
    <input type="date" value="2017-mm-dd">
    <br><br>
    <input type="date" value="2017">
    <br><br>
    <input type="date">

    Lösung des Problems

     <input type="date" min="2017-01-01" max="2017-12-30">

    Probieren Sie Min- und Max-Eigenschaften wie diese aus. Es sollte funktionieren

    Discord.js Returning 2 Embeds Problem

     if (args[0] === "off") {
    let disabled = new Discord.MessageEmbed()
    .setColor(ee.color)
    .setAuthor('Disabled Welcomer Channel', client.user.avatarURL())
    .setThumbnail('https://icons.iconarchive.com/icons/dtafalonso/android-lollipop/512/Settings-icon.png')
    .addFields(
    { name: '__**Status**__', value: ':white_circle: Disabled', inline: true },
    { name: '__**Channel**__', value: `None`, inline: true },
    )
    db.delete(`welchannel_${message.guild.id}`)
    message.channel.send(disabled)
    }
    let chx = db.get(`welchannel_${message.guild.id}`)
    let channel = message.mentions.channels.first()
    let embed = new Discord.MessageEmbed()
    .setColor(ee.wrongcolor)
    .setTitle('<:warning:943421375526355024> | **Please Provide A Channel**')
    .setDescription('**Usage:**\n```css\n.welcomer <#channel|OFF>```')
    .addFields(
    {
    name: '__**Current Welcomer Channel:**__',
    value: chx? `<#${chx}>`: 'None',
    inline: true,
    },
    );
    if (!channel) {
    return message.channel.send(embed)
    }

    Wenn Sie den Befehl verwenden .welcomer off, gibt er die disabledEinbettung und die embedgleichzeitige disabledEinbettung zurück.


    Lösung des Problems

    Benutzenreturn

    Z.B:

    return message.channel.send(disabled)


    if (args[0] === "off") {
    let disabled = new Discord.MessageEmbed()
    .setColor(ee.color)
    .setAuthor('Disabled Welcomer Channel', client.user.avatarURL())
    .setThumbnail('https://icons.iconarchive.com/icons/dtafalonso/android-lollipop/512/Settings-icon.png')
    .addFields(
    { name: '__**Status**__', value: ':white_circle: Disabled', inline: true },
    { name: '__**Channel**__', value: `None`, inline: true },
    )
    db.delete(`welchannel_${message.guild.id}`)
    return message.channel.send(disabled);
    }
    let chx = db.get(`welchannel_${message.guild.id}`)
    let channel = message.mentions.channels.first()
    let embed = new Discord.MessageEmbed()
    .setColor(ee.wrongcolor)
    .setTitle('<:warning:943421375526355024> | **Please Provide A Channel**')
    .setDescription('**Usage:**\n```css\n.welcomer <#channel|OFF>```')
    .addFields(
    {
    name: '__**Current Welcomer Channel:**__',
    value: chx? `<#${chx}>`: 'None',
    inline: true,
    },
    );
    if (!channel) {
    return message.channel.send(embed)
    }

    PDF-Dateien mit reversiblem Prozess zusammenführen (Originaldateien extrahieren)

    Es gibt unzählige Fragen und Antworten, die verschiedene Lösungen zum Zusammenführen von 2 oder mehr PDF-Dateien und zum Extrahieren bestimmter Seiten und zum Erstellen eines PDF mit dieser Teilmenge präsentieren.

    Leider konnte ich keinen Weg finden (entweder mit einer Bibliothek oder mit Befehlszeilen-Tools, da es ein Skript sein wird), um Dateien zusammenzuführen, sodass die resultierende Datei eine gültige PDF-Datei ist, und diese Datei später mithilfe von in separate Dateien "zurückzuteilen". gleiche Seitenbereiche, um genau die gleichen Originaldateien (auf Binärebene) zu erhalten.

    Ist das möglich?


    Lösung des Problems

    Sobald Sie die PDF-Dateien zusammengeführt haben, können Sie das Ergebnis nicht aufteilen und die exakt gleichen Originaldateien auf Binärebene erhalten. PDF-Quelldateien sind nicht als undurchsichtige Binärdateien in der zusammengeführten Datei enthalten.

    Eine mögliche Lösungslösung besteht, wie @mkl sagte, darin, ein PDF-Portfolio zu verwenden, um die Quelldateien so einzubetten, wie sie sind. Beim Anzeigen des Portfolios sehen Sie jede Datei so, wie sie ist, nicht als lange zusammengeführte PDF-Datei.

    Wie kann ich eine Running Total Sumifs-ähnliche Funktion in SQL erstellen?

    Ich bin ziemlich neu in SQL, aber Excel ist viel zu langsam geworden, um weiter damit zu arbeiten, also versuche ich es mit SQLiteStudio. Ich möchte eine Spalte in einer Abfrage erstellen, die die laufende Summe im Laufe der Zeit anzeigt (gekennzeichnet als Zeitplanpunkte, die jeden Prozentsatz durch die Laufzeit eines Projekts markieren). Abgeschlossen markiert, ob ein Standort die Installation abgeschlossen hat (J/NULL), und wird einfach verwendet, um unvollständige Standorte aus weiteren Berechnungen herauszufiltern.

    Ich habe derzeit

    With cte as(
    Select [Location]
    ,[HW/NonHW]
    ,[Obligation/Actual]
    ,[Schedule Point]
    ,[CY20$]
    ,[Vendor Name]
    ,[Vendor Zip Code]
    ,[Complete]
    ,[System Rollup (Import)]
    ,IIf([Complete] = "Y", [CY20$], 0) As [Completed Costs]
    FROM data)
    Select [Location]
    ,[HW/NonHW]
    ,[Obligation/Actual]
    ,[Schedule Point]
    ,[CY20$]
    ,[Vendor Name]
    ,[Vendor Zip Code]
    ,[Complete]
    ,[System Rollup (Import)]
    ,[Completed Costs]
    ,SUM([Completed Costs]) OVER (PARTITION BY [Obligation/Actual], [Normalized Schedule Location 1%],[System Rollup (Import)], [HW/NonHW]) As [CY20$ Summed]
    FROM cte

    An diesem Punkt möchte ich eine Summe nicht für jeden Zeitplanpunkt, sondern für alle vorherigen Zeitplanpunkte (dh den <=Operator in einer Excel-Summenaussage) erstellen.

    Als Referenz sind hier die Summen, die ich versuche zu replizieren:

    =SUMIFS($N$2:$N$541790,$AU$2:$AU$541790,"Y",$AQ$2:$AQ$541790,AQ2,$AI$2:$AI$541790,AI2,$AH$2:$AH$541790,AH2,$AJ$2:$AJ$541790, "<=" & AJ2)

    Nist CY20$, AUist Complete, AQist System, AIist Obligation/Actual, AHist HW/NonHW, AJist Zeitplanpunkt.

    Jede Hilfe wäre willkommen!


    Lösung des Problems

    Das Äquivalent zu SUMIFS ist eine Kombination aus SUMund CASE- WHENin SQL.

    Abstraktes Beispiel:

    SELECT
    SUM(
    CASE
    WHEN <condition1> AND <condition2> AND <condition3> THEN 1
    ELSE 0
    END
    )
    FROM yourtable

    Oben sind condition1, condition2und condition3logische Ausdrücke, die <und >teilen nur mit, dass Sie dort einen Ausdruck haben, er ist nicht Teil der Syntax. Es ist auch unnötig, genau 3 Bedingungen zu haben, Sie können so viele haben, wie Sie möchten. Außerdem ist es nicht erforderlich, ANDals Operator zu verwenden, Sie können Ihren eigenen Ausdruck nach Belieben erstellen. Der Grund, warum ich den ANDOperator verwendet habe, war, dass Sie beabsichtigen, eine Disjunktion zu haben, vermutlich basierend auf der Tatsache, dass Sie verwendet haben SUMIFS.

    Ein konkreteres Beispiel:

    CREATE TABLE person(
    number int,
    name text,
    age int
    );
    INSERT INTO person(number, name, age)
    VALUES(1, 'Joe', 12);
    INSERT INTO person(number, name, age)
    VALUES(2, 'Jane' 12);
    INSERT INTO person(number, name, age)
    VALUES(3, 'Robert', 16);
    INSERT INTO person(number, name, age)
    VALUES(4, 'Roberta', 15);
    INSERT INTO person(number, name, age)
    VALUES(5, 'Blian', 18);
    INSERT INTO person(number, name, age)
    VALUES(6, 'Bigusdqs', 19);
    SELECT
    SUM(
    CASE
    WHEN age <= 16 AND name <> 'Joe' THEN 1
    ELSE 0
    END
    ) AS MySUMIFS
    FROM person;

    BEARBEITEN

    Wenn wir wissen möchten, wie viele Personen jünger als die aktuelle Person sind, können wir einen Join durchführen:

    SELECT 
    SUM(
    CASE
    WHEN p2.age <= p1.age THEN 1
    ELSE 0
    END
    ) AS MySUMIFS, name
    FROM person p1
    JOIN person p2
    ON p1.name <> p2.name
    GROUP BY p1.name;

    EDIT2

    Erstellte eine Fiddle basierend auf den oben beschriebenen Ideen, Sie können sie unter https://dbfiddle.uk/?rdbms=sqlite_3.27&fiddle=3cb0232e5d669071a3aa5bb1df68dbca erreichen

    Der Code in der Geige:

    CREATE TABLE person(
    number int,
    name text,
    age int
    );
    INSERT INTO person(number, name, age)
    VALUES(1, 'Joe', 12);
    INSERT INTO person(number, name, age)
    VALUES(2, 'Jane' 12);
    INSERT INTO person(number, name, age)
    VALUES(3, 'Robert', 16);
    INSERT INTO person(number, name, age)
    VALUES(4, 'Roberta', 15);
    INSERT INTO person(number, name, age)
    VALUES(5, 'Blian', 18);
    INSERT INTO person(number, name, age)
    VALUES(6, 'Bigusdqs', 19);
    SELECT
    SUM(
    CASE
    WHEN p2.age <= p1.age THEN 1
    ELSE 0
    END
    ) AS MySUMIFS, p1.name
    FROM person p1
    JOIN person p2
    ON p1.name <> p2.name
    GROUP BY p1.name;

    Geben Sie hier die Bildbeschreibung ein

    Wie speichere ich Dateien (Bilder) in MongoDB Atlas mit Mongofiles?

    Ich habe eine React-Blog-Anwendung mit Golang als Backend erstellt und speichere HTML-Strings in MongoDB, um meine Blogs zu speichern. Jetzt möchte ich Bilder in diesen HTML-Strings (Blogs) haben. Ich habe dieses Problem gelöst, indem ich einfach img-Tags mit imgur verknüpft habe, aber ich habe mich entschieden, mongoDB Atlas zu verwenden, um alle meine Bilder zu speichern.

    Also meine Frage ist:

    Ist GridFS der beste Weg, um Bilder zu speichern, und wenn ja, wie kann ich es mit mongoDB Atlas verwenden, um die Bilder hochzuladen?

    Danke und einen schönen Tag noch!


    Lösung des Problems

    Ja, GridFS ist der beste Weg, um Bilddateien in MongoDB zu speichern. Weitere Informationen finden Sie in dieser Dokumentation: https://docs.mongodb.com/manual/core/gridfs/

    FS-Datei umbenennen - Fehler: ENOENT: keine solche Datei oder Verzeichnis, benennen Sie '24.png' -> '1.png' um

    Ich versuche, ein kleines Skript zu schreiben, das die Dateinamen der Bilder in meinem Ordner umschreibt.

    Wo gehe ich falsch?

    Ich erhalte diesen Fehler: FS-Datei umbenennen - Fehler: ENOENT: keine solche Datei oder kein solches Verzeichnis, benennen Sie '24.png' -> '1.png' um

    const fs = require('fs');
    const fileNames = fs.readdirSync('./images')
    for(const fileName of fileNames) {
    const ext = '.png'
    let incNumber = 1;
    let newName = String(incNumber + ext);
    fs.renameSync(fileName, newName);
    incNumber++
    }


    Lösung des Problems

    Sie müssen die Zahl nicht in eine Zeichenfolge ändern, während Sie eine Zeichenfolge in eine Zahl einfügen. Wenn Sie sicher gehen wollen, können Sie incNumber.toString() + ext aufrufen

    const fs = require('fs');
    const path = require("path");
    const fileNames = fs.readdirSync('./images')
    const ext = '.png'
    let incNumber = 1;
    for(const fileName of fileNames) {
    let newName = path.join('./images', incNumber + ext);
    fs.renameSync(path.join('./images',fileName), newName);
    incNumber++
    }

    Ändern eines GIF-Bildes in go ... Transparenz wird nicht richtig eingestellt

    Ich habe einen Code, der die folgenden logischen Operationen ausführt:


    • Ein GIF-Bild einlesen und mit gif.DecodeAll in ein *GIF decodieren

    • Ändern Sie einige Pixel in jedem Frame des *GIF mit image.Set

    • Schreiben Sie das resultierende modifizierte Bild mit gif.EncodeAll aus


    Hier sind einige Codeschnipsel, die zeigen, was der Code tut (Fehlerbehandlung, Schließen von Dateien usw. wurden der Kürze halber entfernt):

    f, err:= os.Open(filename)
    reader:= bufio.NewReader(f)
    g, err:= gif.DecodeAll(reader)
    err = modify_image(g)
    of, err:= os.Create("out.gif")
    writer:= bufio.NewWriter(of)
    err = gif.EncodeAll(writer, g)

    Hier ist die modify_image-Funktion:

    func modify_image(img *gif.GIF) error {
    for i:= 0; i < len(img.Image); i++ {
    err:= modify_frame(img.Image[i])
    }
    return nil
    }

    Und modify_frame:

    func modify_frame(frame *image.Paletted) error {
    xmin:= frame.Rect.Min.X
    ymin:= frame.Rect.Min.Y
    xmax:= frame.Rect.Max.X
    ymax:= frame.Rect.Max.Y
    for y:= ymin; y < ymax; y++ {
    for x:= xmin; x < xmax; x++ {
    if should_turn_pixel_transparent(frame, x, y) {
    frame.Set(x, y, color.RGBA64{0, 0, 0, 0})
    }
    }
    }
    return nil
    }

    Das out.gif, das dieser Code erzeugt, hat die richtigen Pixel transparent gemacht, aber während die Animation fortschreitet, werden die Pixel, die ich transparent gemacht habe, nicht "gelöscht"; dh wenn diese transparenten Pixel über nicht transparente Pixel geschrieben werden, werden die darunter liegenden nicht transparenten Pixel immer noch angezeigt.

    Mein (kurzes) Verständnis ist, dass es zwei verschiedene Methoden gibt, um Transparenz in Gifs darzustellen. Ich weiß nicht, ob ich Index-Transparenz im Vergleich zu Alpha-Transparenz verwenden muss oder ob ich nur Dinge völlig falsch mache. Jeder Rat wäre willkommen.


    Lösung des Problems

    Dies wird in verschiedenen Golang-Tutorials zum Generieren von GIFs oft weggelassen oder nicht behandelt, aber neben dem Einstellen des Verzögerungs Delay-Slices für jeden Frame im ImageSlice ist es auch erforderlich, Disposalfür jeden Frame des GIFs eine Einstellung vorzunehmen. DisposalNonewird verwendet, wenn das Slice kein Mitglied hat, das dem aktuellen Frame-Index entspricht.

    Entsorgungsmöglichkeiten sind:

    const (
    DisposalNone = 0x01
    DisposalBackground = 0x02
    DisposalPrevious = 0x03
    )

    Das Folgende ist das resultierende GIF für jede Entsorgungsart.

    EntsorgungKeine:
    gif.EntsorgungKeine

    EntsorgungHintergrund:
    gif.DisposalBackground

    EntsorgungBisher:
    gif.EntsorgungPrevious

    Delphi So verlassen Sie bei einem Fehler die Routine auf oberster Ebene

    In Delphi habe ich eine Hierarchie von Routinen. Die Routine 'A' ruft 'B' auf, die 'C' aufruft, die 'D' aufruft. 'D' führt einige Überprüfungen durch und trifft auf einen Fehler irgendeiner Art, vielleicht eine Ausnahme, vielleicht nur einen logischen Fehler. Unabhängig davon, wenn 'D' auf den Fehler stößt, kann die Steuerung trotzdem an 'A' zurückgegeben werden, ohne dass 'D' einen 'Fehler'-Code zurückgibt, den 'C' prüft, was einen Fehlercode zurückgibt, den 'B ' prüft auf etc...?


    Lösung des Problems

    Es gibt genau zwei Möglichkeiten, das zu tun, was Sie wollen:

  • Geben Sie einen Fehler-/Statuscode zurück und lassen Sie jede Funktion in der Aufrufliste diesen Code überprüfen.

  • Lösen Sie eine Ausnahme aus und behandeln Sie sie auf hoher Ebene.

  • Sie möchten Option 1 nicht verwenden, sodass Option 2 übrig bleibt.

    Render-Alert-Komponente innerhalb von try-catch-react

    Ich habe eine Frage und versuche einige Stunden zu lösen. Ich muss eine Warnkomponente rendern, nachdem der Benutzer eine Anfrage gesendet hat. Wenn dies nicht erfolgreich ist, muss ich eine Komponente für den Benutzer rendern, aber ich versuche, dies in einem Try-Catch zu machen, als wäre es ein Browser Alarm.

    Unten ist mein Code try catch (ich benutze Redux und Formik)

     const formik = useFormik({
    initialValues: {
    email: "",
    password: "",
    },
    validationSchema: validationSchema,
    onSubmit: async (values) => {
    dispatch(loginPending());
    try {
    const res = await login(values);
    dispatch(loginSuccess(res));
    dispatch(getUserSuccess(res));
    navigate("/dashboard");
    } catch (err) {
    dispatch(loginFailure(err));
    return alert("Login failed") // here i need render my component <AlertCard/>
    }
    },
    });

    Ich muss den Browser-Alarm in meine Komponente AlertCard ändern, aber ich weiß nicht, wie ich das mache.


    Lösung des Problems

    Ich denke, diese beiden Beiträge sollten Ihnen eine Idee geben,

    um eine Komponente zu rendern, wenn die Antwort fehlschlägt

    Fehlerbehandlung in React

    Mehrere Parameter für Methoden in F#

    Ich habe eine in F# geschriebene Klasse, die ich in C# verwende und die eine Methode definiert Render:

    member this.Render template (context: IContext) =
    let tokens = Lexer.tokenize template
    let parser = new DefaultParser([for filter in _filters -> filter])
    let resp = new StringBuilder()
    for node in parser.Parse tokens None do
    ignore <| resp.Append(node.render context)
    resp.ToString()

    The signature of this method is template:string -> (IContext -> string), which of course reads as "member Render takes a string parameter, then returns a function that takes an IContext and produces a string.

    Wenn ich die Deklaration von "Member" in eine Let-Bindung ändere und sie als lokale Funktion für die Klassendefinition definiere:

    let Render template (context: IContext) =...

    Dann wird die Signatur zu dem, was Sie erwarten würden - string -> IContext -> string, was lautet " Rendernimmt eine Zeichenfolge, dann eine IContextund erzeugt eine Zeichenfolge".

    Gibt es eine Möglichkeit, ein Mitglied dazu zu bringen, sich wie die Let-Bindung zu verhalten? Dies verursacht Probleme bei der Verwendung dieses Members aus C#, da die Signatur zu wird Render(string, FastFunc<IContext, string>), was nicht übermäßig verwendbar ist.


    Lösung des Problems

    If you want to expose to C#, you should write it tupled style:

    > type Foo =
    - member this.Bar (param1, param2) = param1 + param2;;
    type Foo =
    class
    member Bar: param1:int * param2:int -> int
    end

    Dadurch wird eine normale Methode im.NET-Stil verfügbar gemacht.

    Wie gehe ich mit Activity.onActivityResult() mit Jetpack Compose um?

    Ich versuche, Anmeldehinweise in meiner Android-App mit Jetpack Compose zu implementieren, aber diese API erfordert eine Activity, um zu funktionieren.

    fun showPhoneNumberHint(activity: Activity) {
    val hintRequest: HintRequest = HintRequest.Builder()
    .setPhoneNumberIdentifierSupported(true)
    .build()
    val intent = Auth.CredentialsApi.getHintPickerIntent(apiClient, hintRequest)
    val requestCode = 12345
    try {
    startIntentSenderForResult(activity, intent.intentSender, requestCode, null, 0, 0, 0, null)
    } catch (exception: SendIntentException) {
    // Error handling
    }
    }

    Ich schätze also, dass ich das Aktivitätsobjekt ganz nach unten an das Composable weitergeben muss, wo es benötigt wird, was nicht sehr sauber erscheint, aber es sollte funktionieren.

    Aber jetzt wird das Ergebnis des Hinweises in den Aktivitäten empfangen, onActivityResult()und ich bin mir nicht sicher, wie ich es richtig an das Composable zurückbekomme, wo es benötigt wird.

    Gibt es einen sauberen/standardmäßigen/alternativen Weg, dies zu tun? Am liebsten würde ich all diese Logik einfach im Composable enthalten lassen.


    Lösung des Problems

    Activity.onActivityResult()ist veraltet und Sie sollten es auch ohne compose nicht verwenden. Sie sollten die Aktivitätsergebnis-APIs verwenden, die in AndroidX Activity and Fragment eingeführt wurden.

    Die Aktivitätsergebnis-APIs stellen eine registerForActivityResult()API zum Registrieren des Ergebnisrückrufs bereit. registerForActivityResult()nimmt ein ActivityResultContractund ein ActivityResultCallbackund gibt ein zurück ActivityResultLauncher, mit dem Sie die andere Aktivität starten.

    Beispiel ohne compose:

    val getContent = registerForActivityResult(GetContent()) { uri: Uri? ->
    // Handle the returned Uri
    }
    override fun onCreate(savedInstanceState: Bundle?) {
    //...
    val selectButton = findViewById<Button>(R.id.select_button)
    selectButton.setOnClickListener {
    // Pass in the mime type you'd like to allow the user to select
    // as the input
    getContent.launch("image/*")
    }
    }

    Verwenden Sie in compose rememberLauncherForActivityResult()anstelle von registerForActivityResult:

    val result = remember { mutableStateOf<Bitmap?>(null) }
    val launcher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) {
    result.value = it
    }
    Button(onClick = { launcher.launch() }) {
    Text(text = "Take a picture")
    }
    result.value?.let { image ->
    Image(image.asImageBitmap(), null, modifier = Modifier.fillMaxWidth())
    }

    Das Problem mit der API, die Sie verwenden möchten, ist, dass sie die Verwendung von onActivityResult erfordert. Sie haben also keine andere Wahl, als es zu verwenden. Versuchen Sie, ein Problem auf GitHub zu öffnen, in dem Sie aufgefordert werden, die API zu aktualisieren.

    GetKeyDown sendet mehrere Ausgaben

    Insbesondere sendet es so viele Ausgaben, wie Objekte mit dem Code darin vorhanden sind, mit dem sie interagieren können, selbst wenn ich E drücke, wenn ich nichts anschaue. Ich wollte ein Inventarsystem erstellen, aber dies bewirkt, dass mit allen Objekten, die diesen Code haben, interagiert wird. Ich habe alle Skripte beigefügt, die ich für dieses System verwende, falls das helfen kann. Ich weiß wirklich nicht, was ich falsch gemacht habe

    der Interaktionscode:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Events;
    using System;
    public class Interactable: MonoBehaviour
    {
    public LayerMask interactableLayerMask;
    //ITEM VARIABLE
    public Item item;
    //PICK UP RADIUS
    public float radius = 4f;
    public void Interact()
    {
    Debug.Log("Interacted with " + transform.name);
    PickUp();
    }
    //PICK UP INTERACTION
    void PickUp()
    {
    Debug.Log("Picking up " + item.name);
    bool wasPickedUp = Inventory.instance.Add(item);
    if (wasPickedUp)
    Destroy(gameObject);
    }
    //INTERACTION
    void Update()
    {
    if (Input.GetKeyDown(KeyCode.E))
    {
    Debug.Log("Added item -----------------------------------------");
    RaycastHit hit;
    if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit, radius))
    {
    Interactable interactable = hit.collider.GetComponent<Interactable>();
    if (interactable!= null)
    {
    Interact();
    }
    } else
    {
    Debug.Log("Nothing");
    }
    }
    }
    }

    der Inventarcode:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    public class Inventory: MonoBehaviour
    {
    #region Singleton
    public static Inventory instance;
    void Awake()
    {
    if (instance!= null)
    {
    Debug.LogWarning("More than one instance of Inventory found!");
    return;
    }
    instance = this;
    }

    Zeichnen Sie mit dem Modifikator in Jetpack Compose eine Form über den Text

    Ich versuche, einen Text mit Jetpack Compose zu verschleiern. Offensichtlich blurwirkt der Modifikator für diesen Anwendungsfall Wunder, wenn Sie Android 12 haben.

    Meine Alternative für Geräte mit einer niedrigeren API-Version wäre, einfach ein Rechteck mit schwarzer Farbe über den Text zu ziehen. graphicsLayerIch nahm an, dass dies mit vorhandenen Modifikatoren wie oder relativ einfach wäre, drawBehindaber ich konnte es nicht herausfinden und mir fehlen im Moment die Ideen...

    Mein aktueller zusammensetzbarer Text sieht so aus:

    Text(
    modifier = if (blurText) {
    Modifier.blur(16.dp, BlurredEdgeTreatment.Unbounded)
    } else {
    Modifier
    },
    text = textToObfuscate,
    fontFamily = latoFontFamily,
    fontWeight = FontWeight.W700,
    fontSize = 16.sp,
    color = black,
    )

    Ich könnte den Text in eine Box packen und eine weitere Box darin haben, um über den Text zu zeichnen, aber das scheint einfach nutzlos und mehr Arbeit zu sein, als notwendig sein sollte.

    Wenn jemand eine Idee hat, wie man dies einfach mit einer Modifier-Erweiterung erreichen kann, wäre das großartig!


    Lösung des Problems

    You can use Modifier.drawWithContent as

    Text(
    modifier = if (blurText) {
    Modifier.blur(16.dp, BlurredEdgeTreatment.Unbounded)
    } else {
    Modifier.drawWithContent {
    drawContent()
    drawRect(Color.Black)
    }
    },
    text = "textToObfuscate",
    fontWeight = FontWeight.W700,
    fontSize = 16.sp,
    )

    Problem, wenn ich mich in Tkinter und Selenium bei Facebook anmelde und die Textfelder für Benutzer und Passwort verwende

    Ich möchte mich bei Facebook anmelden, nachdem ich Benutzername und Passwort in einem tkinter-Fenster eingegeben habe. Das Problem ist, dass, nachdem ich den Benutzernamen und das Passwort eingegeben habe, wenn ich auf die Schaltfläche „Anmelden" klicke, die Facebook-Seite geöffnet wird, aber ohne mich anzumelden. Vielleicht ist es ein Problem mit driver.find_element. Wie löst man? HINWEIS: Bitte ändern Sie nicht die Art und Weise, wie ich mich mit Firefox verbinde.

    import tkinter as tk  
    from tkinter import ttk
    from tkinter import *
    from time import sleep
    from selenium.webdriver import Firefox
    from selenium.webdriver.firefox.service import Service
    from selenium.webdriver.firefox.options import Options
    from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
    import os
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium import webdriver
    from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
    root = tk.Tk()
    root.title("Login")
    root.geometry('630x500')
    topbar = tk.Frame(root, bg='#3c5999', height=42)
    topbar.pack(fill='x')
    #TEXTBOX
    label_email = Label(root, text="email", bg='#3c5999', foreground="white")
    label_email.place(x=2, y = 10)
    email = tk.Entry(root)
    email.place(x=50, y = 9)
    label_password = Label(root, text="password", bg='#3c5999', foreground="white")
    label_password.place(x=260, y = 10)
    password = tk.Entry(root)
    password.place(x=335, y = 9)
    def login():
    #Access Facebook
    profile_path = '/usr/bin/firefox/firefox'
    #/usr/bin/firefox/firefox
    options=Options()
    options.set_preference('profile', profile_path)
    options.set_preference('network.proxy.type', 4)
    options.set_preference('network.proxy.socks', '127.0.0.1')
    options.set_preference('network.proxy.socks_port', 9050)
    options.set_preference("network.proxy.socks_remote_dns", False)
    service = Service('/home/jass/bin/geckodriver')
    driver = Firefox(service=service, options=options)
    driver.get("http://www.facebook.com")
    WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "accept_only_essential_button"))).click()
    username_box = driver.find_element('email')
    username_box.send_keys(email)

    password_box = driver.find_element('pass')
    password_box.send_keys(password)

    login_box = driver.find_element('loginbutton')
    login_box.click()
    button = Button(root, text="Login", bg='white', foreground='black', width=7, command=login)
    button.place(x=530, y=5)
    root.mainloop()


    Lösung des Problems

    Wenn Sie Code in der Konsole ausführen würden, sollten Sie Fehler sehen, die Ihnen helfen sollten, das Problem zu erkennen.

    Du hast zwei Fehler.


    • Sie verwenden find_element()es falsch - es muss find_element(By.ID, 'email')eventuell älter sein find_element_by_id('email')(dasselbe gilt für passundbutton


    • you have to use .get() to get text from Entry - so you need email.get() and password.get()



     username_box = driver.find_element(By.ID, 'email')
    username_box.send_keys(email.get())

    password_box = driver.find_element(By.ID, 'pass')
    password_box.send_keys(password.get())

    login_box = driver.find_element(By.ID, 'loginbutton')
    login_box.click()

    Es gibt auch ein anderes Problem (zumindest auf meinem Computer) - beim Start zeigt es eine Meldung über Cookies und ich muss es schließen, weil es sich versteckt loginbuttonund Selen nicht darauf klicken kann.

    BEARBEITEN:

    Um die Cookie-Nachricht zu schließen, müssen Sie den richtigen CSS-Selektor verwenden

    (By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]')

    und Sie müssen länger als 1 Sekunde warten.

    Vollständiger Arbeitscode:

    import os
    import tkinter as tk # PEP8: `import *` is not preferred
    from tkinter import ttk
    from selenium.webdriver import Firefox
    from selenium.webdriver.firefox.service import Service
    from selenium.webdriver.firefox.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # --- functions --- # PEP8: all functions after imports
    def login():
    profile_path = '/usr/bin/firefox/firefox'
    options = Options()
    options.set_preference('profile', profile_path)
    options.set_preference('network.proxy.type', 4)
    options.set_preference('network.proxy.socks', '127.0.0.1')
    options.set_preference('network.proxy.socks_port', 9050)
    options.set_preference("network.proxy.socks_remote_dns", False)
    service = Service('/home/jass/bin/geckodriver')
    driver = Firefox(service=service, options=options)
    driver.get("https://www.facebook.com") # https instead of http
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-cookiebanner="accept_only_essential_button"]'))).click()
    username_box = driver.find_element(By.ID, 'email')
    username_box.send_keys(email.get())

    password_box = driver.find_element(By.ID, 'pass')
    password_box.send_keys(password.get())

    login_box = driver.find_element(By.ID, 'loginbutton')
    login_box.click()
    # --- main ---
    root = tk.Tk()
    root.title("Login")
    root.geometry('630x500')
    topbar = tk.Frame(root, bg='#3c5999', height=42)
    topbar.pack(fill='x')
    label_email = tk.Label(topbar, text="email", bg='#3c5999', foreground="white")
    label_email.place(x=2, y=10)
    email = tk.Entry(topbar)
    email.place(x=50, y=9)
    label_password = tk.Label(topbar, text="password", bg='#3c5999', foreground="white")
    label_password.place(x=260, y=10)
    password = tk.Entry(topbar)
    password.place(x=335, y=9)
    button = tk.Button(topbar, text="Login", bg='white', foreground='black', width=7, command=login)
    button.place(x=530, y=5)
    root.mainloop()

    PEP 8 – Style Guide für Python-Code

    Ganzzahlen aus einer Zeichenfolge mit Wörtern in Java abrufen

    Im Moment habe ich eine Saiteneingabe nach dem Vorbild von "Stern Brenda 90 86 45". Ich versuche, einen Weg zu finden, 90 86 und 45 daraus zu bekommen und sie als Ints den Tests 3, 2 und 1 zuzuweisen, um einen Durchschnitt von ihnen zu berechnen.

     while ((line = reader.readLine())!= null) {
    test3 = line.indexOf(-2, -1);
    test2 = line.indexOf(-5, -4);
    test1 = line.indexOf(-8, -7);

    Dies gibt für jeden Test einen Wert von -1 zurück (ich habe versucht, einen regulären Ausdruck zu verwenden, um bei Index -2 zu beginnen und zu gehen, bis eine andere Ganzzahl gefunden wird. Der Versuch, eine zweistellige Ganzzahl zu erhalten (im Gegensatz zu dem Versuch, nur zu bekommen etwas wie 5 oder 6) ist wirklich das, was mich abwirft.Ist die Verwendung der.indexOf-Methode der beste Weg, um diese Zahlen aus der Zeichenfolge zu bekommen?Wenn ja, wie verwende ich sie falsch?


    Lösung des Problems

    Sie könnten einen regulären Ausdruck verwenden, um die Zeichenfolge zu analysieren. Dies berechnet nur den Durchschnitt. Sie können die einzelnen Werte auch nach eigenem Ermessen zuweisen.

    String s = "Stern Brenda 90 86 45";
    double sum = 0;


    • \\b- eine Wortgrenze

    • \\d+- eine oder mehrere Ziffern

    • ()- eine Capture-Gruppe

    • passend auf die Saites


    Matcher m = Pattern.compile("\\b(\\d+)\\b").matcher(s);
    int count = 0;


    • Solange find()true zurückgegeben wird, haben Sie eine Übereinstimmung

    • Konvertieren Sie also group(1)in ein Double, addieren Sie zur Summe und erhöhen Sie die Zählung.


    while (m.find()) {
    sum+= Double.parseDouble(m.group(1));
    count++;
    }

    Wenn Sie fertig sind, berechnen Sie den Durchschnitt.

    System.out.println(sum + " " + count); // just for demo purposes.
    if (count > 0) { //just in case
    double avg = sum/count;
    System.out.println("Avg = " + avg);
    }

    prints

    221.0 3
    Avg = 73.66666666666667

    Sehen Sie sich die Pattern -Klasse für weitere Details an.

    Formatting the final answer may be desirable. See System.out.printf

    Freitag, 29. April 2022

    Debuggen von C++-STL-Containern in Windbg

    Windbg-Fans behaupten, dass es ziemlich mächtig ist, und ich neige dazu, dem zuzustimmen. Aber wenn es um das Debuggen von STL-Containern geht, stecke ich immer fest. Wenn sich die Variable auf dem Stack befindet, findet die !stlErweiterung sie manchmal heraus, aber wenn sich ein Container mit einem komplexen Typ (z. B. std::vector<TemplateField, std::allocator<TemplateField> >) auf dem Heap befindet oder Teil einer anderen Struktur ist, weiß ich einfach nicht, wie ich seinen Inhalt anzeigen soll.

    Schätzen Sie alle Tipps, Hinweise.


    Lösung des Problems

    Ich finde die Debugger-Unterstützung für STL-Datentypen oft unzureichend. Aus diesem Grund verwende ich zunehmend Logging Frameworks und Logging Statements. Früher dachte ich, dass diese für Leute sind, die keinen Debugger verwenden können, aber jetzt erkenne ich, dass sie einen echten Wert bieten. Sie ermöglichen es Ihnen, portables Debugging-Wissen in Ihren Code einzubetten und es zusammen mit dem Code zu pflegen. Im Gegensatz dazu ist die Arbeit, die Sie im Debugger ausführen, normalerweise kurzlebig.

    Ich versuche, eine Schaltfläche zum Speichern in einem vorhandenen Formular zu erstellen. Die Daten, die gespeichert werden müssen, werden in eine Tabelle verschoben, die sich auf einem anderen Blatt befindet

    Ich versuche, eine Schaltfläche "Speichern" in einem vorhandenen Formular auf VBA zu erstellen. Die zu speichernden Daten gehen in eine Tabelle, die sich auf einem anderen Blatt befindet, das eine Tabelle enthält. Ich bin mir nicht sicher, warum mein Code nicht funktioniert. Hat jemand eine Ahnung, was ich falsch mache?

    Private Sub BtnGuardar_Click()
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim newrow As ListRow

    Set ws = ThisWorkbook.Sheets("RAW_Data")
    Set tbl = ws.ListObjects("RawData")
    If FechaContable = "" Then
    MsgBox ("Debe ingresar la FechaContable"), vbExclamation, "Cifras"
    Else
    If Monto = "" Then
    MsgBox ("Debe ingresar monto"), vbExclamation, "Cifras"
    Else
    If cboFormaPago = "" Then
    MsgBox ("Debe ingresar forma de pago"), vbExclamation, "Cifras"

    Set newrow = tbl.ListRows.Add
    With newrow

    .Range(1) = RegistroID
    .Range(2) = Monto
    .Range(3) = FechaContable
    .Range(4) = Mes
    .Range(5) = Ano
    .Range(6) = "INGRESOS"
    .Range(7) = cboFormaPago
    .Range(8) = cboDetalles
    .Range(9) = ObservacionesReg
    .Range(15) = Format(Date, "DD/MM/YYYY")
    .Range(16) = Application.UserName
    End With
    ActiveWorkbook.Save
    Call limpiar_campo
    MsgBox ("Registros Ingresados con Exito"), vbInformation, "CIFRAS"
    End If
    End If
    End If
    End Sub


    Lösung des Problems

    Dies kann relevant sein - https://stackoverflow.com/a/40442874/478884

    Ich konnte einen Absturz mit einem Benutzerformular reproduzieren, das eine Listbox enthielt, deren RowSourceSatz auf eine der Spalten in einem Listenobjekt festgelegt war: Beim Hinzufügen einer neuen Zeile stürzte Excel nach ein paar Sekunden ab.

    Der verlinkte Beitrag hat die Lösung: Trennen Sie die Verknüpfung der Steuerelemente, RowSourcebevor Sie die Zeile hinzufügen, und verknüpfen Sie sie dann erneut.

    Rufen Sie Protokolle von Kubectl POD zwischen bestimmten Bereichszeiten und -stunden ab

    Ich möchte die Protokolle eines bestimmten Datums- und Zeitbereichs abrufen...

    Beispiel

    Aus2022-04-13 09:43:09

    Zu2022-04-13 10:51:21

    kubectl logs -f -n the-namespace the-pod --since-time???

    Gibt es eine Methode für so etwas wie until-time?

    Wie überprüfen Sie die Protokolle zum angegebenen Datum und zur angegebenen Uhrzeit?

    Wenn es mehrere Alternativen gibt, bitte hier eintragen...

    Danke im Voraus.


    Lösung des Problems

    Ich bin mir nicht sicher, ob es nativ möglich ist, kubectl zu verwenden. Sie können es awkwie folgt verwenden:

    kubectl logs <pod-name> -n <namespace> --timestamps |awk '/<start-time>/,/<end-time>/'

    Beispiel:

     kubectl logs coredns-96cc4f57d-5qn94 -n kube-system --timestamps |awk '/2022-04-13T18:51:27/,/2022-04-13T18:57:12/'
    2022-04-13T18:51:27.622412935Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:52:02.070172737Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:52:36.517823872Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:53:10.965847767Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:53:45.413690095Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:54:19.861341989Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:54:54.308750908Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:55:28.756958499Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:56:03.204435238Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:56:37.674301446Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server
    2022-04-13T18:57:12.100152757Z [WARNING] No files matching import glob pattern: /etc/coredns/custom/*.server

    Wie konvertiere ich von `func() *int` in `func() interface{}`?

    Ich hätte gerne so etwas wie die folgende Funktion:

    func decorateFn(fn func() interface{}) interface{} {
    decorate()
    return fn()
    }
    func decorateFnInt(fn func() *int) *int {
    return decorateFn(fn).(*int)
    }

    Verwenden decorateFn((func() interface{})(fn)).(*int)funktioniert nicht. Ist eine Umrechnung func() *intmöglich func() interface{}? Wenn das so ist, wie?


    Lösung des Problems

    Mit go 1.18können Sie Generics verwenden, um dies zu erreichen - die Sicherheit des Kompilierzeittyps und keine Typzusicherungen zur Laufzeit gewährleisten:

    func decorateFn[T any](fn func() T) T {
    decorate()
    return fn()
    }
    func decorateFnInt(fn func() *int) *int {
    return decorateFn(fn)
    }

    Die Typbeschränkung der Funktion decorateFnkann zur Kompilierzeit durch Untersuchen fndes Typs von abgeleitet werden.

    https://go.dev/play/p/AAByiBFRQch

    SCSS-Medienabfrage mit Interpolation

    Ich kann die Überschrift der Medienabfrage nicht als Interpolation verwenden. Bei der Verwendung wie folgt wird ein Fehler ausgegeben

    $token-screen-md: "@media only screen and (min-width: 48rem)";
    #{$token-screen-md} {
    display: table-row;
    min-width: 100%;
    }

    Könnte mir bitte jemand helfen, das zu lösen?

    "Modulerstellung fehlgeschlagen (aus./node_modules/sass-loader/dist/cjs.js): SassError: erwarteter Selektor. @media only screen and (min-width: 48rem){"


    Lösung des Problems

    $mobile: "only screen and (max-width: 767px)"; 
    $tablet: "only screen and (min-width: 768px)";
    $desktop: "only screen and (min-width: 1025px)";
    @media #{$mobile} {
    /* my styles for mobile displays */
    }`

    Entnommen aus Wie zielen Sie mit SASS-Interpolation auf zwei Medienabfragen ab?

    Suchen Sie nach einer alternativen Ergebnisprojektion, die auf Mongodb 4.2.x funktioniert

    Gemäß meiner letzten Frage ( Anzahl der Dokumente nach mehreren Bereichen abfragen, die den Beginn/das Ende des Bereichs mit der Anzahl der übereinstimmenden Elemente zurückgeben ) habe ich eine Abfrage erstellt, um die Anzahl der Dokumente in mehreren, möglicherweise überlappenden Datumsbereichen zu überprüfen.

    Die Abfrage funktioniert auf MongoDB 4.4, aber ich muss sie auch auf 4.2 ausführen. Auf MongoDB 4.2 erhalte ich die folgende Fehlermeldung:

    Mongo Server error (MongoCommandException): Command failed with error 168 (InvalidPipelineOperator): 'Unrecognized expression '$first'' on server localhost:27017. 
    The full response is:
    {
    "ok": 0.0,
    "errmsg": "Unrecognized expression '$first'",
    "code": 168.0,
    "codeName": "InvalidPipelineOperator"
    }

    Wie würden Sie die Aggregationsprojektion schreiben, um die gleiche Ergebnisstruktur zu erreichen. Hier ist der vollständige Code mit Dateneinrichtung

    db.createCollection("object_location_tracking");
    db.getCollection("object_location_tracking").insertMany([
    {
    _id: "1",
    locationId: "locationA",
    objectId: "objectA",
    timestamp: ISODate("2020-01-01T00:00:00Z")
    },
    {
    _id: "2",
    locationId: "locationB",
    objectId: "objectA",
    timestamp: ISODate("2020-01-01T00:00:00Z")
    },
    {
    _id: "3",
    locationId: "locationA",
    objectId: "objectB",
    timestamp: ISODate("2019-01-01T00:00:00Z")
    },
    {
    _id: "4",
    locationId: "locationB",
    objectId: "objectB",
    timestamp: ISODate("2020-01-01T00:00:00Z")
    }
    ]);
    db.getCollection("object_location_tracking").aggregate([
    {$facet: {
    "first_bucket_id": [
    {$match: {"objectId":"objectA",
    "locationId":"locationA",
    "timestamp": {$gte: new ISODate('2020-01-01'),
    $lt: new ISODate('2020-12-31')}
    }},
    {$count: "N"}
    ],
    "second_bucket_id": [
    {$match: {"objectId":"objectA",
    "locationId":"locationA",
    "timestamp": {$gte: new ISODate('2020-01-01'),
    $lt: new ISODate('2022-12-31')}
    }},
    {$count: "N"}
    ],
    "third_bucket_id": [
    {$match: {"objectId":"objectA",
    "locationId":"locationB",
    "timestamp": {$gte: new ISODate('2022-01-01'),
    $lt: new ISODate('2022-12-31')}
    }},
    {$count: "N"}
    ]
    }},
    {
    $set: {
    first_bucket_id: { $first: "$first_bucket_id.N"},
    second_bucket_id: { $first: "$second_bucket_id.N"},
    third_bucket_id: { $first: "$third_bucket_id.N"}
    }
    }
    , {
    $project: {
    first_bucket_id: 1,
    second_bucket_id: 1,
    third_bucket_id: 1

    }
    }
    ]);


    Lösung des Problems

    Sie verwenden das erste Array-Element, das, wie Sie sehen, ein neuer Operator ist, der für Version 4.4 hinzugefügt wurde

    Zum Glück für Sie ist dies recht einfach zu überwinden, indem Sie einfach $arrayElemAt wie folgt verwenden:

    {
    $set: {
    first_bucket_id: {$arrayElemAt: ["$first_bucket_id.N", 0]},
    second_bucket_id: {$arrayElemAt: ["$second_bucket_id.N", 0]},
    third_bucket_id: {$arrayElemAt: ["$third_bucket_id.N", 0]}
    }
    }

    Warum erhält der Bibliotheksname eine zusätzliche 0 im Namen?

    Ich habe dieses winzige Qt-Projekt mit einer Projektdatei wie dieser:

    TEMPLATE = lib
    TARGET = record32
    VERSION = 0.0.1
    DEPENDPATH +=.
    INCLUDEPATH +=.
    CONFIG += shared
    SOURCES += recorder.cpp
    HEADERS += recorder.h

    Wenn ich eine Bibliothek daraus kompiliere qmake && nmake, führt dies zu Dateien

    record32.obj
    record320.lib
    record320.dll
    ...

    Warum wird diese zusätzliche 0 zu den lib- und dll-Namen hinzugefügt?

    Die generierten Makefiles scheinen es nicht anzuhängen, sondern nehmen es einfach an, Makefile.Releasedarin heißt es nur:

    ####### Files
    SOURCES = recorder.cpp release\moc_recorder.cpp
    OBJECTS = release\recorder.obj release\moc_recorder.obj
    DIST =
    QMAKE_TARGET = recorder
    DESTDIR = release\ #avoid trailing-slash linebreak
    TARGET = record320.dll
    DESTDIR_TARGET = release\record320.dll

    Wie kann ich das verhindern und meine Bibliotheken nach Belieben benennen?

    (Beachten Sie, dass das manuelle Reparieren von makefile.release keine akzeptable Lösung ist.)


    Lösung des Problems

    Es stammt aus dem ersten Teil von VERSION. Das "lib" TEMPLATE fügt es hinzu.

    IMO ist es eine gute Idee, es in den Bibliotheksnamen aufzunehmen, da es die berüchtigte "DLL-Hölle" vermeidet, die unter Windows passiert, wo diese Konvention nicht konsequent befolgt wird... Indem die Bibliotheksdateien so benannt werden, dass sie die Hauptversionsnummer enthalten, können Benutzer dies tun mehrere Versionen installiert haben und die Programme zur Laufzeit die richtigen Versionen verwenden. Die DLL-Version muss nicht unbedingt mit der gesamten Release-Version des Projekts übereinstimmen. Unter Linux und OSX werden die Versionen an den Dateinamen angehängt (zB librecorder.so.0.0.1)

    [Wenn ich Visual C++ verwende, füge ich auch immer ein Tag hinzu, das angibt, welche Version von Visual CI verwendet wurde, da Code, der von den verschiedenen Versionen generiert wurde, ebenfalls weitgehend inkompatibel ist.]

    Vielleicht können Sie die Definition von VERSION einfach weglassen, um dieses Verhalten zu deaktivieren, aber ich kann das im Moment nicht für Windows überprüfen (unter Linux, wo gemeinsam genutzte Bibliotheken immer Versionsnummern haben, wird nur Version 1.0.0 angenommen.)

    Nextjs-Build schlägt aufgrund von jsonwebtoken in _middleware.ts fehl

    Würde mich über Hilfe bei einer Vercel-Bereitstellung freuen. Ich habe eine _middleware.ts-Datei erstellt, die ein JWT überprüft, das ein Benutzer in seinem Cookie hat.

    import { NextResponse } from 'next/server'
    import type { NextRequest } from 'next/server'
    import { JwtPayload, verify } from 'jsonwebtoken'
    export async function middleware(req: NextRequest) {
    let response = NextResponse.next()
    const url = req.nextUrl.clone()
    const token = req.cookies['allow-list']
    if (!token || token === 'deleted') {
    return response
    }
    try {
    const decodedToken = verify(
    token,
    process.env.TOKEN_SECRET as string
    ) as JwtPayload
    } catch (e) {}
    return response
    }

    Wenn ich jedoch versuche, mein Projekt zu erstellen, erhalte ich deshalb die folgende Fehlermeldung: „Dynamische Codeauswertung (z. B. ‚eval', ‚neue Funktion') ist in Middleware-Seiten/_middleware nicht zulässig". Gibt es eine Möglichkeit, dies zu umgehen? Es funktioniert, wenn ich es lokal ausführe.

    [22:59:29.409] Cloning github.com/dimitriborgers/test (Branch: master, Commit: efc1977)
    [22:59:30.051] Cloning completed: 642.161ms
    [22:59:30.427] Installing build runtime...
    [22:59:34.350] Build runtime installed: 3.924s
    [22:59:35.048] Looking up build cache...
    [22:59:35.297] Build Cache not found
    [22:59:35.503] Installing dependencies...
    [22:59:35.507] Detected `package-lock.json` generated by npm 7...
    [22:59:54.367]
    [22:59:54.367] added 519 packages in 19s
    [22:59:54.367]
    [22:59:54.367] 97 packages are looking for funding
    [22:59:54.367] run `npm fund` for details
    [22:59:54.386] Detected Next.js version: 12.1.0
    [22:59:54.392] Detected `package-lock.json` generated by npm 7...
    [22:59:54.392] Running "npm run build"
    [22:59:54.673]
    [22:59:54.673] > build
    [22:59:54.673] > next build
    [22:59:54.673]
    [22:59:55.312] Attention: Next.js now collects completely anonymous telemetry regarding usage.
    [22:59:55.312] This information is used to shape Next.js' roadmap and prioritize features.
    [22:59:55.312] You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
    [22:59:55.312] https://nextjs.org/telemetry
    [22:59:55.313]
    [22:59:55.351] info - Checking validity of types...
    [22:59:58.776] warn - No ESLint configuration detected. Run next lint to begin setup
    [22:59:58.781] info - Creating an optimized production build...
    [22:59:58.786] warn - using beta Middleware (not covered by semver) - https://nextjs.org/docs/messages/beta-middleware
    [23:00:22.847] Failed to compile.
    [23:00:22.847]
    [23:00:22.847]./node_modules/function-bind/implementation.js
    [23:00:22.847] Dynamic Code Evaluation (e. g. 'eval', 'new Function') not allowed in Middleware pages/_middleware
    [23:00:22.848]
    [23:00:22.848] Import trace for requested module:
    [23:00:22.848]./node_modules/function-bind/index.js
    [23:00:22.848]./node_modules/call-bind/index.js
    [23:00:22.848]./node_modules/call-bind/callBound.js
    [23:00:22.848]./node_modules/which-typed-array/index.js
    [23:00:22.848]./node_modules/util/support/types.js
    [23:00:22.848]./node_modules/util/util.js
    [23:00:22.848]./node_modules/jws/lib/sign-stream.js
    [23:00:22.849]./node_modules/jws/index.js
    [23:00:22.849]./node_modules/jsonwebtoken/decode.js
    [23:00:22.849]./node_modules/jsonwebtoken/index.js
    [23:00:22.849]./pages/_middleware.ts
    [23:00:22.849]
    [23:00:22.849]./node_modules/get-intrinsic/index.js
    [23:00:22.849] Dynamic Code Evaluation (e. g. 'eval', 'new Function') not allowed in Middleware pages/_middleware
    [23:00:22.849]
    [23:00:22.849] Import trace for requested module:
    [23:00:22.849]./node_modules/call-bind/callBound.js
    [23:00:22.849]./node_modules/which-typed-array/index.js
    [23:00:22.849]./node_modules/util/support/types.js
    [23:00:22.849]./node_modules/util/util.js
    [23:00:22.849]./node_modules/jws/lib/sign-stream.js
    [23:00:22.849]./node_modules/jws/index.js
    [23:00:22.850]./node_modules/jsonwebtoken/decode.js
    [23:00:22.850]./node_modules/jsonwebtoken/index.js
    [23:00:22.850]./pages/_middleware.ts
    [23:00:22.850]
    [23:00:22.850]./node_modules/has/src/index.js
    [23:00:22.850] Dynamic Code Evaluation (e. g. 'eval', 'new Function') not allowed in Middleware pages/_middleware
    [23:00:22.850]
    [23:00:22.850] Import trace for requested module:
    [23:00:22.850]./node_modules/get-intrinsic/index.js
    [23:00:22.850]./node_modules/call-bind/callBound.js
    [23:00:22.850]./node_modules/which-typed-array/index.js
    [23:00:22.850]./node_modules/util/support/types.js
    [23:00:22.850]./node_modules/util/util.js
    [23:00:22.850]./node_modules/jws/lib/sign-stream.js
    [23:00:22.850]./node_modules/jws/index.js
    [23:00:22.850]./node_modules/jsonwebtoken/decode.js
    [23:00:22.851]./node_modules/jsonwebtoken/index.js
    [23:00:22.851]./pages/_middleware.ts
    [23:00:22.851]
    [23:00:22.851]./node_modules/is-generator-function/index.js
    [23:00:22.851] Dynamic Code Evaluation (e. g. 'eval', 'new Function') not allowed in Middleware pages/_middleware
    [23:00:22.851]
    [23:00:22.851] Import trace for requested module:
    [23:00:22.851]./node_modules/util/support/types.js
    [23:00:22.852]./node_modules/util/util.js
    [23:00:22.852]./node_modules/jws/lib/sign-stream.js
    [23:00:22.852]./node_modules/jws/index.js
    [23:00:22.852]./node_modules/jsonwebtoken/decode.js
    [23:00:22.852]./node_modules/jsonwebtoken/index.js
    [23:00:22.852]./pages/_middleware.ts
    [23:00:22.853]
    [23:00:22.853]./node_modules/next/dist/compiled/vm-browserify/index.js
    [23:00:22.854] Dynamic Code Evaluation (e. g. 'eval', 'new Function') not allowed in Middleware pages/_middleware
    [23:00:22.854]
    [23:00:22.854] Import trace for requested module:
    [23:00:22.854]./node_modules/jwa/index.js
    [23:00:22.854]./node_modules/jws/lib/sign-stream.js
    [23:00:22.854]./node_modules/jws/index.js
    [23:00:22.854]./node_modules/jsonwebtoken/decode.js
    [23:00:22.855]./node_modules/jsonwebtoken/index.js
    [23:00:22.855]./pages/_middleware.ts
    [23:00:22.855]
    [23:00:22.855]
    [23:00:22.855] > Build failed because of webpack errors
    [23:00:22.886] Error: Command "npm run build" exited with 1


    Lösung des Problems

    Die Verwendung der Bibliothek @tsndr/cloudflare-worker-jwt anstelle von jsonwebtoken funktioniert.

    Festlegen von sourceTime-Metadaten in Azure Digital Twins

    Ich versuche, Java SDK zu verwenden, um sourceTimeDigital Twin wie hier beschrieben einzurichten: https://docs.microsoft.com/en-us/azure/digital-twins/how-to-manage-twin#update-a-propertys-sourcetime. Aber nach Upload-Werten bekomme ich 400 mit Kommentar

    "Cannot patch property metadata 'sourceTime'. Please provide a valid patch document.

    Ich habe Berechtigungen für ADT, es gibt kein Problem.

    Zur Einstellung sourceTimeverwende ich folgenden Code:

    JsonPatchDocument jsonPatchDocument = new JsonPatchDocument();
    jsonPatchDocument = jsonPatchDocument.appendReplace("/$metadata/pitch/sourceTime", "2022-04-11T13:17:53.7648958Z");
    jsonPatchDocument = jsonPatchDocument.appendReplace("/pitch", 10.5);
    digitalTwinsClient.updateDigitalTwin("123", jsonPatchDocument);

    Lib-Version: azure-digitaltwins-core:1.2.1

    Was mache ich falsch?


    Lösung des Problems

    Dies funktioniert mit der neueren Version von API/SDKs, wie in der Dokumentation erwähnt. Bitte verwenden Sie - 1.3.0-beta.1.

    Django get_or_create kann das Feld nicht festlegen, wenn es mit iexact verwendet wird

    Ich möchte name__iexactwith verwenden get_or_create, um nach Möglichkeit Doppelungen in vom Benutzer eingegebenen Feldern zu vermeiden.

    Mein Provider-Modell hat ein Namensfeld, das ich in verwende get_or_create.

    Die Suche funktioniert gut, aber wenn Sie zum ersten Mal eine Instanz erstellen, wie im p1/Timber-Beispiel unten (der name

    schlägt fehl:

    >>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber")
    >>> p1, c1
    (<Provider: >, True)
    >>> p1.name
    u''

    Funktioniert hier wie erwartet:

    >>> p2, c2 = Provider.objects.get_or_create(name="Cedar")
    >>> p2.name, c2
    ('Cedar', True)
    >>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar")
    >>> p3, c3
    (<Provider: Cedar>, False)
    >>> Provider.objects.get_or_create(name__iexact="cedar")
    (<Provider: Cedar>, False)

    Ist es __iexactmit dem Erstellungsteil von inkompatibel get_or_create, ist dies das erwartete Verhalten (und warum) oder bin ich auf einen Django-Fehler gestoßen?


    Lösung des Problems

    Was Sie sehen, ist das richtige Verhalten.

    get_or_createist eine Abkürzung für 'Get and return the object matching' kwargs, wenn es nicht existiert, erstellen Sie es mit defaults'. Ihre Suche sucht nach einem Objekt, bei dem nameeine Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung mit 'cedar'. Dieses Objekt existiert, also wird es zurückgegeben. Nicht mehr, nicht weniger.

    Wenn es jetzt keine Übereinstimmung gibt, hat Stéphane Recht, und Sie müssten nameim defaultsParameter angeben. Alle Suchvorgänge, die das Suchtrennzeichen enthalten, __werden aus den an übergebenen Parametern entfernt create().

    Entfernen Sie zwei Elemente aus der Liste, sodass sie geordnet erscheint

    Ich habe es so gemacht, dass ich die Elemente bekomme, die dazu führen, dass die Liste ungeordnet ist. Aber wie kann man sie löschen und dann die Liste ohne sie anzeigen?

    public class Main16 {
    public static void main(String[] args){
    int arr[] = { 1, 2, 3, 7, 4, 5, 9, 6};
    int n = arr.length;
    printElements(arr, n);
    }
    static void printElements(int arr[], int n)
    {
    for (int i = 1; i < n - 1; i++)
    {
    if (arr[i] > arr[i + 1])
    System.out.print(arr[i] + " ");
    }
    }

    }


    Lösung des Problems

    Wie Nexevis sagte, können Sie mit Arrays nicht wirklich tun, was Sie tun möchten. Sie haben 2 Möglichkeiten:

  • Gehen Sie den Prozess des Arbeitens mit Arrays und des Kopierens und Übertragens durch.

    1.5) Sie können auch java.util.Arrays.sort() verwenden, wenn Sie nur ein Array in der richtigen Reihenfolge haben möchten, aber es scheint, als wollten Sie sie direkt entfernen:


  • Arrays.sort(arr);

  • Verwenden Sie a List<Integer>, weil Sie nur die falschen Begriffe finden und dann remove()aus der Liste entfernen müssen. Die Länge wird automatisch angepasst. (Ich würde gerne demonstrieren, wie Sie dies tun würden, wenn Sie möchten)
  • „useViewBox“-Hook reagieren, wenn die SVG-ViewBox die ESLint-Regel „erschöpfend deps“ nicht erfüllt

    Ich versuche, einen praktischen Reaktionshaken zu erstellen, um ein SVG viewBoxan seinen Inhalt anzupassen.

    import { useState } from 'react';
    import { useEffect } from 'react';
    import { useRef } from 'react';
    // get fitted view box of svg
    export const useViewBox = () => {
    const svg = useRef();
    const [viewBox, setViewBox] = useState(undefined);
    useEffect(() => {
    // if svg not mounted yet, exit
    if (!svg.current)
    return;
    // get bbox of content in svg
    const { x, y, width, height } = svg.current.getBBox();
    // set view box to bbox, essentially fitting view to content
    setViewBox([x, y, width, height].join(' '));
    });
    return [svg, viewBox];
    };

    dann benutze es:

    const [svg, viewBox] = useViewBox();
    return <svg ref={svg} viewBox={viewBox}>... content...</svg>

    Aber ich bekomme den folgenden Eslint-Fehler:

    React Hook useEffect contains a call to 'setViewBox'. Without a list of dependencies, this can lead to an infinite chain of updates. To fix this, pass [viewBox] as a second argument to the useEffect Hook.eslint(react-hooks/exhaustive-deps)

    Ich bin bis jetzt noch nie auf eine Situation gestoßen, in der die React-Hooks-Eslint-Fehler "falsch" waren. Ich habe das Gefühl, dass dies eine vollkommen legitime Verwendung von Hooks ist. Es muss als Effekt ausgeführt werden, da es NACH dem Rendern ausgeführt werden muss, um festzustellen, ob sich der Inhalt der SVG geändert hat. Und was die Warnmeldung angeht: Dieser Code vermeidet bereits eine unendliche Renderschleife, da setState kein erneutes Rendern auslöst, es sei denn, der neue Wert unterscheidet sich vom aktuellen.

    Ich kann die Eslint-Regel deaktivieren:

    // eslint-disable-next-line react-hooks/exhaustive-deps

    Aber das scheint falsch zu sein, und ich frage mich, ob es einen einfacheren/anderen Weg gibt, dasselbe Ziel zu erreichen, das ich nicht sehe.

    Ich könnte den Aufrufer von useViewBoxeine Variable bereitstellen lassen, die in useEffectdas Abhängigkeitsarray von einfügt und ein erneutes Rendern erzwingt, aber ich möchte, dass es flexibler und einfacher zu verwenden ist.

    Oder vielleicht liegt das Problem tatsächlich in der exhaustive-depsRegel. Vielleicht sollte es setStateinnerhalb einer no-dependencies-specified zulassen, useEffectwenn es eine Bedingung vor dem erkennt setState...


    Lösung des Problems

    Okay, ich habe eine "Lösung" gefunden, inspiriert von dieser Antwort. Ich denke, es ist eine Art dumme Arbeit, aber ich nehme an, es ist besser, als die Eslint-Regel zu deaktivieren:

    import { useState } from 'react';
    import { useEffect } from 'react';
    import { useRef } from 'react';
    import { useCallback } from 'react';
    // get fitted view box of svg
    export const useViewBox = () => {
    const svg = useRef();
    const [viewBox, setViewBox] = useState(undefined);
    const getViewBox = useCallback(() => {
    // if svg not mounted yet, exit
    if (!svg.current)
    return;
    // get bbox of content in svg
    const { x, y, width, height } = svg.current.getBBox();
    // set view box to bbox, essentially fitting view to content
    setViewBox([x, y, width, height].join(' '));
    }, []);
    useEffect(() => {
    getViewBox();
    });
    return [svg, viewBox];
    };

    Erkennen, was das Zielobjekt ist, wenn NullReferenceException ausgelöst wird

    Ich bin mir sicher, dass wir alle schon einmal die wunderbar vage Ausnahme "Objektreferenz nicht auf Instanz eines Objekts gesetzt" erhalten haben. Das Identifizieren des Objekts, das das Problem darstellt, ist oft eine mühsame Aufgabe, Haltepunkte zu setzen und alle Mitglieder in jeder Anweisung zu untersuchen.

    Hat jemand irgendwelche Tricks, um das Objekt, das die Ausnahme verursacht, einfach und effizient zu identifizieren, entweder über programmgesteuerte Mittel oder auf andere Weise?

    --bearbeiten

    Es scheint, ich war vage wie die Ausnahme =). Der Punkt ist, _nicht die App debuggen zu müssen, um das fehlerhafte Objekt zu finden. Der Compiler/Laufzeit weiß, dass das Objekt zugewiesen/deklariert wurde und dass das Objekt noch nicht instanziiert wurde. Gibt es eine Möglichkeit, diese Details in einer abgefangenen Ausnahme zu extrahieren / zu identifizieren?

    @ W. Craig Trader

    Ihre Erklärung, dass dies auf ein Designproblem zurückzuführen ist, ist wahrscheinlich die beste Antwort, die ich bekommen konnte. Ich bin ziemlich zwanghaft mit defensivem Codieren und habe es geschafft, die meisten dieser Fehler loszuwerden, nachdem ich meine Gewohnheiten im Laufe der Zeit korrigiert habe. Die verbleibenden optimieren mich einfach ohne Ende und führen mich dazu, diese Frage an die Community zu stellen.

    Danke für alle Vorschläge.


    Lösung des Problems

    An dem Punkt, an dem das NRE geworfen wird, gibt es kein Zielobjekt – das ist der Punkt der Ausnahme. Sie können höchstens darauf hoffen, die Datei- und Zeilennummer abzufangen, in der die Ausnahme aufgetreten ist. Wenn Sie Probleme haben, festzustellen, welche Objektreferenz das Problem verursacht, sollten Sie Ihre Codierungsstandards überdenken, da es so klingt, als würden Sie zu viel in einer Codezeile tun.

    Eine bessere Lösung für diese Art von Problem ist Design by Contract, entweder durch eingebaute Sprachkonstrukte oder über eine Bibliothek. DbC würde vorschlagen, alle eingehenden Argumente für eine Methode auf Daten außerhalb des zulässigen Bereichs (dh: Null) vorab zu überprüfen und Ausnahmen auszulösen, da die Methode mit fehlerhaften Daten nicht funktioniert.

    [Bearbeiten, um Frage zu bearbeiten:]

    Ich denke, die NRE-Beschreibung führt Sie in die Irre. Das Problem, das die CLR hat, besteht darin, dass sie aufgefordert wurde, eine Objektreferenz zu dereferenzieren, wenn die Objektreferenz Null ist. Nehmen Sie dieses Beispielprogramm:

    public class NullPointerExample {
    public static void Main()
    {
    Object foo;
    System.Console.WriteLine( foo.ToString() );
    }
    }

    Wenn Sie dies ausführen, wird in Zeile 5 ein NRE ausgelöst, wenn versucht wurde, die Methode ToString() auf foo auszuwerten. Es gibt keine zu debuggenden Objekte, nur eine nicht initialisierte Objektreferenz (foo). Es gibt eine Klasse und eine Methode, aber kein Objekt.

    Betreff: Antwort von Chris Marasti-Georg:

    Sie sollten NRE niemals selbst auslösen – das ist eine Systemausnahme mit einer bestimmten Bedeutung: Die CLR (oder JVM) hat versucht, eine Objektreferenz auszuwerten, die nicht initialisiert wurde. Wenn Sie eine Objektreferenz vorab überprüfen, lösen Sie entweder eine Art ungültige Argumentausnahme oder eine anwendungsspezifische Ausnahme aus, aber nicht NRE, da Sie nur den nächsten Programmierer verwirren, der Ihre App warten muss.

    Wie weise ich der GLU-Modellierung in OpenGL mehrere Anzeigelisten-IDs zu?

    Ich bin neugierig, wie OpenGL mehrere Anzeigelisten-IDs zuweist.

    Aktuell habe ich:

    void MyCreateList() {
    MyListID = glGenLists(1);
    glNewList(MyListID, GL_COMPILE);
    //gluSphere(qobj, 1.0, 20, 20); //Sphere
    //gluCylinder(qobj, 1.0, 0.0, 2.0, 20, 8); //Cylinder
    gluDisk(qobj, 0.25, 1.0, 20, 3); //Disk
    //gluPartialDisk(qobj, 0.5, 1.0, 26, 13, 0, 180); //PartialDisk
    glEndList();
    }

    => ID einer Anzeigeliste.

    void MyCreateList() {
    GLuint listOne, listTwo, listThree, listFour;
    listOne = glGenLists(4);
    listTwo = listOne + 1;
    listThree = listTwo + 1;
    listFour = listThree + 1;
    glNewList(listThree, GL_COMPILE);
    gluSphere(qobj, 1.0, 20, 20); //Sphere
    gluCylinder(qobj, 1.0, 0.0, 2.0, 20, 8); //Cylinder
    gluDisk(qobj, 0.25, 1.0, 20, 3); //Disk
    gluPartialDisk(qobj, 0.5, 1.0, 26, 13, 0, 180); //PartialDisk
    glEndList();
    }

    => ID mehrerer Anzeigelisten.

    Hier ist das gewünschte Ergebnis:
    Geben Sie hier die Bildbeschreibung ein

    Wenn Sie mithilfe der Anzeigeliste nur eine ID zuweisen, gibt es kein Problem, aber wenn Sie mehr als eine ID zuweisen, funktioniert es nicht.

    Irgendwelche Ideen?


    Lösung des Problems

    Eine Anzeigeliste speichert eine Folge von OpenGL-Befehlen und -Daten in einer Einheit auf der Grafikkarte, sodass sie nach ihrer ursprünglichen Erstellung wiederholt ausgeführt werden kann, ohne dass ineffiziente Datenübertragungen zwischen CPU/RAM und GPU/VRAM mehr erforderlich sind.

    (Beachten Sie, dass Anzeigelisten in OpenGL 3.0 veraltet sind und in OpenGL 3.1 entfernt wurden, was hier bereits besprochen wurde: Warum wurden Anzeigelisten in OpenGL 3.1 abgelehnt? )

    Die vier glu*()Aufrufe in Ihrem zweiten Code-Snippet erstellen Grafik-Primitive, die nur in einer der vier generierten Anzeigelisten gespeichert werden, nämlich in listThree. In dieser Anzeigeliste werden die Kugel, der Zylinder, die Scheibe und die Teilscheibe an derselben Position platziert und überlappen sich daher. Außerdem sind die vier Anzeigelisten-ID-Variablen listOne, listTwo, listThree, listFourlokal für den Gültigkeitsbereich der Funktion MyCreateList(), sodass nach dem Funktionsaufruf nicht auf sie zugegriffen werden kann.

    Wenn das Programm das Ergebnis aus dem geposteten Screenshot generieren soll, dann wird nur ein Shape (generiert mit gluDisk()) und eine Anzeigeliste benötigt. (Warum sollten für diese Aufgabe mehrere Anzeigelisten verwendet werden?)

    Wenn dies eine pädagogische Übung ist, geht es meiner Meinung nach darum, Transformationen in eine Anzeigeliste einzufügen, um die gezeigte schiefe Scape zu erzeugen, zum Beispiel so (Disk gedehnt mit glScalef()und gedreht mit glRotatef()):

    /* $ gcc -Wall -pedantic skewed.c -o skewed -lGL -lGLU -lglut &&./skewed */
    #include <GL/glut.h>
    static GLuint _displayList = 0;
    static void _create_display_list(void)
    {
    GLUquadricObj *qobj = NULL;
    _displayList = glGenLists(1);
    qobj = gluNewQuadric();
    glNewList(_displayList, GL_COMPILE);
    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glScalef(0.8f, 1.0f, 0.8f);
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    gluDisk(qobj, 0.25, 1.0, 20, 3);
    glPopMatrix();
    glEndList();
    gluDeleteQuadric(qobj);
    qobj = NULL;
    }
    static void _reshape(GLint w, GLint h)
    {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    static void _display(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glCallList(_displayList);
    glFlush();
    }
    int main(int argc, char** argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("test");
    glutDisplayFunc(_display);
    glutReshapeFunc(_reshape);
    _create_display_list();
    glutMainLoop();
    return 0;
    }

    Screenshot des Anwendungsfensters mit dem gewünschten Ergebnis

    Und hier ein modifiziertes Beispiel, das die Verwendung mehrerer Anzeigelisten veranschaulicht:

    /* $ gcc -Wall -pedantic test_gl.c -o test_gl -lGL -lGLU -lglut &&./test_gl */
    #include <GL/glut.h>
    static GLuint _displayList = 0;
    static void _create_display_lists(void)
    {
    GLUquadricObj *qobj = NULL;
    _displayList = glGenLists(4);
    /* shapes (white) */
    qobj = gluNewQuadric();
    glNewList(_displayList + 2, GL_COMPILE);
    glPushMatrix();
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    glTranslatef(-2.0f, -2.0f, 0.0f);
    gluSphere(qobj, 1.0, 20, 20);
    glTranslatef(4.0f, 0.0f, 0.0f);
    gluCylinder(qobj, 1.0, 0.0, 2.0, 20, 8);
    glTranslatef(0.0f, 4.0f, 0.0f);
    gluDisk(qobj, 0.25, 1.0, 20, 3);
    glTranslatef(-4.0f, 0.0f, 0.0f);
    gluPartialDisk(qobj, 0.5, 1.0, 26, 13, 0, 180);
    glPopMatrix();
    glEndList();
    gluDeleteQuadric(qobj);
    qobj = NULL;
    /* diagonal line (cyan) */
    glNewList(_displayList, GL_COMPILE);
    glBegin(GL_LINES);
    glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
    glVertex4f(-3.0f, 3.0f, 0.0f, 1.0f);
    glVertex4f(3.0f, 3.0f, 0.0f, 1.0f);
    glEnd();
    glEndList();
    /* horizontal line (yellow) */
    glNewList(_displayList + 1, GL_COMPILE);
    glBegin(GL_LINES);
    glColor4f(0.0f, 1.0f, 1.0f, 1.0f);
    glVertex4f(-3.0f, -3.0f, 0.0f, 1.0f);
    glVertex4f(3.0f, 3.0f, 0.0f, 1.0f);
    glEnd();
    glEndList();

    /* diagonal line (magenta) */
    glNewList(_displayList + 3, GL_COMPILE);
    glBegin(GL_LINES);
    glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
    glVertex4f(-3.0f, 3.0f, 0.0f, 1.0f);
    glVertex4f(3.0f, -3.0f, 0.0f, 1.0f);
    glEnd();
    glEndList();
    }
    static void _reshape(GLint w, GLint h)
    {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-4.0f, 4.0f, -4.0f, 4.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }
    static void _display(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glCallList(_displayList);
    glCallList(_displayList + 1);
    glCallList(_displayList + 2);
    glCallList(_displayList + 3);
    glFlush();
    }
    int main(int argc, char** argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("test");
    glutDisplayFunc(_display);
    glutReshapeFunc(_reshape);

    glLineWidth(5.0f);
    glDisable(GL_DEPTH_TEST);
    _create_display_lists();
    glutMainLoop();
    return 0;
    }

    Screenshot des Anwendungsfensters

    Die Dokumentation aller verwendeten GL/GLU-Funktionen finden Sie dort:
    https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/

    Die Dokumentation aller verwendeten GLUT-Funktionen finden Sie dort:
    https://www.opengl.org/resources/libraries/glut/spec3/spec3.html

    Weitere Informationen zum Thema "Legacy OpenGL" finden Sie hier (Immediate Mode, Matrix Stack Manipulation, Fixed-Function Lighting, Materials etc. wird heute nicht mehr verwendet, ist aber zum Testen, Lernen und Erstellen kleiner Programme gut zu verwenden, die meisten Treiber unterstützen dies immer noch.).

    Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

    Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...