GOOGLE ADS

Mittwoch, 4. Mai 2022

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_FIFOmit aktiviertem Hyperthreading ("HT") zu verwenden, was zu mehreren Thread-Prozessoren pro physischem Kern führt. Mein Verständnis ist, dass HT-Bewusstsein innerhalb des Linux-Kernels hauptsächlich durch die Lastausgleichs- und Scheduler-Domänen innerhalb von CFS (dem Standard-Scheduler heutzutage) erfolgt. Weitere Informationen finden Sie unter https://stackoverflow.com/a/29587579/2530418.

Die Verwendung von SCHED_FIFOoder SCHED_RRwürde dann die HT-Behandlung im Wesentlichen umgehen, da die RT-Planung nicht wirklich durch CFS geht.

Mein Ansatz, damit umzugehen, bestand in der Vergangenheit darin, Hyperthreading zu deaktivieren. Für Fälle, in denen Sie tatsächlich Echtzeitverhalten benötigen, ist dies normalerweise der richtige Kompromiss zwischen Latenz und Leistung (siehe https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application#Hyper_threading ). Ob dies angemessen ist, hängt wirklich davon ab, welches Problem Sie lösen möchten.

Abgesehen davon: Ich vermute, wenn Sie tatsächlich Verhalten brauchen SCHED_FIFO, dann sollten Sie HT deaktivieren, aber es ist auch üblich, dass Leute denken, dass sie es brauchen, SCHED_FIFOwenn es das falsche Werkzeug für den Job ist. Mein Verdacht ist, dass es möglicherweise eine bessere Option als die Verwendung gibt, SCHED_FIFOda Sie die Ausführung auf einem herkömmlichen Server und nicht auf einem eingebetteten System beschreiben, aber das ist eine zu verallgemeinernde Vermutung. Ohne genauere Angaben zum Thema schwer zu sagen.

Kauf-/Verkaufsstrategie mit Indikatoren?

Ich habe einen Datenrahmen ähnlich dem unten;


























PreisRückkehrIndikator
50,05ein
60,20-ein
5-0,16ein

Lösung des Problems

Ich bin mir nicht sicher, ob die Renditen und Preise an der richtigen Stelle sind (sie sollten nicht wirklich in derselben Zeile stehen, wenn sie den Kaufpreis (vermutlich der Schlusskurs von gestern) und die Tagesrendite darstellen (vorausgesetzt, die Position wurde für gehalten). ganzen Tag) Aber trotzdem...

import pandas as pd
# the data you provided
df = pd.read_csv("Data.csv", header=0)
# an initial starting row (explanation provided)
starting = pd.DataFrame({'Price': [0], 'return': [0], 'indicator': [0]})
# concatenate so starting is first row
df = pd.concat([starting, df]).reset_index(drop=True)
# setting holding to 0 at start (no shares), and cash at 1000 (therefore portfolio = 1000)
df[["Holding", "Cash", "Portfolio"]] = [0, 1000, 1000]
# buy/sell is the difference (explanation provided)
df["BuySell"] = df["indicator"].diff()
# simulating every day
for i in range(1, len(df)):
# buying
if df["BuySell"].iloc[i] > 0:
df["Holding"].iloc[i] += df["Cash"].iloc[i-1] / df["Price"].iloc[i]
df["Cash"].iloc[i] = 0
# selling
elif df["BuySell"].iloc[i] < 0:
df["Cash"].iloc[i] = df["Holding"].iloc[i-1] * df["Price"].iloc[i]
df["Holding"].iloc[i] = 0
# holding position
else:
df["Cash"].iloc[i] = df["Cash"].iloc[i-1]
df["Holding"].iloc[i] = df["Holding"].iloc[i-1]
# multiply holding by return (assuming all-in, so holding=0 not affected)
df["Holding"].iloc[i] *= (1 + df["return"].iloc[i])
df["Portfolio"].iloc[i] = df["Holding"].iloc[i] * df["Price"].iloc[i] + df["Cash"].iloc[i]

Erläuterungen:

Startreihe:


  • Dies ist erforderlich, damit die Schleife auf die vorherigen Bestände und Barmittel verweisen kann (es wäre umständlicher, eine if-Anweisung in die Schleife if einzufügen i=0).


Kaufen Verkaufen:


  • Die Differenz ist hier notwendig, als ob die Position von Kauf zu Verkauf wechselt und dann die Aktien offensichtlich verkauft werden (und umgekehrt). Wenn die vorherige Zeile jedoch Kaufen/Verkaufen war, genau wie die aktuelle Zeile, würde es keine Änderung (diff=0) geben, ohne dass Aktien gekauft oder verkauft würden.


Portfolio:


  • Dies ist ein "äquivalenter" Betrag (der Betrag, den Sie halten würden, wenn Sie zu diesem Zeitpunkt alle Aktien in Bargeld umwandeln würden).


Halten:


  • Dies ist die Anzahl der gehaltenen Aktien.


HINWEIS: Soweit ich Ihre Frage verstanden habe, ist dies eine All-in-Strategie - es gibt keinen Prozentsatz, was diese Strategie vereinfacht, aber einfacher zu programmieren gemacht hat.

Ausgabe:

#Out: 
# Price return indicator Holding Cash Portfolio BuySell
#0 0 0.00 0 0.00 1000 1000.0 NaN
#1 5 0.05 1 210.00 0 1050.0 1.0
#2 6 0.20 -1 0.00 1260 1260.0 -2.0
#3 5 -0.16 1 211.68 0 1058.4 2.0

Hoffentlich gibt Ihnen dies einen guten Ausgangspunkt, um etwas zu erstellen, das Ihren Spezifikationen entspricht und fortgeschrittener ist, z. B. mit mehreren Freigaben oder einer bestimmten prozentualen Offenlegung usw.

Aktualisieren Sie foreach das Array in js

Ich habe diesen Code als mein XO-Spielprojekt geschrieben, aber das Problem ist, dass ich das Array, das foreach verwendet, nicht aktualisieren kann. Die Array-Änderungen habe ich mit console.log überprüft, aber ich kann es nicht für meine foreach-Funktion ändern, was sollte ich mache?


const boxes = document.querySelectorAll(".box");
const boxes_list = [...boxes];
boxes_list.forEach((box) => {
box.addEventListener("mouseover", () => {
box.innerHTML = "X";
});
box.addEventListener("mouseout", () => {
box.innerHTML = "";
});
box.addEventListener("click", () => {
const boxIndex = boxes_list.indexOf(box);
if (boxIndex > -1) boxes_list.splice(boxIndex, 1);
console.log(boxes_list);
box.innerHTML = "X";
});
});

.container {
width: 175px;
height: 175px;
}
.box {
height: 50px;
width: 50px;
margin: 2px;
display: inline-block;
background-color: pink;
vertical-align: top;
}

<div class='container'>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
</div>

Lösung des Problems

Du könntest die Box einfach entfernen. Aber das wird die verbleibenden Boxen verschieben, um den Platz einzunehmen. Wenn das in Ordnung ist, kann Ihr Klick-Listener einfach sein:

 box.addEventListener("click", () => {
box.remove();
});

Aber wenn Sie möchten, dass die verbleibenden Kästchen an Ort und Stelle bleiben, dann würde ich vorschlagen, das Element nicht zu löschen, sondern es auszublenden, indem Sie das Sichtbarkeits-CSS-Attribut auf versteckt setzen. Hier mache ich das, indem ich der Box eine andere Klasse "unsichtbar" zuweise.


const boxes = document.querySelectorAll(".box");
const boxes_list = [...boxes];
boxes_list.forEach((box) => {
box.addEventListener("mouseover", () => {
box.innerHTML = "X";
});
box.addEventListener("mouseout", () => {
box.innerHTML = "";
});
box.addEventListener("click", () => {
box.classList.add("invisible");
});
});

.container {
width: 175px;
height: 175px;
}
.box {
height: 50px;
width: 50px;
margin: 2px;
display: inline-block;
background-color: pink;
vertical-align: top;
}
.invisible {
visibility: hidden;
}

<div class='container'>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
<div class='box'></div>
</div>

React Route: 404 Not Found nach dem Aktualisieren der bereitgestellten Anwendung

Ich arbeite für ein Unternehmen und habe gerade ein Projekt für sie bereitgestellt, aber ich bin auf ein Problem gestoßen. Wenn Sie also auf den Link http://domain gehen, können Sie auf die Seite gehen, und von dort aus können Sie auf jede andere Seite gehen (Reaktionsroute), aber wenn Sie direkt auf http://domain/some- Endpunkt zeigt es 404 nicht gefunden. weiß jemand wie man das beheben kann?


Lösung des Problems

Das ist passiert, weil Ihre Serverseite die Umleitung zu index.html nicht handhabt. Sie können es beheben, indem Sie Ihr Backend so konfigurieren, dass es immer zu html umleitet, oder Sie können es einfach vom React-Router aus mit HashRouter anstelle von BrowserRouter beheben

Hier finden Sie eine vollständige Erklärung zum serverseitigen vs. clientseitigen Routing

Einrichten von Terraform v0.14.0 auf Apple M1

Hinweise zum Einrichten von Terraform v0.14.0 auf einem Apple M1, da tfenv v0.14.0 auf Apple M1 nicht unterstützt

tfenv install v0.14.0
Installing Terraform v0.14.0
Downloading release tarball from https://releases.hashicorp.com/terraform/0.14.0/terraform_0.14.0_darwin_arm64.zip
curl: (22) The requested URL returned error: 403
Tarball download failed


Lösung des Problems

Terraform ist eine einfache ausführbare Datei, Sie können sie hier herunterladen und entpacken:
https://releases.hashicorp.com/terraform/0.14.0/:

wget https://releases.hashicorp.com/terraform/0.14.0/terraform_0.14.0_darwin_amd64.zip
unzip terraform_0.14.0_darwin_amd64.zip

Bitte beachten Sie, dass es keinen arm64Build für OSX gibt, aber das amd64funktioniert problemlos auf einem Mac M1.

Jetzt können Sie die extrahierte ausführbare Datei in einen Ordner wie kopieren /usr/local/bin, der sich auf Ihrem befinden sollte PATH, sodass Sie den terraformBefehl von überall in Ihrem System ausführen können.

Verkettung mit Telegram Bot API (wie TriviaBot)

Ich erstelle einen Bot im TriviaBot-Stil für Telegramm und verwende dafür Node.js. Im Moment habe ich Probleme, die Antworten der Benutzer auf mein Quiz zu erfassen, um festzustellen, ob der Benutzer die Frage richtig oder falsch beantwortet hat. Unten ist ein Code:

bot.onText(/\/quiz/, function (msg) {
var chatId = msg.chat.id;
var text = quizdata.one.msgtxt;
var opts = {
reply_to_message_id: msg.message_id,
reply_markup: JSON.stringify({
keyboard: quizdata.one.keyboard,
one_time_keyboard: true
})
};
bot.sendMessage(chatId, text, opts);
//NEED TO CAPTURE THE USER RESPONSE AND REPLY TO THEIR MESSAGE ACCORDINGLY
});


Lösung des Problems

HINWEIS: Telegram würde jede asynchrone Funktion abschneiden, Sie sollten ein separates Modul zum Abhören jeder eingehenden Interaktion mit der Schaltfläche erstellen. Sie könnten globales Array verwenden, um kleine Daten zu speichern, um sie für andere Module, die Sie benötigen, zurückzugeben.

Es ist keine gute Idee, alle Ihre Befehle in den Index js zu setzen.

wenn Sie die von der Tastatur callback_data hören möchten. Erstellen Sie einfach eine neue Zeile, um alle eingehenden angeklickten Schaltflächen abzuhören.

bot.on("callback_query", (msg) => {
if (msg.data === "your_keyboard_callback_data") {
// do whatever you want
}
})

Für mehr Freigabeknotentelegramm api

Tut mir leid, wenn meine Antwort dafür zu spät ist, aber ich hoffe, meine kann anderen Leuten helfen

Java-Anmerkungen

Was ist der Zweck von Annotationen in Java? Ich habe diese unscharfe Vorstellung davon, dass sie irgendwo zwischen einem Kommentar und dem tatsächlichen Code liegen. Beeinflussen sie das Programm zur Laufzeit?

Was sind ihre typischen Verwendungen?

Sind sie einzigartig für Java? Gibt es ein C++-Äquivalent?


Lösung des Problems

Anmerkungen werden hauptsächlich von Code verwendet, der anderen Code untersucht. Sie werden oft verwendet, um bestehende Klassen zur Laufzeit zu modifizieren (dh zu dekorieren oder zu umhüllen), um ihr Verhalten zu ändern. Frameworks wie JUnit und Hibernate verwenden Anmerkungen, um die Menge an Code zu minimieren, die Sie selbst schreiben müssen, um die Frameworks zu verwenden.

Oracle hat auf seiner Website eine gute Erklärung des Konzepts und seiner Bedeutung in Java.

Wie bedient man die .net-Konsole auf Nginx?

Also habe ich es so weit gebracht, dass die.net (Framework)-Konsolenanwendung auf localhost ausgeführt werden konnte, aber das nächste Problem besteht darin, sie mit Nginx verfügbar zu machen.

Ich habe mir viele Tutorials angesehen, aber sie scheinen alle für Websites zu sein. Wie kann ich es für eine Konsolen-App zum Laufen bringen?

Danke.

Was gewinnen Sie, wenn Sie nginx davor verwenden, anstatt nur die Konsolen-App auf Port 80 (oder vorzugsweise 443 mit einem Zertifikat) zu öffnen? Wahrscheinlich müssen Sie nginx als Reverse-Proxy für Ihre App einrichten.

Ich habe die Konsolen-App auf Port 1234 ausgeführt, weil es bereits eine App gibt, die Port 80 verwendet. Um ehrlich zu sein, bin ich mir nicht sicher, warum ich Nginx verwende, ich gehe einfach davon aus, dass ich das brauche, da ich die App auf localhost aber ausgeführt habe Ich kann von außen nicht darauf zugreifen. Ich habe die Firewall so eingestellt, dass sie diesen Port von der Seite des Domänenanbieters akzeptiert.

ähm.... was genau meinst du mit "Eine Konsolenanwendung verfügbar machen"? denn was Sie mit nginx - oder jedem anderen Webserver - verfügbar machen, ist eine Website. auch: willkommen bei stackoverflow. Ich empfehle, an der Tour teilzunehmen und zu lesen, wie man eine gute Frage stellt und was zum Thema gehört.

Danke. Ich verwende wahrscheinlich nicht den genauesten Begriff. Im Grunde möchte ich nur, dass die Leute auf meine App zugreifen können. Meiner Meinung nach gibt es einige zusätzliche Einstellungen, die ich vornehmen muss, damit es der Öffentlichkeit "ausgesetzt" wird (und das ist die Verwendung von nginx). Ich kann sehen, dass die App auf localhost läuft, bin mir aber nicht sicher, warum sie nicht öffentlich ist.

Bitte sagen Sie, was Sie von einer Konsolen-App erwarten, die der Öffentlichkeit zugänglich gemacht wird. Wie würden sie darauf zugreifen? Welches Tool auf meinem Desktop würde ich starten, ignorieren Sie den nginx-Teil der Diskussion

Ich habe also eine Schleife, die einige ähnliche Webinhalte wie diese bereitstellt.

https://gist.github.com/define-private-public/d05bc52dd0bed1c4699d49e2737e80e7

Wenn ich es ausführe, sollte ein externer Benutzer zu einer Website gehen und den von dieser bereitgestellten Seiteninhalt sehen.

Wenn Ihre Konsolenanwendung vom Typ Console.ReadLine() Console.WriteLine() ist, besteht die einzige Möglichkeit, sie offenzulegen, darin, einen SSH-Server auf Ihrem Hostsystem einzurichten. Dann benötigen die Benutzer einen SSH-Client, um darauf zuzugreifen. Dies ist über einen vom Webbrowser gehosteten SSH-Zugriff möglich, aber das ist eine komplexe Lösung

Sie können das ganze Console Readline- und Writeline-Zeug ignorieren.


Lösung des Problems

Ok, die Lösung ist eigentlich ganz einfach. Alles, was Sie tun müssen, ist, Ihre eingehende Anfrage mit proxy_pass an einen lokalen Host weiterzuleiten, wie von @fredrik vorgeschlagen. Folgendes sollte der Standard-Konfigurationsdatei (unter nginx) hinzugefügt werden:

server {
listen 80;
listen [::]:80;
server_name example.com;
location / {
proxy_pass http://localhost:8888/;
}
}

Dienstag, 3. Mai 2022

Empfangen der Meldung „Error in .intersectExtent(x, y, validate = TRUE): Objects do not intersect“ beim Versuch, Raster neu abzutasten

Ich führe R amd aus und habe drei RasterLayers, mit denen ich drei Rasterebenen auf die Auflösung eines Courser-Scale-Rasters (es gibt insgesamt vier Raster) zur Verwendung in MaxEnt neu abtasten möchte, erhalte jedoch die folgende Fehlermeldung:

Error in.intersectExtent(x, y, validate = TRUE): Objects do not intersect

Zwei der Raster überschneiden sich bereits und sind perfekt ausgerichtet, aber die anderen beiden überschneiden sich mit keiner der anderen Rasterebenen.

Ich denke, dies ist ein Problem mit dem Datum, aber ich habe Probleme, das Datum der beiden "Aus" -Raster so zu ändern, dass sie alle übereinstimmen. In ArcGIS Pro werden alle vier Raster übereinander projiziert und sind gut ausgerichtet, aber ihre Datumsangaben und zugrunde liegenden GCSs sind unterschiedlich (mit Ausnahme der beiden zuvor erwähnten).

Kann mir jemand beim Codieren der folgenden Schichten im D NAD 1983 2011 GCS helfen?

Dies ist die Ausgabe, die ich erhalten habe:

dem <- raster("dem.asc")
sas <- raster("sas.asc")
sasb <- resample(sas, dem)
#Error in.intersectExtent(x, y, validate = TRUE):
# Objects do not intersect

sas
#class: RasterLayer
#dimensions: 3185, 2615, 8328775 (nrow, ncol, ncell)
#resolution: 30, 30 (x, y)
# extent: 712518, 790968, 130036.7, 225586.7 (xmin, xmax, ymin, ymax)
#crs: +proj=aea +lat_0=24 +lon_0=-84 +lat_1=24 +lat_2=31.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs
#source: sas.asc
#names: sas
#values: -2147483648, 2147483647 (min, max)
dem
class: RasterLayer
dimensions: 7125, 8208, 58482000 (nrow, ncol, ncell)
resolution: 30, 30 (x, y)
extent: 7e+05, 946240, 385000, 598750 (xmin, xmax, ymin, ymax)
crs: +proj=aea +lat_0=24 +lon_0=-84 +lat_1=24 +lat_2=31.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m +no_defs
source: dem.asc
names: dem


Solution of the problem

Das:

sasb <- resample(sas, dem)
#Error in.intersectExtent(x, y, validate = TRUE):
# Objects do not intersect

sagt das sasund demschneidet sich nicht. In diesem Fall können Sie kein Resampling durchführen. Manchmal liegt das daran, dass sie ein unterschiedliches Koordinatenbezugssystem (crs) haben, aber aus show(sas)und demes ist klar, dass sie das gleiche Koordinatenbezugssystem haben, sich aber tatsächlich nicht überlappen, wie Sie hier sehen können:

library(raster)
es <- extent(712518, 790968, 130036.7, 225586.7)
ed <- extent(7e+05, 946240, 385000, 598750)
u = union(es, ed)
plot(u, col="white")
lines(es, lwd=3, col="blue")
lines(ed, lwd=3, col="red")

Geben Sie hier die Bildbeschreibung ein

Ordnen Sie Laufwerke in GCP Betriebssystemlaufwerken in Windows zu

Gibt es eine Möglichkeit, die einer VM in GCP zugewiesenen Datenträger den auf Betriebssystemebene in Windows angezeigten Datenträgern zuzuordnen? In Linux gibt es Zeiger, die der Benennung entsprechen, die wir in GCP bereitstellen. In Azure können wir die im Azure-Portal bereitgestellten LUN-IDs verwenden, um sie den entsprechenden IDs in Windows zuzuordnen. Wenn ich jedoch in GCP zwei Festplatten derselben Größe zuweise, kann ich nicht erkennen, welche welche ist. Das macht es schwierig, wenn ich zum Beispiel eine später erweitern muss. Im Moment erhöhe ich die Größe um 1 GB, um den Unterschied zu erkennen, aber das ist alles andere als ideal.

Unter Linux wird ein symbolischer benutzerfreundlicher Link wie /dev/disk/by-id/google- erstellt. In Windows sehe ich jedoch kein Äquivalent.

Das Szenario wäre so:

In der GCP-Konsole stelle ich eine Windows-Box mit 3 zusätzlichen Festplatten mit jeweils 100 GB bereit. Nehmen wir an, einer steht für „Software", einer für „Daten", einer für „temp" und sie wurden in der GCP-Konsole so benannt. Wenn die VM bereitgestellt wird, kann ich alle 3 Festplatten sehen, kann aber nicht sagen, welche den Festplatten entspricht, die ich in der GCP-Konsole benannt habe, da sie identisch mit dem Windows-Betriebssystem aussehen. Also müsste ich einen von ihnen "Software" auf Betriebssystemebene erraten und nennen. Wenn mir der Speicherplatz auf dem, was ich auf Betriebssystemebene als „Software" bezeichnet habe, ausgeht, dann zur GCP-Konsole gehe und den Datenträger „Software" erweitere, stelle ich möglicherweise fest, dass ich stattdessen „Temp" aus Windows-Sicht erweitert habe.


Lösung des Problems

Ich glaube nicht, dass dies möglich ist. In GCP können Sie der Festplatte einen benutzerdefinierten Namen hinzufügen (wie in dem Bild, das ich hinzugefügt habe) und Sie können auch Labels für Ihre Ressourcen verwenden, aber beide Optionen befinden sich auf der GCP-Seite, entweder Sie können sie verwenden oder sie über die Konsole aufrufen oder im CLI.

Geben Sie hier die Bildbeschreibung ein

Sobald Sie sich bei der Windows-VM anmelden, wird die Festplatte angehängt, aber leer angezeigt. Sie müssen das Datenträgerverwaltungstool verwenden, um ihr einen Namen zu geben.

Geben Sie hier die Bildbeschreibung ein

Ich würde vorschlagen, dass Sie jeweils einen Datenträger hinzufügen (wenn Sie Datenträger derselben Größe hinzufügen), sich dann bei der VM anmelden, das Datenträgerverwaltungstool öffnen und es nach Belieben benennen.

Bereitstellen des cnn-Modells für die Flasche mit Tensorflow?

Wie kann ich das cnn-Modell für die Flasche bereitstellen? Ich habe eine Webanwendung mit Flask erstellt, um ein Dashboard zu erstellen. Als Datenbank habe ich Firebase verwendet. Ich habe ein Problem damit, das Modell in der Flasche zu speichern und den Code auszuführen. Ich habe meine Vorgesetzte danach gefragt und sie hat mir diesen Link geschickt
https://theaisummer.com/deploy-flask-tensorflow/

Ich habe den Code im Link nicht verstanden?

Kann mir jemand erklären, was ich brauche, um das Modell in der Flasche einzusetzen?


Lösung des Problems

Sie sollten Ihr cnn-Modell als pkl speichern und es in Ihre Flask-App laden.

https://towardsdatascience.com/how-to-easy-build-your-first-machine-learning-web-app-in-python-c3d6c0f0a01c

Zugriff auf benachbarte Zellen für numpy-Array

Wie kann ich auf effiziente Weise auf die umgebenden 8 Zellen für ein 2D-Numpy-Array zugreifen und diese ändern?

Ich habe ein 2D-numpy-Array wie folgt:

arr = np.random.rand(720, 1440)

Für jede Gitterzelle möchte ich die mittlere Zelle um 10 % reduzieren, die umgebenden 8 Zellen (weniger für Eckzellen), aber nur, wenn der Wert der umgebenden Zelle 0,25 überschreitet. Ich vermute, dass dies nur mit einer for-Schleife möglich ist, würde aber gerne sehen, ob es bessere/schnellere Lösungen gibt.

- BEARBEITEN: Für schleifenbasierte Lösungen:

arr = np.random.rand(720, 1440)
for (x, y), value in np.ndenumerate(arr):
# Find 10% of current cell
reduce_by = value * 0.1
# Reduce the nearby 8 cells by 'reduce_by' but only if the cell value exceeds 0.25
# [0] [1] [2]
# [3] [*] [5]
# [6] [7] [8]
# * refers to current cell
# cell [0]
arr[x-1][y+1] = arr[x-1][y+1] * reduce_by if arr[x-1][y+1] > 0.25 else arr[x-1][y+1]
# cell [1]
arr[x][y+1] = arr[x][y+1] * reduce_by if arr[x][y+1] > 0.25 else arr[x][y+1]
# cell [2]
arr[x+1][y+1] = arr[x+1][y+1] * reduce_by if arr[x+1][y+1] > 0.25 else arr[x+1][y+1]
# cell [3]
arr[x-1][y] = arr[x-1][y] * reduce_by if arr[x-1][y] > 0.25 else arr[x-1][y]
# cell [4] or current cell
# do nothing
# cell [5]
arr[x+1][y] = arr[x+1][y] * reduce_by if arr[x+1][y] > 0.25 else arr[x+1][y]
# cell [6]
arr[x-1][y-1] = arr[x-1][y-1] * reduce_by if arr[x-1][y-1] > 0.25 else arr[x-1][y-1]
# cell [7]
arr[x][y-1] = arr[x][y-1] * reduce_by if arr[x][y-1] > 0.25 else arr[x][y-1]
# cell [8]
arr[x+1][y-1] = arr[x+1][y-1] * reduce_by if arr[x+1][y-1] > 0.25 else arr[x+1][y-1]


Lösung des Problems

Keine Notwendigkeit für Schleifen, vermeiden Sie die üblichen Python-Schleifen, sie sind sehr langsam. Verlassen Sie sich für mehr Effizienz auf die eingebaute Matrixoperation, "universelle" Funktionen, Filter, Masken und Bedingungen von numpy, wann immer Sie können. https://realpython.com/numpy-array-programmin Für komplizierte Berechnungen ist die Vektorisierung nicht schlecht, siehe einige Diagramme und Benchmarks Effizienteste Methode, um Funktionen über numpy-Arrays abzubilden (verwenden Sie sie nur nicht für einfachere Matrixoperationen wie das Quadrieren von Zellen, eingebaute Funktionen übertreffen)

Es ist leicht zu sehen, dass jede interne Zelle auf 0,9 bis zu 8-mal multipliziert würde, weil 8 Nachbarn (das ist um 0,1 reduziert) und zusätzlich eine zentrale Zelle ist, aber sie kann nicht unter 0,25/0,9 = reduziert werden 18.5. Für Rand- und Eckzellen verringert sich die Anzahl der Abnahmen auf das 6- und 3-fache.

Deshalb

x1 = 700 # for debugging use lesser arrays
x2 = 1400
neighbors = 8 # each internal cell has 8 neighbors
for i in range(neighbors):
view1 = arr[1:-1, 1:-1] # internal cells only
arr [1:x1, 1:-1] = np.multiply(view1,.9, where = view1 >.25)
arr [1:-1, 1:-1] *=.9

Ränder und Ecken werden gleich behandelt mit Nachbarn = 5 bzw. 3 und unterschiedlichen Ansichten. Ich denke, alle drei Fälle können in einer Formel mit kompliziertem Where-Case verbunden werden, aber die Beschleunigung wäre moderat, da Ränder und Ecken einen kleinen Bruchteil aller Zellen einnehmen.

Hier habe ich eine kleine Schleife verwendet, aber es sind nur 8 Wiederholungen. Es sollte auch möglich sein, die Schleife loszuwerden, indem man Power-, Log-, Integer-Teil- und Max-Funktionen verwendet, was zu einem etwas ungeschickten, aber etwas schnelleren Einzeiler führt, etwas herum

 numpy.multiply( view1, x ** numpy.max( numpy.ceil( (numpy.log (* view1/x... / log(.9)

Wir können auch eine andere nützliche Technik ausprobieren, die Vektorisierung. Die Vektorisierung baut eine Funktion auf, die dann auf alle Elemente des Arrays angewendet werden kann.

Lassen Sie uns zur Abwechslung Ränder/Schwellenwerte voreinstellen, um den genauen Koeffizienten zu ermitteln, mit dem multipliziert werden soll. Hier ist, wie der Code aussehen soll

n = 8
decrease_by = numpy.logspace(1,N,num=n, base=x, endpoint=False)
margins = decrease_by *.25
# to do: save border rows for further analysis, skip this for simplicity now
view1 = a [1: -1, 1: -1]
def decrease(x):
k = numpy.searchsorted(margin, a)
return x * decrease_by[k]
f = numpy.vectorize(decrease)
f(view1)

Anmerkung 1 Man kann versuchen, verschiedene Kombinationen von Ansätzen zu verwenden, z. B. vorberechnete Ränder mit Matrixarithmetik statt Vektorisierung zu verwenden. Vielleicht gibt es noch mehr Tricks, um jede der oben genannten Lösungen oder Kombinationen davon etwas zu beschleunigen.

Anmerkung 2 PyTorch hat viele Ähnlichkeiten mit der Numpy-Funktionalität, kann aber stark von der GPU profitieren. Wenn Sie eine anständige GPU haben, sollten Sie PyTorch in Betracht ziehen. Es gab Versuche mit gpu-basiertem numpy (gluon, aufgegebenes gnumpy, minpy) Mehr auf gpu's
https://stsievert.com/blog/2016/07/01/numpy-gpu/

Wie kann ich am Anfang und am Ende eines Arrays Null hinzufügen?

Ich habe ein Array wie folgt:

contact_map = array([[1., 1., 1.,..., 1., 1., 1.],
[1., 1., 1.,..., 1., 1., 1.],
[1., 1., 1.,..., 1., 1., 1.],
...,
[0., 0., 0.,..., 0., 0., 0.],
[0., 0., 0.,..., 0., 0., 0.],
[0., 0., 0.,..., 0., 0., 0.]])

wobei jedes Element davon ungefähr so ​​​​ist:

contact_map[19] = array([1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0., 1., 1., 1., 1., 1.,
1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 1., 0.,
0., 0., 0., 0., 0., 1., 0., 1., 1., 1., 1., 0., 0., 1., 1., 0., 0.,
0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 1., 1., 0.,
1., 1., 0., 0., 0., 1., 1., 0., 1., 0., 0., 0., 1., 1., 1., 1., 1.,
1., 0., 1., 0., 0., 0., 0., 1., 0., 0., 1., 0., 1., 1., 1.])

len(kontakt_karte) = 224

len(contact_map[19]) =100

Ich möchte alle Elemente von contact_map so ändern, dass am ersten und am Ende jedes Elements "0" hinzugefügt wird, zum Beispiel das Ändern von contact_map[19] in:

contact_map[19] = array([0.,1., 1., 1., 1., 1., 1., 1., 1., 0., 1., 1., 0., 1., 1., 1., 1., 1.,
1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0., 1., 0.,
0., 0., 0., 0., 0., 1., 0., 1., 1., 1., 1., 0., 0., 1., 1., 0., 0.,
0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 1., 1., 0.,
1., 1., 0., 0., 0., 1., 1., 0., 1., 0., 0., 0., 1., 1., 1., 1., 1.,
1., 0., 1., 0., 0., 0., 0., 1., 0., 0., 1., 0., 1., 1., 1., 0,.])

len(contact_map[19]) = 102

und so weiter, für contact_map[0], contact_map[1],....

kann mir jemand helfen?


Lösung des Problems

Sie können numpy.padwie folgt verwenden:

>>> import numpy as np
>>> a = np.array([[1., 1., 1., 1., 1., 1.],
[1., 1., 0., 0., 1., 1.],
[0., 1., 0., 0., 1., 1.]])
>>> a.shape
(3, 6)
>>> out = np.pad(a, [(0,0), (1, 1)], 'constant', constant_values=0)
# pad first dimension ^^^ ^^^
# ^^^ pad second dimension
# (first num for set how many pad at first
# second num for... at last.)
>>> out.shape
(3,8)
>>> out
array([[0., 1., 1., 1., 1., 1., 1., 0.],
[0., 1., 1., 0., 0., 1., 1., 0.],
[0., 0., 1., 0., 0., 1., 1., 0.]])

Deine Eingabe:

contact_map = np.random.randint(0,2, (224, 100))
print(len(contact_map))
# 224
print(len(contact_map[19]))
# 100
contact_map = np.pad(contact_map, [(0,0), (1, 1)], 'constant', constant_values=0)
print(len(contact_map[19]))
# 102
print(len(contact_map[0]))
# 102

Excel Office Scripts – IF-Anweisung zur Behandlung von Ausnahmen

Zusammenfassung: Ich habe ein mehrstufiges Skript, in dem ich eine IF-Anweisung benötige, um ein Szenario zu handhaben, in dem der Bereich, aus dem ich kopiere, leer sein könnte. Ich brauche das Skript, um mit dem nächsten Schritt fortzufahren, auch wenn es den unmittelbar nächsten Schritt "überspringt".

Szenario: Ein Schritt in der Mitte des Skripts besteht darin, mehrere Spaltenfilter zu setzen und dann die gefilterten Ergebnisse in eine andere Tabelle zu kopieren. Wenn die gefilterten Ergebnisse leer/leer sind, möchte ich, dass das Skript den Schritt „copyfrom" überspringt und mit dem nächsten Schritt fortfährt, der die zuvor festgelegten Filter freigibt.

Ich habe einen Screenshot des Excel-Beispiels angehängt, der zeigt, dass die gefilterten Ergebnisse leer sind. Die angezeigten Filter müssen freigegeben/gelöscht werden, aber das Skript stoppt nur, weil die Ergebnisse leer sind und es den unmittelbar nächsten Schritt (Kopieren von) nicht abschließen kann.
Excel-Screenshot leerer gefilterter Ergebnisse

Skript: Ich hatte hier Hilfe von einem anderen Benutzer mit einer IF-Anweisung in einem anderen Szenario. Ich habe versucht, diese Logik als Grundlage für meinen aktuellen Anwendungsfall zu verwenden... war aber nicht erfolgreich.

Hier das aktuelle Skript:

function main(workbook: ExcelScript.Workbook)
{
let target = workbook.getWorksheet('Target');
let source = workbook.getWorksheet('Source');
let targetTable = workbook.getTable('Target');
let sourceTable = workbook.getTable('Source');
const visibleRange = source.getUsedRange().getColumn(0);
let statusColumn = sourceTable.getColumnByName("Status");
let statusColumnRange = statusColumn.getRangeBetweenHeaderAndTotal();

//Identify last used row in Target sheet
const usedRange = target.getUsedRange();
console.log(usedRange.getAddress());
//Insert new row after last used row in Target sheet
const startCell = usedRange.getLastRow().getCell(0,0).getOffsetRange(1,0);
console.log(startCell.getAddress());
const targetRange = startCell.getResizedRange(0,0);
// Clear all filters on the table so that script filters can be applied
sourceTable.getAutoFilter().clearCriteria();
//Replace blanks with "null"
let emptyStatusCells = statusColumnRange.getSpecialCells(ExcelScript.SpecialCellType.blanks);
if (emptyStatusCells!= undefined) {
let rangeAreas = emptyStatusCells.getAreas();
rangeAreas.forEach(range => {
let values = range.getValues();
values.forEach(cellValue => {
cellValue[0]= "null";
})
range.setValues(values);
})
//Clear Occurrence seq formula and re-apply
let sourceShiftedVisibleRangeFormula = visibleRange.getOffsetRange(1, 2);
let C2 = source.getRange('C2');
sourceShiftedVisibleRangeFormula.getUsedRange().clear();
C2.setFormula("=COUNTIF($A$2:A2,A2)");
//Filter Sources
const DuplicateFilter = 'Duplicate';
const ValueOfDuplicateFilter = 'Duplicate';
const OccurrenceFilter = 'Occurrence';
const ValueOfOccurrenceFilter = '1';
const IncludeInDupFilter = 'Include Dup Filter';
const ValueOfIncDupFilter = 'Yes';
//Find columns to filter
const duplicateFilter = sourceTable.getColumnByName(DuplicateFilter);
const occurrenceFilter = sourceTable.getColumnByName(OccurrenceFilter);
const includeDupFilter = sourceTable.getColumnByName(IncludeInDupFilter);
//Select values to filter by
duplicateFilter.getFilter().applyValuesFilter([ValueOfDuplicateFilter]);
occurrenceFilter.getFilter().applyValuesFilter([ValueOfOccurrenceFilter]);
includeDupFilter.getFilter().applyValuesFilter([ValueOfIncDupFilter]);
//Set source visible range to copy from
console.log(visibleRange.getAddress());
//const shiftedVisibleRange = visibleRange.getOffsetRange(1,0);
const sourceShiftedVisibleRange= visibleRange.getOffsetRange(1,4)
console.log(sourceShiftedVisibleRange.getAddress());
let sh = workbook.getActiveWorksheet();
let visTble = sh.getTable('Source');
let rv = visTble.getRangeBetweenHeaderAndTotal().getVisibleView();
if (rv.getRowCount() > 0){
let shiftedVisibleRange = visibleRange.getOffsetRange(1,0);

//Paste into Target table
targetRange.copyFrom(shiftedVisibleRange.getUsedRange(), ExcelScript.RangeCopyType.all, false,
false);
//Clear Occurrence filter to show all duplicate rows
occurrenceFilter.getFilter().clear();
//Set the Include Dup Filter string values to logged
let stringValue= "logged"
//Update include Dup Filter to logged for duplicate rows moved to target table during this
process
sourceShiftedVisibleRange.getUsedRange().setValue(stringValue);
//Clear all other filters setby script
sourceTable.getAutoFilter().clearCriteria();
}
}

Dies ist der Abschnitt des Skripts, mit dem ich zu kämpfen habe. Wenn er leer ist, sollte er den Schritt "In die Zieltabelle einfügen" überspringen und mit dem nächsten Schritt namens "Vorkommensfilter löschen, um alle doppelten Zeilen anzuzeigen" fortfahren.

let sh = workbook.getActiveWorksheet();
let visTble = sh.getTable('Source');
let rv = visTble.getRangeBetweenHeaderAndTotal().getVisibleView();
if (rv.getRowCount() > 0){
let shiftedVisibleRange = visibleRange.getOffsetRange(1,0);

//Paste into Target table
targetRange.copyFrom(shiftedVisibleRange.getUsedRange(),
ExcelScript.RangeCopyType.all, false,
false);
//Clear Occurrence filter to show all duplicate rows
occurrenceFilter.getFilter().clear();


Lösung des Problems

Ich denke, Sie können dies mit Ihrer Quelltabelle mit der getVisibleView()Methode tun. Sobald Sie diese Methode verwendet haben, können Sie die Zeilenanzahl erhalten. Code, der das getan hat, würde ungefähr so ​​​​aussehen:

 function main(workbook: ExcelScript.Workbook){ 
let sh: ExcelScript.Worksheet = workbook.getActiveWorksheet();
let tbl: ExcelScript.Table = sh.getTable("Table1");
let rv: ExcelScript.RangeView = tbl.getRangeBetweenHeaderAndTotal().getVisibleView()
if (rv.getRowCount() > 0){
//more code here
}
}

Abfragefilter mit CDate() erzeugen inkonsistente Ergebnisse

Ich versuche, diese Abfrage zum Laufen zu bringen, aber sie funktioniert nicht wie erwartet.

In der Tabelle ist ein als Text formatiertes Datumsfeld (kann es nicht ändern) und ich muss diese Spalte filtern.

Termine aussehen

11/03/2022 (d/m/Y)

Meine Abfrage sieht aus wie

session.query(DBGEUK)\
.filter(DBGEUK.VALIDATOR == '58')\
.filter(func.CDate(DBGEUK.DATE) <= datetime.now())\
.all()

Es gibt insgesamt 24 Einträge. Wenn ich die obige Abfrage ausführe und DBGEUK.DATE + datetime.now ausdrucke, sind diese 9 Einträge mein Ergebnis.

27/03/2022 2022-03-28 19:06:49.465406
27/03/2022 2022-03-28 19:06:49.480988
27/03/2022 2022-03-28 19:06:49.480988
27/03/2022 2022-03-28 19:06:49.480988
28/03/2022 2022-03-28 19:06:49.480988
28/03/2022 2022-03-28 19:06:49.480988
28/03/2022 2022-03-28 19:06:49.480988
28/03/2022 2022-03-28 19:06:49.481612
28/03/2022 2022-03-28 19:06:49.481727

Wenn ich die Abfrage auf größer als >= ändere, bekomme ich die anderen 15 Einträge

04/03/2022 2022-03-28 19:09:09.030659
04/03/2022 2022-03-28 19:09:09.031659
04/03/2022 2022-03-28 19:09:09.031659
04/03/2022 2022-03-28 19:09:09.031659
04/03/2022 2022-03-28 19:09:09.031659
05/03/2022 2022-03-28 19:09:09.031659
05/03/2022 2022-03-28 19:09:09.031659
05/03/2022 2022-03-28 19:09:09.031659
05/03/2022 2022-03-28 19:09:09.032657
11/03/2022 2022-03-28 19:09:09.032657
12/03/2022 2022-03-28 19:09:09.032657
11/03/2022 2022-03-28 19:09:09.032657
11/03/2022 2022-03-28 19:09:09.032657
09/03/2022 2022-03-28 19:09:09.033654
09/03/2022 2022-03-28 19:09:09.033654

Vielen Dank für Ihre Hilfe im Voraus.


Lösung des Problems

Die CDate()Funktion versucht, Datumszeichenfolgenliterale gemäß den Datumsformatierungseinstellungen in der Windows-Systemsteuerung zu interpretieren. Bei einer „kurzen Datumseinstellung" von MM/dd/yyyywird CDate("03/07/2022")der 7. März 2022 ausgewertet. Bei einer „kurzen Datumseinstellung" von dd/MM/yyyywird CDate("03/07/2022")der 3. Juli 2022 ausgewertet.

Wenn die Datumszeichenfolge jedoch ein ungültiges Datum darstellt CDate(), ist "hilfreich" und gibt ein gültiges Datum mit dem anderen Format zurück. In beiden oben genannten Fällen CDate("14/03/2022")wird der 14. März 2022 ausgewertet.

Das bedeutet leider

  • Wie die Daten interpretiert werden, hängt vom Windows-Datumsformat ab, das von Computer zu Computer und sogar von Benutzer zu Benutzer auf demselben Computer variieren kann.

  • Die Interpretation von Datumsangaben kann zwischen mehrdeutigen und eindeutigen Datumszeichenfolgen inkonsistent sein.

  • Daher müssen wir in diesem Fall vermeiden, CDate()die Datumszeichenfolge selbst zu verwenden und zu analysieren:

    from datetime import datetime
    from sqlalchemy import create_engine, Column, String, select, func
    from sqlalchemy.engine import URL
    from sqlalchemy.orm import declarative_base, Session
    accdb_path = r"C:\Users\Public\test\sqlalchemy-access\gord_test.accdb"
    connection_string = (
    "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    f"DBQ={accdb_path};"
    "ExtendedAnsiSQL=1;"
    )
    connection_url = URL.create(
    "access+pyodbc", query={"odbc_connect": connection_string}
    )
    engine = create_engine(connection_url)
    Base = declarative_base()
    class DBGEUK(Base):
    __tablename__ = "so71651145"
    DATE = Column(String(10), primary_key=True)
    def __repr__(self):
    return f"<DBGEUK(DATE='{self.DATE}')>"
    # create test environment
    Base.metadata.drop_all(engine)
    Base.metadata.create_all(engine)
    with Session(engine) as session:
    # example data
    session.add_all(
    [
    # How CDate() interprets the string
    # based on Windows' short date format:
    #
    # dd/MM/yyyy MM/dd/yyyy
    # ------------ ------------
    DBGEUK(DATE="07/03/2022"), # Mar 7, 2022 Jul 3, 2022
    DBGEUK(DATE="14/03/2022"), # Mar 14, 2022 Mar 14, 2022
    DBGEUK(DATE="03/07/2022"), # Jul 3, 2022 Mar 7, 2022
    DBGEUK(DATE="31/12/2022"), # Dec 31, 2022 Dec 31, 2022
    ]
    )
    session.commit()
    # (for future readers of this answer)
    print(datetime.now()) # 2022-03-29 08:44:00.512366
    # original query
    qry = select(DBGEUK).filter(func.CDate(DBGEUK.DATE) <= datetime.now())
    results = session.scalars(qry).all()
    print(results)
    # [<DBGEUK(DATE='14/03/2022')>, <DBGEUK(DATE='03/07/2022')>]
    #
    # with Windows' short date format set to MM/dd/yyyy, CDate() interprets
    # the second value as March 7, not July 3
    # corrected query
    qry = select(DBGEUK).filter(
    func.DateSerial(
    func.CInt(func.Mid(DBGEUK.DATE, 7, 4)), # year
    func.CInt(func.Mid(DBGEUK.DATE, 4, 2)), # month
    func.CInt(func.Mid(DBGEUK.DATE, 1, 2)), # day
    )
    <= datetime.now()
    )
    results = session.scalars(qry).all()
    print(results)
    # [<DBGEUK(DATE='07/03/2022')>, <DBGEUK(DATE='14/03/2022')>]
    #
    # all good

    wie man den Standardfehler aller Variablen pro Gruppe berechnet

    Ich habe einen Datenrahmen, der Variablen enthält:

     Group high weigh age col5
    row1 A 12 57 18 AA
    row2 C 22 80 29 BB
    row3 B 17 70 20 CC
    row4 A 13 60 26 DD
    row5 D 19 69 25 AA
    row6 B 10 15 19 BB
    row7 C 20 66 22 CC
    row8 D 13 53 18 DD

    Ich möchte den Standardfehler mit der Funktion std.error aus dem Paket Plotrix oder mit einer anderen Methode (wie die direkte Berechnung von sd / sqrt (Länge (Daten [, Spalte])) aller quantitativen Fehler nach Gruppe in (erste Spalte) berechnen, also die Ergebnis, das ich will, ist

     Group se_high se_weigh se_age 
    row1 A 0.223 0.023 0.1
    row3 B 0.12 0.1 0.12
    row7 C 0.1 0.04 0.09
    row8 D 0.05 0.12 0.07

    Ich habe versucht, group_by dplyr fubction zu verwenden, um Spalte eins zu gruppieren und dann std.error zu verwenden, aber ich weiß nicht, wie ich sie kombinieren soll

    #this is the dplyr function to calculate the mean by group
    library(dplyr)
    data %>%
    group_by(group) %>%
    summarise_at(vars("A", "B", "C","D"), mean)

    Ich würde auch gerne wissen, wie man std.error durch zwei Gruppen berechnet (Spalte 1 und letzte Spalte 5 zum Beispiel)

    Danke


    Lösung des Problems

    Du warst nah! Summarize_at ist jetzt eigentlich veraltet, also würde ich Folgendes tun:

    library(dplyr)
    data %>%
    group_by(Group) %>%
    summarize(se_high=plotrix::std.error(high),
    se_weigh=plotrix::std.error(weigh),
    se_age=plotrix::std.error(age))

    die zurückkehrt

    # A tibble: 4 x 4
    Group se_high se_weigh se_age
    <chr> <dbl> <dbl> <dbl>
    1 A 0.5 1.5 4
    2 B 3.5 27.5 0.5
    3 C 1 7 3.5
    4 D 3 8 3.5

    Werte im Zeitverlauf mit Pandas Dataframe darstellen

    Ich möchte Datenpunkte aus jedem Land für Prozentsatz und Zeit aus diesem Pandas-Datenrahmen sammeln. Pandas-Datenrahmen

    Durch die Verwendung der pandas.iloc-Funktion konnte ich die Daten jedes Landes isolieren

    SIPRI_share_GDP.iloc[0]

    Welche Ausgänge:

    Country Algeria
    1949 0.0%
    1950 0.0%
    1951 0.0%
    1952 0.0%
    ...
    2015 6.3%
    2016 6.4%
    2017 5.9%
    2018 5.5%
    2019 6.0%

    Wenn ich versuche, diese Ausgabe in zwei Arrays von Variablen aufzuteilen:

    date_Algeria, GDP_pct_Algeria = SIPRI_share_GDP.iloc[0]

    Ich bekomme den Fehler

    ValueError: too many values to unpack (expected 2)

    Ich verstehe diesen Fehler nicht ganz, da ich dachte, die Ausgabe seien zwei Arrays.

    Kann mir jemand sagen wo ich falsch liege? Irgendwelche Hilfe, wie man die Daten richtig in Prozent- und Zeit-Arrays aufteilt?

    Danke!


    Lösung des Problems

    Was hier vor sich geht, ist, dass Python dies als ein einzelnes Objekt betrachtet, eine Pandas-Serie (pandas.core.series.Series). Wenn Sie versuchen, eine Mehrfachzuweisung durchzuführen, wird davon ausgegangen, dass Sie versuchen, jeden Wert aus der Reihe einer Variablen zuzuweisen, und stellt fest, dass nicht genügend Variablen verwendet werden können.

    Sie können nur auf den Index (den Teil mit den Jahren) zugreifen, indem Sie verwenden SIPRI_share_GDP.index, und nur auf die Werte, indem Sie verwenden SIPRI_share_GDP.iloc[0].values, sodass Ihr aktualisierter Code wie folgt aussehen würde:

    date_Algeria, GDP_pct_Algeria = SIPRI_share_GDP.index, SIPRI_share_GDP.iloc[0].values

    Je nachdem, welches Plotpaket Sie verwenden, müssen Sie sie jedoch möglicherweise nicht einmal trennen. Standardmäßig gehen einige Plotpakete davon aus, dass der Index der Serie die gewünschten x-Werte sind. Pandas hat eine integrierte Integration mit Matplotlib, sodass Sie sogar einfach Folgendes verwenden können:

    SIPRI_share_GDP.iloc[0].plot()

    Alle untergeordneten Prozesse ordnungsgemäß ernten und den Exit-Status erfassen

    Ich möchte alle untergeordneten Prozesse abfangen, die von einem übergeordneten Prozess gegabelt wurden, und dann den Exit-Status des letzten untergeordneten Prozesses erfassen. Zu diesem Zweck habe ich sigsuspend() aufgerufen, um auf ein SIGCHLD-Signal zu warten. Wenn ich das SIGCHLD-Signal erhalte, ruft der Handler waitpid in einer Schleife auf, bis er anzeigt, dass keine Kinder mehr zu ernten sind. Der Exit-Status wird gesetzt, und der Main wird aus der Schleife ausbrechen und beendet.

    Ich habe jedoch festgestellt, dass dies nicht korrekt ist, da nicht immer alle Kinder geerntet werden. Wie kann ich das beheben?

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/wait.h>
    volatile sig_atomic_t exit_stat;
    // Signal Handler
    void sigchld_handler(int sig) {
    pid_t pid;
    int status;
    while(1) {
    pid = waitpid(-1, &status, WNOHANG);
    if(pid <= 0) {break;}
    if(WIFEXITED(status)) {
    printf("%s", "Exited correctly.");
    }
    else {
    printf("%s", "Bad exit.");
    }
    }
    exit_stat = status;
    }
    // Executing code.
    int main() {
    signal(SIGCHLD, sigchld_handler);

    sigset_t mask_child;
    sigset_t old_mask;
    sigemptyset(&mask_child);
    sigaddset(&mask_child, SIGCHLD);
    sigprocmask(SIG_BLOCK, &mask_child, &old_mask);

    for(int i = 0; i < 5; i++) {
    int child_pid = fork();
    if(child_pid!= 0) {
    //Perform execvp call.
    char* argv[] = {"echo", "hi", NULL};
    execvp(argv[0], argv);
    }
    }

    while(!exit_stat) {
    sigsuspend(&old_mask);
    }

    return 0;
    }


    Lösung des Problems

    Übertragen leicht modifizierter Kommentare in eine Antwort.

    Die WNOHANGOption waitpid()bedeutet "sofort zurückkehren, wenn keine Kinder mehr übrig sind, ODER wenn Kinder übrig sind, aber noch laufen". Wenn Sie wirklich warten möchten, bis alle untergeordneten Elemente beendet sind, lassen Sie die WNOHANGOption entweder weg oder verwenden Sie stattdessen waitpid()einfach. wait()Beachten Sie, dass Aufgaben, die im Hintergrund gestartet wurden, möglicherweise für sehr lange Zeit nicht beendet werden, wenn überhaupt. Es hängt auch vom Kontext ab, ob „das letzte Kind, das stirbt" der richtige ist, um darüber zu berichten. Es ist möglich, sich Szenarien vorzustellen, in denen dies nicht angemessen ist.

    Sie haben Recht, in diesem Fall meinte ich, dass "das letzte Kind, das stirbt", das letzte Kind ist, das gegabelt wurde. Kann ich dies beheben, indem ich eine einfache Bedingung hinzufüge, um zu prüfen, ob die zurückgegebene PID von Wait == die PID des letzten gegabelten Kindes ist?

    Wenn Sie an dem letzten untergeordneten Element in der neuesten Pipeline interessiert sind (z. B. ls | grep … | sort … | wcund Sie auf warten möchten wc), dann kennen Sie die PID für wcund Sie können verwenden waitpid(wc_pid, &status, 0), um darauf zu warten, dass dieser Prozess ausdrücklich stirbt. Oder Sie können Ihre Schleife verwenden, um Körper zu sammeln, bis Sie entweder den Körper von finden wcoder „keine toten Prozesse mehr übrig" erhalten. An diesem Punkt können Sie sich entscheiden, speziell auf die PID zu warten wcoder (besser) use waitpid()without WNOHANG(oder use wait()) bis ein Prozess stirbt – und wieder können Sie entscheiden, ob dies der Fall war oder nicht, und wenn nicht, den Leichensammlungsprozess wcwiederholen WNOHANGSammle alle Zombies. Wiederholen Sie diesen Vorgang, bis Sie die Leiche von gefunden haben wc.

    Außerdem haben Sie gesagt, dass Hintergrundaufgaben möglicherweise lange Zeit nicht beendet werden. Meinen Sie damit, dass waitpid(-1, &status, 0)alle Prozesse vollständig ausgesetzt werden, bis ein Kind bereit ist, geerntet zu werden?

    waitpid(-1, &status, 0);lässt den Elternprozess unbegrenzt warten, bis ein Kindprozess stirbt, oder er kehrt zurück, weil es keine Kinder mehr gibt, auf die gewartet werden kann (was darauf hinweist, dass ein Haushaltsfehler aufgetreten ist; Kinder sollten nicht sterben, ohne dass die Eltern es wissen).

    Beachten Sie, dass die Verwendung einer „Warten auf jedes Kind"-Schleife es vermeidet, Zombies in der Nähe zu lassen (Kinder, die gestorben sind, auf die jedoch nicht gewartet wurde). Dies ist im Allgemeinen eine gute Idee. Aber die Aufnahme, wenn das Kind, an dem Sie gerade interessiert sind, stirbt, stellt sicher, dass Ihre Hülle nicht herumhängt und wartet, wenn es nicht nötig war. Sie müssen also sowohl die PID als auch den Exit-Status der toten untergeordneten Prozesse erfassen.

    Hohe Menge an Request to Yield pro geparster Seite blockiert Crawling

    Ich habe einen Crawl, bei dem jede Unterseite mehr als 300 Links enthält, denen ich folgen muss. Der Crawl verlangsamt sich nach ungefähr einer Minute / manchmal werden 0 Seiten / min gecrawlt.

    Wenn ich den Crawl mit Seiten 10-50 Links pro Seite durchlaufe, wird das gleiche Problem nicht angezeigt.

    Ich habe 10 concurrent_requests und 10 verarbeitete Artikel und einen Reaktor-Threadpool mit 400 konfiguriert. Das bedeutet bis zu 3.000 Erträge pro 10 verarbeiteten Artikeln...

    Die Protokollierung zeigt, dass die Parsing-Funktion mehr als 70 Sekunden pro Seite benötigt. Die Protokollierung zeigt, dass die hier benötigte Zeit aus den Erträgen stammt (bis zu 2 Sekunden pro Ertrag).

    Es scheint kratzig zu warten, bis der Motor anspringt? oder etwas Ähnliches hat eine Aufgabe erledigt und ist bereit, die neue Ertragsanfrage zu bearbeiten? Das Hinzufügen der Anforderungen zum Scheduler dauert nicht lange, daher scheint es mir, dass der Ertrag auf etwas anderes wartet.

    Irgendwelche Hinweise, was zu optimieren ist oder was falsch läuft?

    Ist es möglich, die Anforderungen in großen Mengen bereitzustellen, anstatt jede einzeln bereitzustellen? Ist es möglich, sie dem Scheduler hinzuzufügen, ohne sie zu übergeben?

    Einige zusätzliche Informationen:


    • Kein Unterschied, ob ich Scrapy-Redis oder nur den Disk-Base-Scheduler verwende.

    • Aufgrund der Darstellung von Javascript kann ein Download einer gecrawlten Seite bis zu 10 Sekunden dauern.

    • Autothrottle ist deaktiviert

    • Wenn ich mehr CPU-Ressourcen gebe, beschleunigt es die Dinge nicht.


    telnet-> est()
    time()-engine.start_time : 676.0599975585938
    engine.has_capacity() : False
    len(engine.downloader.active) : 7
    engine.scraper.is_idle() : False
    engine.spider.name : onetwothree
    engine.spider_is_idle(engine.spider): False
    engine.slot.closing : False
    len(engine.slot.inprogress) : 28
    len(engine.slot.scheduler.dqs or []): AttributeError (exception)
    len(engine.slot.scheduler.mqs) : AttributeError (exception)
    len(engine.scraper.slot.queue) : 0
    len(engine.scraper.slot.active) : 21
    engine.scraper.slot.active_size : 3878605
    engine.scraper.slot.itemproc_size: 0
    engine.scraper.slot.needs_backout(): False

    AttributeError seems to come from scrapy-redis plugin, 
    without scrapy counts up the pages to request in mgs.

    est, wenn len(engine.downloader.active) auf 0 geht

     time()-engine.start_time : 7236.464096784592
    engine.has_capacity() : False
    len(engine.downloader.active) : 0
    engine.scraper.is_idle() : False
    engine.spider.name : onetwothree
    engine.spider_is_idle(engine.spider): False
    engine.slot.closing : False
    len(engine.slot.inprogress) : 25
    len(engine.slot.scheduler.dqs or []): AttributeError (exception)
    len(engine.slot.scheduler.mqs) : AttributeError (exception)
    len(engine.scraper.slot.queue) : 0
    len(engine.scraper.slot.active) : 25
    engine.scraper.slot.active_size : 5357134
    engine.scraper.slot.itemproc_size: 0
    engine.scraper.slot.needs_backout(): True

    Crawler Code:

     class robo2Spider(Spider):
    http_pass = None
    http_user = None
    dont_redirect = True
    start_urls = []

    def __init__(self, *args, **kwargs):

    #... some config...

    self.start_urls = self.custom_settings["TEST_URLS"]
    # Don't Follow links in test mode

    def start_requests(self):
    for url in self.start_urls:
    r = self.get_request(url)
    yield r

    def parse(self, response):
    # some extraction and co...
    yield from self.scrape_data(response)

    def scrape_data(self, response):
    start_time = time.time()

    # more extraction, build item

    extract_links = util.extract_links_from_response(response, self.query_pars_to_ignore)
    logging.info(
    "--- logging time 1: %s --- %s seconds ---" % (response.url, time.time() - start_time))

    request_links = []
    for link in extract_links:

    if (not link["nofollow"]) and (l.get_output_value("crawl_meta_nofollow")!= "nofollow"):
    r = self.get_request(link["url"])
    request_links.append(r)

    yield from request_links

    logging.info(
    "--- logging time 2 (takes up to 70 sec): %s --- %s seconds ---" % (response.url, time.time() - start_time))

    yield l.load_item()


    def get_request(self, url, rit=None, splash_retry=None):

    #... setting meta & co...
    meta = {}
    splash_args = {}
    return SplashRequest(url=url, callback=self.parse, meta=meta,
    args=splash_args, http_status_from_error_code=True,
    endpoint='execute', slot_policy=scrapy_splash.SlotPolicy.SCRAPY_DEFAULT)

    Gleiches Ergebnis wenn ich es so mache:

     for link in extract_links:
    if (not link["nofollow"]) and (l.get_output_value("crawl_meta_nofollow")!= "nofollow"):
    r = self.get_viu_request(link["url"])
    request_links.append(r)
    yield r


    Lösung des Problems

    yieldDie Leistung ist ideal, Splash verlangsamt Sie. Versuchen Sie, Ihre Daten ohne Splash abzurufen. Überprüfen Sie die Registerkarte "Netzwerk" im devtools, um die tatsächliche Anforderung zu finden, die Ihren dynamischen Inhalt lädt, um die Verwendung von Splash zu vermeiden. Wenn Sie eine Seite freigeben können, die Sie sind Wenn ich versuche zu kratzen, kann ich Ihnen helfen, es mit reinem Kratzen zu kratzen, ohne dass Spritzer oder Selen benötigt werden.

    Ich habe ein 2D-Numpy-Array in Python. Ich möchte die Umkehrung der Elemente hinzufügen, falls nicht vorhanden

    Ich habe ein 2D-numpy-Array. Ich möchte die Umkehrung der Elemente hinzufügen, falls nicht vorhanden!

    zum Beispiel enthält in ['113', '722'] und ['722', '113'] und das ist gut so.

    array([['113', '1283'],
    ['113', '1108'],
    ['113', '729'],
    ['113', '1059'],
    ['113', '722'],
    ['722', '113'],
    ['113', '937'],
    ['113', '933'],
    ['113', '1050'],
    ['113', '454'],
    ['113', '587']]


    Lösung des Problems

    Nur für Schleife durch das Array und mit if-Anweisung?

    import numpy as np
    array = np.array([['113', '1283'],
    ['113', '1108'],
    ['113', '729'],
    ['113', '1059'],
    ['113', '722'],
    ['722', '113'],
    ['113', '937'],
    ['113', '933'],
    ['113', '1050'],
    ['113', '454'],
    ['113', '587'])
    for item in array:
    item_reversed = item[::-1]
    if item_reversed not in array:
    array.append(item_reversed)

    Wie kann man die Überlappung der Y-Achsen-Beschriftung auf ggplot in R beheben?

    Meine y-Achse für Altersgruppen überschneidet sich ständig. Bitte helfen Sie! Das ist mein Code:

    ggplot(data = BRFSS2015_outlier1, aes(x = INCOME2, y= Age, color = SEX))+
    geom_col(width=0.03)+
    facet_grid(.~SEX)+
    labs(x = "Age")+
    theme(axis.text.x = element_text(angle = 30))

    Die Ausgabe sieht so aus:
    Geben Sie hier die Bildbeschreibung ein


    Lösung des Problems

    Es ist hilfreich, ein Datenbeispiel mit dput(BRFSS2015_outlier1) oder, wenn das zu lang ist, mit dput(head(BRFSS2015_outlier1)) anzuzeigen.

    Ich vermute, dass das Alter als Faktor gespeichert ist und Sie nicht zusammengefasst haben, sodass jede Spalte viele Beobachtungen stapelt, was zu hohen Spalten führt, die mit der begrenzten Anzahl von Altersfaktoren, die auf der y-Achse angezeigt werden, weit außerhalb des Maßstabs liegen. Sie könnten zum Beispiel ein Alter „30" haben, was der erste Faktor sein könnte, der bei „1" auf der y-Achse erscheint, und Alter „40" als zweiten Faktor, der bei „2" auf der y-Achse erscheint, aber diese sind im Grunde 0 im Vergleich zu Ihrem Stack, der Hunderte oder Tausende von Beobachtungen hoch ist.

    Hier ist ein reproduzierbares Beispiel mit Daten, die wir alle bereits haben. Beachten Sie, dass die Beschriftungen der Y-Achse wie in Ihrem Beispiel unten alle überlappt sind.

    ggplot(data = diamonds, aes(x = cut, y= as.factor(cut), color = clarity))+
    geom_col(width=0.03)+
    facet_grid(.~color)+
    theme(axis.text.x = element_text(angle = 30))

    Geben Sie hier die Bildbeschreibung ein

    Mir ist unklar, was Sie mit Age auf der y-Achse zeigen möchten. Soll jeder Balken "so hoch" wie das Alter sein? Oder möchten Sie zeigen, wie viele Beobachtungen es für jedes Alter gibt?

    Ich vermute, Sie wollten zeigen, wie sich die Einkommensverteilung mit dem Alter ändert. In diesem Fall ist es möglicherweise angemessener, Alter als vertikale Facettenvariable zu verwenden, wie hier (ersetzen Sie "Schnitt" hier durch Alter in Ihrem Beispiel). Beachten Sie auch die Verwendung von geom_bar(das standardmäßig die Anzahl der Beobachtungen zählt und anzeigt) anstelle von geom_col(das standardmäßig den Rohwert anzeigt).

    ggplot(data = diamonds, aes(x = cut, fill = cut))+
    geom_bar()+
    facet_grid(color~clarity)+
    theme(axis.text.x = element_text(angle = 30))

    Geben Sie hier die Bildbeschreibung ein

    POSIX-Shell (sh) leitet stderr nach stdout um und erfasst stderr und stdout in Variablen

    Ich möchte stderr nach stdout umleiten, damit ein Terminal beide während einer Befehlsausführung druckt, aber ich möchte auch beide in separaten Variablen erfassen. Das ist mir in Bash (Version 4.4.20(1)-Release) gelungen:

    #!/bin/bash
    echo "terminal:"
    { err="$(find / -maxdepth 2 -iname 'tmp' -type d 2>&1 1>&3 3>&- | tee /dev/stderr)"; ec="$?"; } 3>&1 | tee /dev/fd/4 2>&1; out=$(cat /dev/fd/4)
    echo "stdout:" && echo "$out"
    echo "stderr:" && echo "$err"

    das gibt erwünscht:

    terminal:
    find: '/root': Permission denied
    /tmp
    /var/tmp
    find: '/lost+found': Permission denied
    stdout:
    /tmp
    /var/tmp
    stderr:
    find: '/root': Permission denied
    find: '/lost+found': Permission denied

    aber ich habe ein Problem beim Konvertieren dieses Skripts in POSIX sh/bin/sh

    #!/bin/sh
    echo "terminal:"
    { err="$(find / -maxdepth 2 -iname 'tmp' -type d 2>&1 1>&3 3>&- | tee /dev/stderr)"; ec="$?"; } 3>&1 | tee /dev/fd/4 2>&1; out=$(cat /dev/fd/4)
    echo "stdout:" && echo "$out"
    echo "stderr:" && echo "$err"

    gibt:

    terminal:
    tee: /dev/fd/4: No such file or directory
    find: '/root': Permission denied
    /tmp
    /var/tmp
    find: '/lost+found': Permission denied
    cat: /dev/fd/4: No such file or directory
    stdout:
    stderr:

    /dev/fd/4existiert nicht, und es gibt auch keine /proc/self/fd/4.

    Wie lässt sich dieses Skript als POSIX-Shell-Skript verwenden?


    Lösung des Problems

    Nun, ich mache das in der Shell von busybox ashund meine Optionen sind ziemlich begrenzt, aber das ist, was ich mir ausgedacht habe, das funktioniert.

    tmpfile=/tmp/some_prefix_stderr.$$
    out=$(my_cmd) 2>$tmpfile
    result=$?
    err=$(cat $tmpfile)
    rm $tmpfile

    Es ist nicht das schönste, aber es funktioniert. Ersetzen Sie im Allgemeinen durch some_prefixetwas Bestimmtes, um Kollisionen zu vermeiden, aber wenn Sie nur die PID dort haben, wird das gelöst, es sei denn, Sie führen mehrere Threads aus.

    Wenn Sie sich darauf verlassen können, dass Ihr Programm nicht Null verlässt, wenn es etwas in stderr anzuzeigen gibt, können Sie es ein wenig vereinfachen:

    tmpfile=/tmp/some_prefix_stderr.$$
    if! out=$(my_cmd) 2>$tmpfile; then
    # specific behavior here
    cat $tmpfile >&2
    fi
    rm $tmpfile

    Dies ist alles POSIX-konform. Stellen Sie einfach sicher, dass Sie Ihre temporäre Datei bereinigen.

    Wie konvertiert man eine Nummer eines Webservices in eine Zeichenkette eines anderen Webservices?

    Ich habe einen Webdienst, der => und Yearanzeigt.CountryNational register

    Geben Sie hier die Bildbeschreibung ein

    Hier ist der Code

    service.ts

    getDta(obj: SearchDta): Observable < SearchDtaResponse > {
    return this.http.post < SearchDtaResponse > (this.api + `/DTA`, {
    REGISTRENAT: obj.registreNational,
    EXERCICE: obj.fiscalYear,
    PAYS: obj.country,
    MODE: 'D',
    },
    );
    }

    Komponente.ts

     registreNational: string | null = null;
    country: string | null = null;
    fiscalYear: string | null = null;
    countries: Country[] = [];
    ngOnInit(): void {
    this.registreNational = this.activatedRoute.snapshot.paramMap.get('registreNational');
    this.country = this.activatedRoute.snapshot.paramMap.get('country');
    this.fiscalYear = this.activatedRoute.snapshot.paramMap.get('fiscalYear');
    if (!this.registreNational ||!this.country ||!this.fiscalYear) {
    this.goBack();
    return;
    }
    this.getDta();
    }
    private getDta(): void {
    let searchDta = new SearchDta(parseInt(this.registreNational + ''), parseInt(this.fiscalYear + ''), parseInt(this.country + ''));
    this.service.getDta(searchDta).pipe(
    takeUntil(this.unsubscribe$)
    ).subscribe(res => {
    if (res.RETURNCODE === ApiResponseCodeEnum.Ok) {
    this.dta = res.DTA;
    }
    });
    }

    HTML

    <tr>
    <th>Year</th>
    <td>{{ fiscalYear }}</td>
    </tr>
    <tr>
    <th>Country</th>
    <td>{{ country }}</td>
    </tr>
    <tr>
    <th>National register</th>
    <td>{{ registreNational }}</td>
    </tr>

    Mein Problem ist, dass ich den 4Wert durch den Namen eines Landes ersetzen möchte. Ich muss einen anderen WebService zum Konvertieren verwenden.

    Normalerweise ist der folgende Code richtig...

    service.ts

    ...

    getPaysDta(): Observable < Country[] > {
    return this.http.post < SpecificParametersResponse > (this.api + `/TXT`, {
    CODE: "PAYS_DTA",
    ID: 1,
    LISTEBOOL: "TRUE"
    }).pipe(
    map(res => {
    if (res.RETURNCODE === ApiResponseCodeEnum.Ok) {
    return res.TEXTE.LISTE.map(item => {
    console.log("Countries => " + JSON.stringify(res.TEXTE.LISTE));
    return {
    id: item.CODE,
    name: item.COURT
    }
    });
    } else {
    return [];
    }
    })
    );
    }

    land.ts

    export class Country {
    id: string;
    name: string;
    }

    Ich habe eine console.log gemacht, ich rufe die Länder ab

    Geben Sie hier die Bildbeschreibung ein

    Komponente.ts

    In der ngOnInit():Methode habe ich Folgendes hinzugefügt:

    this.service.getPaysDta().pipe(
    takeUntil(this.unsubscribe$)
    ).subscribe((countries) => this.countries = countries);

    ...

     ngOnInit(): void {
    this.registreNational = this.activatedRoute.snapshot.paramMap.get('registreNational');
    this.country = this.activatedRoute.snapshot.paramMap.get('country');
    this.fiscalYear = this.activatedRoute.snapshot.paramMap.get('fiscalYear');
    if (!this.registreNational ||!this.country ||!this.fiscalYear) {
    this.goBack();
    return;
    }
    this.getDta();
    this.service.getPaysDta().pipe(
    takeUntil(this.unsubscribe$)
    ).subscribe((countries) => this.countries = countries);
    }

    Ich verstehe nicht, wie ich die HTML-Datei jetzt ändern muss?

    <tr>
    <th>Country</th>
    <td>{{ country }}</td>
    </tr>

    Vielen Dank

    BEARBEITEN

    Geben Sie hier die Bildbeschreibung ein


    Lösung des Problems

    Angenommen, das wird this.country = this.activatedRoute.snapshot.paramMap.get('country');bewertet als 4...

    Ich würde folgende Änderung vornehmen:

    // new prop
    selectedCountry: Country;
    // update this
    this.service.getPaysDta().pipe(
    takeUntil(this.unsubscribe$)
    ).subscribe((countries) => {
    this.countries = countries;
    // get your selected country
    let selectedCountry = this.countries.find(c => c.id == this.country);
    if(selectedCountry){
    this.selectedCountry = selectedCountry;
    }
    });

    Und dann in Ihrer Vorlage:

    <tr>
    <th>Country</th>
    <td>{{ selectedCountry.name }}</td>
    </tr>

    Wie behebe ich den Fehler des Legacy-Installationsfehlers?

     building 'matplotlib.ft2font' extension

    error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": <https://visualstudio.microsoft.com/visual-cpp-build-tools/>
    [end of output]
    note: This error originates from a subprocess, and is likely not a problem with pip.
    error: legacy-install-failure
    × Encountered error while trying to install package.
    ╰─> matplotlib
    note: This is an issue with the package mentioned above, not pip.
    hint: See above for output from the failure


    Lösung des Problems

    Sie müssen Microsoft C++ Build Tools herunterladen und auf Ihrem System installieren, dann Workloads auswählen und die Option Desktop-Entwicklung mit C++ aktivieren. Sobald dies abgeschlossen ist, können Sie den Installationsbefehl erneut ausführen.

    ODER

    Sie können diese Python-Bibliothek auch von den
    inoffiziellen Windows-Binärdateien für Python-Erweiterungspakete herunterladen

  • Laden Sie die Datei mit dem Namen pip install matplotlib‑3.5.1‑cp38‑cp38‑win_amd64.whl
    Screenshot herunter

  • Öffnen Sie nach dem Herunterladen der Datei cmd in diesem Ordner und führen Sie den Befehl aus:

  • pip install matplotlib-3.5.1-cp38-cp38-win_amd64.whl

  • Ähnliche Antwort

    Fortgeschrittene Probleme beim Vererben von Elternklassen

    Wie kann man dafür sorgen, dass eine Funktion der Elternklasse nicht von der Kindklasse erbt und gleichzeitig außerhalb der Klasse zugegriffen werden kann? so was

    class a:
    def only_a_have():
    print(1)
    class b(a)
    pass
    a().only_a_have() success
    b().only_a_have() error


    Lösung des Problems

    Sie sollten eine NotImplementedErrorAusnahme auslösen:

    class a:
    def only_a_have():
    print(1)
    def everybody_have():
    print(2)
    class b(a)
    def only_a_have():
    raise NotImplementedError()

    Benutzerdefinierte Azure b2c-Richtlinie: Überprüfen auf accountEnabled in der Benutzerreise

    Es tut mir wirklich leid für die offene Frage, aber ich bin neu in benutzerdefinierten Richtlinien und konnte dies nicht allein mit der Dokumentation lösen.

    Ich habe eine benutzerdefinierte Richtlinie, die eine Benutzerreise mit einigen Orchestrierungsschritten enthält, und möchte einen weiteren Orchestrierungsschritt hinzufügen, der nach accountEnabled sucht.

    Wie würde ich das angehen?

    Danke


    Lösung des Problems

    accountEnabled wird zB von "AAD-UserReadUsingEmailAddress" gelesen.

    Sobald Sie es also gelesen haben, gibt es eine ClaimsTransformation in der Basis, die Sie verwenden können:

    "AssertAccountEnabledIsTrue"

    das wird auch vom lesen genannt.

    Oder Sie könnten Folgendes tun:

    <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
    <Value>accountEnabled</Value>
    <Value>True</Value>
    <Action>SkipThisOrchestrationStep</Action>
    </Precondition>

    Laravel 8.60.0 erstellt eine Datei anstelle eines Ordners/Symlinks, wenn ich „php artisan storage:link“ ausführe

    Bild, das zeigt, was PHP Artisan storage:link in meinem Verzeichnis public/ erstellt

    Ich arbeite also an einem kleinen Projekt, bei dem ich einen Symlink erstellen muss, um die Datei im Speicherverzeichnis in Laravel zu speichern. Ich habe zuvor an Windows gearbeitet, wo derselbe Code einwandfrei funktionierte, aber als ich Laravel Sail konfiguriert und in meiner WSL-2Umgebung eingerichtet habe, habe ich meine rituellen Aufgaben zum Einrichten der Konfiguration und zum Erstellen eines symbolischen Links ausgeführt. Ich bemerke ein seltsames Laufverhalten der php artisan storage:linkBefehl, bei dem eine Datei anstelle eines Ordners in meinem App/Public-Ordner erstellt wird.

    Es sollte ein anklickbarer Ordner sein oder wenn nicht anklickbar, sollte zumindest meine IDE es als ein Verzeichnis wie das anderer anzeigen, dh wie public, bootstrap, databaseOrdner. Ist das ein Problem mit meiner WSL oder einer internen Konfiguration von Laravel? Beim Doppelklick auf diesen Link wird angezeigt:

    Beim Anklicken der Datei öffnet sich das Kontextmenü

    Jede Unterstützung wird sehr geschätzt.


    Lösung des Problems

    Wenn Sie es in wsl2 erstellt haben, erkennt Windows es nicht als Symlink, es ist ein Unix-Symlink und kein Windows-Symlink, das ist alles.

    In WSL arbeiten Sie in einem Unix-basierten Dateisystem und teilen Ihr Dateisystem mit Windows.

    Finden von Unterschieden zwischen Datenrahmen beim Iterieren eines Datenrahmenindex

    Ich versuche, Elemente in einem Datenrahmen zu vergleichen, die dieselben Werte, aber unterschiedliche Spaltenindizes haben.

    data1 = {'foo': [1,2,3], 'bar': [4,5,6]}
    data2 = {'foo': [1,2,50], 'boo': [4,5,6]}
    data1 = pd.DataFrame(data1)
    data2 = pd.DataFrame(data2)

    Ich versuche, ein Skript zu schreiben, das die Werte der beiden Datenrahmen basierend auf dem Index vergleicht.

    Die gewünschte Ausgabe ist:

    same
    same
    different
    same
    same
    same

    Da ich verschiedene Spaltennamen behalten sollte, hier mein Code

    #Input
    for row in data1.index:
    if data1.iloc[row, 0] == data2.iloc[row, 0]:
    print('same')
    else:
    print('different')

    Während ich die Spalte erfolgreich durchlaufen kann foo, bin ich noch nicht in der Lage, durch barund zu iterieren boo.

    #Output 
    same
    same
    different

    Wenn ich versuche, nur if data1.iloc[row]beim Schneiden zu bleiben, wird Folgendes ausgegeben:
    ValueError: Can only compare identically-labeled Series objects

    Haben Sie Vorschläge? Vielen Dank


    Lösung des Problems

    Unter der Annahme, dass die Abmessungen übereinstimmen, besteht eine Möglichkeit darin, Folgendes zu verwenden numpy.where:

    out = np.where(data1.to_numpy() == data2.to_numpy(), 'same','different').T.tolist()

    Ausgabe:

    [['same', 'same', 'different'], ['same', 'same', 'same']]

    Sie könnten auch einen DataFrame erstellen:

    out = pd.DataFrame(np.where(data1.to_numpy() == data2.to_numpy(), 'same','different'), columns=['first_column','second_column'])

    Ausgabe:

     first_column second_column
    0 same same
    1 same same
    2 different same

    So richten Sie Bild und Formular nebeneinander aus und es sollte auch in verschiedenen Ansichten wie mobiler Ansicht und Desktop perfekt ausgerichtet sein

    Desktop-Ausrichtungmobile Ansicht

    <div class="box"> 
    <p>contact us</p>
    <form>
    <div>
    <input type="text" name="" required="">
    <label>firstname</label>
    </div>
    <div>
    <input type="text" name="" required="">
    <label>last name</label>
    </div>
    <div>
    <input type="text" name="" required="">
    <label>mail</label>
    </div>
    <div class="button">
    <button type="button">submit <span>&#10230;</span></button>
    </div>
    </form>
    </div>
    <div class="clearfix">
    <img src="https://www.fnordware.com/superpng/pnggrad8rgb.png" >
    </div>
    <style>

    img{
    float: right;
    width:40%;
    height:a;
    margin-right: 190px;
    margin-top:83px;
    height:475px;
    cursor: pointer;
    }
    span{
    content: "\27F6";
    }
    label{
    padding-left: 10px;
    font-size:16px;
    padding-top: 10px;
    }
    .box
    {
    position: absolute;
    top: 50%;
    Left: 25%;
    height:475px;
    transform: translate(-50%, -50%);
    background:green;
    padding: 40px;
    box-sizing: border-box;
    margin-left:1%;
    cursor: pointer;
    }
    .box p
    {
    font-family: 'jmsans', sans-serif;
    padding: 0;
    margin: 0 0 40px;
    color: white;
    font-size: 40px;
    width: 467px;
    }
    .box input
    {
    margin-bottom: 30px;
    width:466px;
    box-sizing: border-box;
    box-shadow: none;
    border: none;
    border-bottom: 2px solid #999;
    outline: none;
    padding-left: 10px;
    font-weight: bold;
    height: 56px;
    }
    .box input[type="submit"]
    {
    border-bottom: none;
    cursor: pointer;
    color: #fff;
    margin-bottom: 0;
    }
    .box form div
    {
    position: relative;
    }
    .box form div label
    {
    position: absolute;
    top: 10px;
    Left: 0;
    color: #999;
    transition:.5s;
    pointer-events: none;
    }
    </style>

    Wenn ich den Code inspiziere und seine Reaktionsfähigkeit in verschiedenen Ansichten (mobil und Desktop) überprüfe, sind Bild und Formular aufgrund von fehlerhaftem Code nicht ausgerichtet, wie dieses Problem behoben werden kann. Wenn ich den Code inspiziere und seine Reaktionsfähigkeit in verschiedenen Ansichten (mobil und Desktop) überprüfe und das Formular ist aufgrund von fehlerhaftem Code nicht ausgerichtet, wie dieses Problem behoben werden kann


    Lösung des Problems

    Sie haben Ihren primären boxContainer auf position: absoluteund mehrere Positionierungsattribute eingestellt, die auf dem Bild nicht vorhanden sind, weshalb sich wahrscheinlich alles verschiebt. Ich weiß nicht, in was dieses Formular und dieses Bild sonst noch eingefügt werden sollen, aber sie scheinen in Ihrem Beispiel nicht notwendig zu sein, also habe ich sie entfernt und eine Flexbox hinzugefügt .flexContainer, um Ihren Inhalt darin einzuschließen, und das hilft, Ihren Inhalt auszurichten eine einzelne Reihe. Sie könnten noch einen Schritt weiter gehen und eine @mediaAbfrage ( https://developer.mozilla.org/en-US/docs/Web/CSS/Media_Queries/Using_media_queries ) hinzufügen, um zu steuern, wie das Bild auf Mobilgeräten reagiert (z Daher erscheint flex-directiondas columnBild auf kleineren Bildschirmen unter dem Kontaktfeld, anstatt sich nach innen zu strecken. `


    .flexContainer {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    }
    img {
    width: 100%;
    height: auto;
    height: 475px;
    cursor: pointer;
    }
    span {
    content: "\27F6";
    }
    label {
    padding-left: 10px;
    font-size: 16px;
    padding-top: 10px;
    }
    .box {
    height: 475px;
    background: green;
    padding: 40px;
    box-sizing: border-box;
    margin-left: 1%;
    cursor: pointer;
    }
    .box p {
    font-family: 'jmsans', sans-serif;
    padding: 0;
    margin: 0 0 40px;
    color: white;
    font-size: 40px;
    width: 467px;
    }
    .box input {
    margin-bottom: 30px;
    width: 466px;
    box-sizing: border-box;
    box-shadow: none;
    border: none;
    border-bottom: 2px solid #999;
    outline: none;
    padding-left: 10px;
    font-weight: bold;
    height: 56px;
    }
    .box input[type="submit"] {
    border-bottom: none;
    cursor: pointer;
    color: #fff;
    margin-bottom: 0;
    }
    .box form div {
    position: relative;
    }
    .box form div label {
    position: absolute;
    top: 10px;
    left: 0;
    color: #999;
    transition: 0.5s;
    pointer-events: none;
    }

    <div class="flexContainer">
    <div class="box">
    <p>contact us</p>
    <form>
    <div>
    <input type="text" name="" required="">
    <label>firstname</label>
    </div>
    <div>
    <input type="text" name="" required="">
    <label>last name</label>
    </div>
    <div>
    <input type="text" name="" required="">
    <label>mail</label>
    </div>
    <div class="button">
    <button type="button">submit <span>&#10230;</span></button>
    </div>
    </form>
    </div>
    <div>
    <img src="https://www.fnordware.com/superpng/pnggrad8rgb.png">
    </div>
    </div>

    Kann nicht von Microsoft-Formularen zu PowerBi gelangen

    Ich versuche, die Daten aus Microsoft-Formularen wie Anzahl der Antworten und Gesamtdaten in Power Bi zu ziehen. Für den Gesamtprozess habe ich auf diesen Link https://flow.microsoft.com/en-us/blog/forms-and-flow-and-powerbi/ verwiesen. Ich konnte jedoch keine Daten aus dem Fluss abrufen, wie das Bild unten zeigt. Gibt es dafür eine Lösung?
    Fluss&BI


    Lösung des Problems

    Ich glaube du verstehst es falsch,

    Sie möchten Daten aus Ms Forms Pro abrufen. Forms Pro hat Entitäten in CDS

    In Laiensprache Forms Pro wurden die folgenden Tabellen in der Datenbank gespeichert, die von CDS gehalten wird (das auch als Dynamics 365-Datenmodell bezeichnet wird). Link for Ref

    Geben Sie hier die Bildbeschreibung ein

    Um nun Daten von einer der oben genannten Entitäten aus Power BI zu ziehen/abzurufen, müssen Sie eine Verbindung mit CDS (Dynamics 365) herstellen.

    Wie verbinden Sie CDS in PowerBI.

    Hier sind ein paar Links


    • Verbindung 1

    • Link2

    Woche des Jahres Microsoft Flow

    Ich habe einen Flow, der jede Woche Daten aus einer SharePoint-Liste abruft und dann eine CSV-Datei aus dieser Liste erstellt. Da es jede Woche ausgeführt wird, möchte ich die Datei benennen, FileName_Week_xxaber ich sehe keinen weekofYearAusdruck oder ähnliches, wenn ich die Datei benenne.

    Gibt es eine Möglichkeit, die anderen Zeitausdrücke zu verwenden oder eine Variable zu erstellen, die bestimmt, in welcher Woche des Jahres die Daten abgerufen werden?


    Lösung des Problems

    Ich denke, Sie können einen Ausdrucksschritt mit so etwas versuchen:

    add(div(dayOfYear(utcNow()), 7),1)

    Bitte beachten Sie die folgende Bildschirmdarstellung der Flow-Schritte, die Sie erstellen können. Ich hoffe es hilft:)

    Geben Sie hier die Bildbeschreibung ein

    Meine tkinter-Schaltfläche funktioniert, führt aber nicht den entsprechenden Befehl aus?

    Ich bin ein ziemlich neuer und unerfahrener Programmierer und arbeite mit python, sqlite3 und tkinter, um ein Business-Management-Tool zu erstellen, um Details über die Mitarbeiter und Kunden eines Unternehmens zu verwalten. Das Problem, mit dem ich konfrontiert bin, ist, dass ich ein Menü in tkinter habe, das den Benutzer auffordert, die Aktion auszuwählen, die er abschließen möchte, aber bei Eingabe der Option wird die Schaltfläche nur gedrückt und die eigentliche Funktion zum Abschließen des Schaltflächenbefehls wird nicht ausgeführt. Ich habe 3 Tage damit verbracht, nach dem Fehler zu suchen, aber ich kann ihn nicht finden. Bitte, ich freue mich über jede Hilfe. Leider kann ich meinen gesamten Code nicht teilen, da die Projektleiter wegen Plagiaten ausflippen. Das problematische Code-Bit und der Screenshot von run sind unten. Danke euch allen.

     def menu():
    global menu_screen
    menu_screen= Tk()
    menu_screen.title('Main Menu') #title of the window
    menu_screen.geometry("1000x500")
    label1=Label(menu_screen,text="(*******menu*******)") #function to print menu options
    label1.pack()
    label2=Label(menu_screen,text="1) Employee Table") #will go to employee menu
    label2.pack()
    label3=Label(menu_screen,text="2) Client table") #client menu
    label3.pack()
    label4=Label(menu_screen,text="3) Staff rota") #timetable
    label4.pack()
    label5=Label(menu_screen,text="4) performance table") #performance menu
    label5.pack()
    label6=Label(menu_screen,text="5) re-display menu") #main menu again
    label6.pack()
    label7=Label(menu_screen,text="6) quit") #finished
    label7.pack()
    labelsel = Label(menu_screen,text = "Please enter your selection:",bg="blue",
    width="300", height="2", font=("Helvetica", 13)).pack()
    select_box= Entry(menu_screen,text= "")#takes selection input
    select_box.place(x = 120, y= 20, width = 100, height =25)
    select_box.focus()
    global selection1 #allows for selcetion variable to be access throughout program
    selection1= select_box.get()
    button = Button(master=menu_screen, text='confirm choice', command=partial(menu_validate))
    button.pack()#button allows to update different detail
    menu_screen.mainloop()
    def menu_validate():
    while selection1!= "":
    if selection1 =="1":
    employee_menu()#calls and executes employee table function
    break
    elif selection1 =="2":
    client_menu()#calls and executes client table function
    break
    elif selection1 == "3":
    timetable() #calls timetable functio
    break
    elif selection1 == "4":
    performance()#calls and executes performance table function
    break
    elif selection1 == "5":
    menu()#re displays the menu
    break
    elif selection1 =="6":
    quit #quitting
    else:
    label_incorrect= Label(text = "Unknown option selected!")
    label_incorrect(x=50, y=60, width=100, height=25)
    menu()#allows the user to choose from menu again if incorrect input, for user
    friendliness.
    def employee_menu():# this function prints a new menu within the employee table
    global emp_screen
    emp_screen = Toplevel(menu_screen)
    emp_screen.geometry("350x300")
    menubar = Menu(menu_screen) #create a menu bar at the top of the window
    emp_menu = Menu(menubar, tearoff=0)
    emp_menu.add_command(label="Add a new employee", command=emp_sel1) #each option goes to a
    new
    function
    emp_menu.add_command(label="Update an existing employees details", command=emp_sel2)
    emp_menu.add_command(label="Delete an employees details", command=emp_sel3)
    emp_menu.add_command(label="Find an employees details", command=emp_sel4)
    emp_menu.add_command(label="Re-display menu", command=employee_menu)
    emp_menu.add_command(label="Quit.", command=quit)
    menubar.add_cascade(label="Employee menu", menu=emp_menu) #adds title to the drop down
    menu
    with sqlite3.connect("SamaritanCare.db") as db: #creates new employee table
    cursor=db.cursor()
    cursor. execute("""CREATE TABLE if not exists employees(
    employeeID text PRIMARY KEY,
    firstname text NOT NULL,
    surname text NOT NULL,
    age integer NOT NULL,
    hours_weekly integer NOT NULL,
    days_work integer NOT NULL);""")
    db.commit()

    Dieses Menü wird angezeigt, aber die Schaltfläche führt nicht employee_menu aus


    Lösung des Problems

    select_box= Entry(menu_screen,text= "")#takes selection input
    select_box.place(x = 120, y= 20, width = 100, height =25)
    select_box.focus()
    global selection1 #allows for selcetion variable to be access throughout program
    selection1= select_box.get()

    In den obigen Codezeilen select_boxwird erstellt, auf dem Bildschirm angezeigt und noch bevor der Benutzer etwas eingeben kann, erhalten Sie den Wert aus dem Eingabefeld. Das ist der Grund, warum selection1immer gleich ein leerer String ist und die menu_validateFunktion nicht darüber hinausgehtwhile selection1!= "":.

    Stattdessen müssen Sie den Wert aus dem Eintrag erst abrufen, nachdem ein Ereignis ausgelöst wurde, z. B. das Klicken auf eine Schaltfläche.

    In Ihrem Code können Sie direkt tunwhile select_box.get()!= "": anstelle von while selection1!= "":. (Vergessen Sie nicht, select_boxeine globale Variable zu erstellen, damit Sie in darauf zugreifen können. menu_validate)

    Auch in Ihrem Fall besteht keine Notwendigkeit zu verwendenpartial werden, um eine Funktion an den commmandParameter zu übergeben. Sie können direkt Folgendes tun:

    command=menu_validate

    anstatt

    command=partial(menu_validate)

    Korrigierter Code:

    def menu():
    global menu_screen, select_box
    menu_screen= Tk()
    menu_screen.title('Main Menu') #title of the window
    menu_screen.geometry("1000x500")
    label1=Label(menu_screen,text="(*******menu*******)") #function to print menu options
    label1.pack()
    label2=Label(menu_screen,text="1) Employee Table") #will go to employee menu
    label2.pack()
    label3=Label(menu_screen,text="2) Client table") #client menu
    label3.pack()
    label4=Label(menu_screen,text="3) Staff rota") #timetable
    label4.pack()
    label5=Label(menu_screen,text="4) performance table") #performance menu
    label5.pack()
    label6=Label(menu_screen,text="5) re-display menu") #main menu again
    label6.pack()
    label7=Label(menu_screen,text="6) quit") #finished
    label7.pack()
    labelsel = Label(menu_screen,text = "Please enter your selection:",bg="blue",
    width="300", height="2", font=("Helvetica", 13)).pack()

    select_box= Entry(menu_screen,text= "")#takes selection input
    select_box.place(x = 120, y= 20, width = 100, height =25)
    select_box.focus()
    button = Button(master=menu_screen, text='confirm choice', command=menu_validate)
    button.pack()#button allows to update different detail
    menu_screen.mainloop()
    def menu_validate():
    selection1 = select_box.get()

    while selection1!= "":
    if selection1 =="1":
    employee_menu()#calls and executes employee table function
    break
    elif selection1 =="2":
    client_menu()#calls and executes client table function
    break
    elif selection1 == "3":
    timetable() #calls timetable functio
    break
    elif selection1 == "4":
    performance()#calls and executes performance table function
    break
    elif selection1 == "5":
    menu()#re displays the menu
    break
    elif selection1 =="6":
    quit #quitting
    else:
    label_incorrect= Label(text = "Unknown option selected!")
    label_incorrect(x=50, y=60, width=100, height=25)
    menu()#allows the user to choose from menu again if incorrect input, for user
    friendliness.

    Yocto INSANE_SKIP wird ignoriert

    Ich habe ein npm-Paketrezept für node-red-node-serialport mit erstellt

    devtool add "npm://registry.npmjs.org;package=node-red-node-serialport;version=1.0.1"

    Das Problem ist beim Bauen bekomme ich:

    WARNING: node-red-node-serialport-1.0.1-r0 do_compile: Use of configs argument of NpmEnvironment.run() function is deprecated. Please use args argument instead.
    WARNING: node-red-node-serialport-1.0.1-r0 do_compile: Use of configs argument of NpmEnvironment.run() function is deprecated. Please use args argument instead.
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/android-arm/node.napi.armv7.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/android-arm64/node.napi.armv8.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/linux-arm/node.napi.armv6.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/linux-arm/node.napi.armv7.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/linux-arm64/node.napi.armv8.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/linux-x64/node.napi.glibc.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: QA Issue: File '/usr/lib/node_modules/node-red-node-serialport/node_modules/@serialport/bindings-cpp/prebuilds/linux-x64/node.napi.musl.node' from node-red-node-serialport was already stripped, this will prevent future debugging! [already-stripped]
    ERROR: node-red-node-serialport-1.0.1-r0 do_package: Fatal QA errors found, failing task.
    ERROR: Logfile of failure stored in: /home/alex/Projects/yocto/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/node-red-node-serialport/1.0.1-r0/temp/log.do_package.75444
    ERROR: Task (/home/alex/Projects/yocto/meta-t5/recipes-devtools/node-red-node-serialport/node-red-node-serialport_1.0.1.bb:do_package) failed with exit code '1'

    Also habe ich versucht, hinzuzufügen

    INSANE_SKIP_${PN} += "already-stripped"

    im Rezept und in einem bbappend bekomme ich aber immer noch den Fehler.


    Lösung des Problems

    Ich habe die Lösung gefunden, da ich Honister verwende, lautet die korrekte Syntax für den Ignore-Befehl:

    INSANE_SKIP:${PN} += "already-stripped"

    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, ...