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.

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