if sum(kombinace) == 15:
neco
if sum(kombinace) == 15:
neco
>>> s = "nazdar"
>>> s[0]
'n'
Těžko hádat bez kódu. Možná ti ten ajax vůbec neproběhne, nebo vrátí chybu. Na záložce "Network" by mělo jít vidět, jestli to něco dělá a s jakým výsledkem.
#7 Honza
Takže tím je to divný, nejprve používali novější GDI+ a pak kvůli kompatibilitě přešli na GDI?
GDI+ není novější v tom smyslu, že by nahrazovalo staré GDI (i když má nové fíčury), ale prostě existují paralelně. I když původní plán nejspíš byl, že všechno pěkně vymazlí a bude to paráda. Na GDI pak přešli kvůli výkonu, je to hnusný, ale rychlý :) Kompatibilita v názvu té property znamená jen to, že si můžeš zapnout vykreslování postaru.
Tak teď máš globální úplně všechno tak na jedné proměnné asi nesejde. Každopádně nemá smysl, aby ta funkce svůj výsledek někam ukládala misto, aby ho prostě vrátla returnem.
def kontrola_radku(hraci_plocha):
for i in range(3):
if hraci_plocha[i].count("X") == 3:
return "X"
if hraci_plocha[i].count("O") == 3:
return "O"
def kontrola(hraci_plocha):
return (
kontrola_radku(hraci_plocha)
or kontrola_sloupce(hraci_plocha)
or kontrola_diagonaly(hraci_plocha)
)
def main():
hraci_plocha = ...
while not (vitez := kontrola(hraci_plocha)):
# takhle je trochu blbé, že to udělá první kontrolu, i když ještě není co kontrolovat, ale na tom nesejde
# ...
print("vyhrál", vitez)
if __name__ == "__main__":
main()
Ve výsledku v obou případech používáš globální proměnnou, což je to čemu je dobré se vyhnout.
Pravděpodobně to půjde přesat třeba tímhle stylem:
while item := get_data():
doX(item)
doY(item)
for item in get_data():
doX(item)
doY(item)
Popiš víc, co konkrétně chceš dělat, pak se dá konkrétněji poradit.
1) Nebudeš dělat místo pro tlačítka, ale prostě tam vložíš tlačítka. Ale VBox teda vkládá widgety pod sebe, tak ta tlačítka můžeš ještě zabalit do HBoxu (vedle sebe) a ten pak vložit do VBoxu.
2) Netuším, co myslíš.
3) mělo by jít použít třeba metodu resize.
from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton, QWidget
from matplotlib.backends.backend_qtagg import FigureCanvas
from matplotlib.figure import Figure
class ApplicationWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(500, 500)
self._main = QWidget()
self.setCentralWidget(self._main)
vbox = QVBoxLayout(self._main)
hbox = QHBoxLayout()
for i in range(4):
button = QPushButton(f"Button {i}", self)
hbox.addWidget(button)
vbox.addLayout(hbox)
figure_canvas = FigureCanvas(Figure())
vbox.addWidget(figure_canvas)
ax = figure_canvas.figure.subplots()
x = y = [2, 4, 6, 8]
ax.plot(x, y)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
win = ApplicationWindow()
win.show()
app.exec()
Nevím, jestli je backend_qt5agg použitelný s PyQt6 (zkus backend_qt6agg [netuším, jestli existuje] nebo backend_qtagg [bez čísla]). Ale jinak je to celé. Tak jak do toho okna vkládáš jiné widgety, tak stejně tam vložíš i ten FigureCanvas. A aby ti widgety reagovaly na změnu velikosti okna, tak je nebudeš pozicovat absolutně, ale použiješ nějaký layout manager.
Příklad je v dokumentaci.
Netuším, co u těch louží znamená ta hodnota 1000 a proč pak ty hodnoty testuješ místo abys ten interval rovnou definoval, jak ho chceš mít.
Jestli správně chápu, co chceš tím větším rozestupem louží, tak na to můžeš použít funci randrange(od, do, krok). Stejné parametry má i funkce range a můžeš je využít při kreslení příček toho žebříku.
A když je to program na podprogramy/funkce, tak je trochu k ničemu funkcí řešit jen jednu věc.
import random
import tkinter
def nakresli_dvojici_krapniku(canvas, x, delka, y_strop, y_podlaha):
x1, y1 = x, y_strop
x2, y2 = x, y_strop + delka
canvas.create_line(x1, y1, x2, y2, fill="green")
x1, y1 = x, y_podlaha - delka
x2, y2 = x, y_podlaha
canvas.create_line(x1, y1, x2, y2, fill="green")
def nakresli_louzi(canvas, x, y, sirka, vyska):
vlevo, vpravo = x, x + sirka
nahore, dole = y, y + vyska
canvas.create_oval(vlevo, nahore, vpravo, dole, fill="blue")
def nakresli_zebrik(canvas, x, y, sirka, vyska, rozestup):
vlevo, vpravo = x, x + sirka
nahore, dole = y, y + vyska
canvas.create_line(vlevo, nahore, vpravo, nahore, fill="brown", width=3)
canvas.create_line(vlevo, dole, vpravo, dole, fill="brown", width=3)
for pricka in range(vlevo + rozestup, vpravo, rozestup):
canvas.create_line(pricka, nahore, pricka, dole, fill="brown", width=3)
# zacatek
canvas_width, canvas_height = 700, 400
canvas = tkinter.Canvas(width=canvas_width, height=canvas_height)
canvas.pack()
# krapniky
for x in range(canvas_width):
delka = random.randint(20, 70)
nakresli_dvojici_krapniku(canvas, x, delka, 0, canvas_height)
# louze
pocet = random.randint(10, 20)
for i in range(pocet):
x = random.randrange(100, canvas_width - 100, 50) # střílím od boku. netuším, jak toto chceš mít
y = random.randrange(100, canvas_height - 100, 50)
sirka = random.randint(20, 100)
vyska = random.randint(20, 100)
nakresli_louzi(canvas, x, y, sirka, vyska)
# zebrik
nakresli_zebrik(canvas, 0, 150, canvas_width, 70, 70)
tkinter.mainloop()
for x in range(50):
^
Ta funkce jen nakreslí dvě čáry. Když si ji přečteš, tak přece musíš hned vidět význam těch parametru.
Ta funkce prostě dostává nějaké parametry. Jeden z nich je canvas, na který má kreslit.
Obě čáry uvidíš, když parametr pro pozici podlahy upravíš tak, aby odpovídal tomu, jak velký máš canvas.
def nakresli_dvojici_krapniku(canvas, x, delka, y_strop, y_podlaha):
x1, y1 = x, y_strop
x2, y2 = x, y_strop + delka
canvas.create_line(x1, y1, x2, y2, fill="green")
x1, y1 = x, y_podlaha - delka
x2, y2 = x, y_podlaha
canvas.create_line(x1, y1, x2, y2, fill="blue")
# ...
delka = random.randint(20, 70)
nakresli_dvojici_krapniku(canvas, x, delka, 10, 390)
Souřadnice jsou 0,0 vlevo nahoře a rostou směrem doprava a dolů. Tak je zadáš tak, jak je chceš mít a uděláš ty čáry dvě. Na vygenerování té delky můžeš použít třeba metodu randint z modulu random.
nevím kam to mám napsat
Jakpak je to možné?
Tak vygeneruješ tu délku krápniku od 20 do 70 a pak stejně dlouhou čáru nakreslíš na obě strany.
Něco ve stylu nahoře od 0 do délkakrápníku a pak dole od výškaplátna-délkakrápníku do výškaplátna.
To RGB jsou jednotlivé barevné komponenty (red, green, blue) výsledné barvy.
Jasně tam vidíš červený, zelený a modrý pruh. To mezi tím je přechod mezi těmi barvami. Takže třeba mezi červenou a zelenou začínáš na plně červené, chvíli přidáváš zelenou (z červené vzniká žlutá) a pak zase ubíraš červenou (ze žluté vzniká zelená). Podobně pro další přechody.
Nevím, jestli záleží na tom, jak konkrétně budete ten přechod generovat, ale ta ukázka vypadá na cosinus.
A nakonec je tam to, že dolní pixely jsou tmavší než horní. Nejspíš to půjde celé nacpat do jedné šikovné rovnice, ale je to jen primitivní šaškování se třemi čísly.
Jestli potřebuješ poradit víc, tak napiš, co konkrétně máš a co nevíš a nechoď sem jen se zadáním. Ve školách se prostě nedávají úkoly na věci, co nemůžete znát a jestli dostávate všichni koule, tak jste všichni dementi.
S čím konkrétně si nevíš rady?
Neni v tom zadny rozdil?
Do "text\ntext" jde vkladat zalamovani radku pres \n.
To platí třeba v PHP nebo Perlu. Kód v dotazu je JavaScript a tam mezi ' a " není rozdíl.
Proč nenapíšeš přímo to, co chceš vědět? Jaký je rozdíl mezi řetězcovými konstantami definovanými v apostrofech a uvozkovkách. Žádný.
table_data = []
for row in data:
if zs in row[5]:
table_data.append(row)
Nebo úsporněji:
table_data = [row for row in data if zs in row[5]]
Ale to už napsal Pavel. Já jsem chtěl doplnit, že i v té šabloně renderuješ jen jeden řádek.
{% for row in data %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
Jo, ty registry se "překrývají" a jen ah je "posunutý".
6 5 4 3 2 1
4321098765432109876543210987654321098765432109876543210987654321
^------------------------------rax-----------------------------^
^--------------eax-------------^
^------ax------^
^--ah--^^--al--^
Ale, když na 64b systému zapíšeš do 32b registru, tak se horních 32b vynuluje.
mov rax,0xfffffffffffffff0 ; rax = 0xfffffffffffffff0
or al,1 ; rax = 0xfffffffffffffff1
or ax,2 ; rax = 0xfffffffffffffff3
or eax,4 ; rax = 0xfffffff7 !
or rax,8 ; rax = 0xffffffff
To je ten selektor.
Kompletní adresa má formát segment:offset a výsledek je segment+offset. V 32-bit režimu jsou místo segmentů selektory, takže je to selektor:offset a výsledek je bázová_adresa_selektoru+offset. Ta bázovka je definovaná v těch deskriptorech v GDT/LDT.
A většinou se pracuje jen s offsety, tj. selektor se nemění a je dán prováděnou instrukcí (kód je na cs:xxx, data jsou na ds:xxx, zásobník je na ss:xxx, ...). Když se někde píše, že adresa aktuálně prováděné instrukce je v registru eip (nebo ip/rip, teď jsme ve 32-bit, tak eip), tak ve skutečnosti je to cs:eip, ale cs nás nezajímá.
Takže pro jmp většinou definuješ jen offset:
jmp offset
; eip = offset
Ale můžeš uvést i kompletní adresu:
jmp selektor:offset
; cs = selektor
; eip = offset
Ten selektor má nějaký význam/formát a ve tvém případě je to teda 1<<3 (čili 8, nebo binárně 1000), což znamená toto:
DDDDDDDDDDDDDPPT
0000000000001000
D = deskriptor 1
P = privilege level 0 (to je na další povídání)
T = table 0 (GDT)
Takže v pseudokódu to jakoby dělá toto:
jmp GDT[1]:start32
A i mně to "zavání" Montezem.
Při učení od začátku se naučíš, že instrukce jmp skočí na zadanou adresu a assembler, také zvaný jazyk symbolických adres, mimo jiné umožňuje místo adres psát symboly, které je ovšem potřeba nejdříve definovat.
...
jmp mujlabel
...
mujlabel:
; sem to skoci
Tady je far jump s uvedením selektoru, který je definovaný v GDT (s komentářem x32 code descriptor), ale výsledek je stejný.
Kompletní kód po kompilaci nepřilinkuješ "někam", ale zapíšeš ho do boot sektoru disku, ze kterého nabootuješ. Proces zavádění systému je opět potřeba nejdříve nastudovat. Nicméně v téhle fázi to nic nedělá.
Nejde vzít náhodných 10 řádků z třetí kapitoly nějaké knihy a jaksi magicky to rozchodit.
Není možné, aby ses se za tu dobu, co sem chodíš, nenaučil vůbec nic. Chodíš sem jen trollit. Tak si užij nedělní večer, čau.
Tak to máš veliké štěstí, protože v mojí odpovědi máš jejich řešení.
Takže jsi typ toho parametru změnil z int na DateTime. OK
A pak jsi ještě zrušil metodu Main. Proč?
A co ti v tom brání?
Rozměry pole se nezadávají jakou double. Tj. ne [10.0, 10.0] ale [10, 10]. A pokoušíš se definovat pole 10x10, ale incializuješ ho hodnotami 10x2.
Při přístupu k hodnotám pole se jako indexy také nepoužívají doubly a to pole je přece dvourozměrné. Takže ne [double], ale [int,int].
date = d;
Pokoušíš se přiřadit int do DateTime. Je snadné na to přijít, protože přesně to se píše v chybové hlášce.
Dvourozměrné pole je jako pole polí, tj pole jehož položky jsou zase pole.
Takže nejdřív ti to vytvoří pole s 16 položkami.
triangle = {
/* 0*/ null,
/* 1*/ null,
/* 2*/ null,
...
/*15*/ null,
}
Pak to tohle pole projde a naplní ho hodnotami (těmi vnitřními poli s délkou a obsahem podle aktuálního indexu).
triangle = {
/* 0*/ {0},
/* 1*/ {0,1},
/* 2*/ {0,1,2},
...
/*15*/ {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
}
Konstrukce for (X : Y) provede tělo cyklu pro každý prvek kolekce Y s tím, že aktuální prvek je v X. Takže to projde položky vnějšího pole (což jsem teda zase pole) a pak položky toho vnitřního pole (inty) a vypíše je.
Otazníky za printem a dotaz, jak zavolat metodu mě vytáčí. Prošel jsi několika programovacími jazyky a roky se ptáš na základní věci, které všude fungují stejně.
Tak nebudeš barvu určovat podle toho, jestli je kulička napravo nebo nalevo, ale podle toho, jestli je nahoře nebo dole.
Místo X budeš testovat Y.
Obdélník je definovaný souřadnicemi (x1, y1, x2, y2). S čím potřebuješ poradit?
Když je X vetší nebo rovno 190, tak uděláš kuličku červeně, jinak modře. Takže napravo máš červené a nalevo modré.
Co na tom změnit? Peter už ti odpověděl. Budeš testovat Y.
In [1]: len("hrcprc")
Out[1]: 6
In [2]: "hrcprc".count("r")
Out[2]: 2
V GIS se z výškových dat dělá tzv. hillshade, možná by ti to mohlo stačit a umí to třeba GDAL. Není úplně rychlý, ale jde to.
gdaldem hillshade inheightmap.png -of PNG outshade.png
# + případně další parametry na umístění zdroje světla
Pak vím, že třeba POV-Ray umí vyrenderovat výškovou mapu. Ten nemám nainstalovaný a z hlavy to nedám, ale je to příkaz height_field. To je teda ray tracer a taky nebude rychlý.
Parallax mapping je jen takové šizení světla na placaté textuře, ale ty obrázky, jak je máš tady by to mělo zvládnout. Nemusíš se nic moc učit, jen najdi nějaký ukázkový program, který to dělá a místo textury dej šedý čtverec a místo height mapy tu svoji.
Koukl jsem na to jen rychle, tak si nejsem jistý, ale zdá se mi, že to negeneruje přímo Astra. Nemáš tam aktivní ještě nějaký plugin?
Přinejhorším je to v samostatném divu, tak by měl jít pomocí CSS skrýt.
Mně to zní tak, že máš ten server pod kontrolou, tak tam asi můžeš implementovat i ukládání a stahování toho obsahu.
Jinak jak píše Peter, přímo do souboru zapisovat nemůžeš, ale můžeš to ukládat v prohlížeči a pak stáhnout (Blob + window.URL.createObjectURL).
Nebo teda varianta asi stravitelnější pro začátečníka:
puvodni = [2,4,3,1]
zamichany = puvodni[:]
random.shuffle(zamichany)
pozice = []
for hodnota in puvodni:
pozice.append(zamichany.index(hodnota) + 1)
print("puvodni ", puvodni)
print("zamichany", zamichany)
print("pozice ", pozice)
list má metodu index, která vrátí pozici zadané hodnoty
pozice = [zamichany.index(hodnota) + 1 for hodnota in puvodni]
Ty plochy si můžeš definovat jak chceš, já ani ty možnosti pořádně neznám. Toto mi připadá jednoduché:
# grid 2x10 a která políčka obsadit
ax1 = plt.subplot(2, 10, (1, 7))
ax2 = plt.subplot(2, 10, (11, 20))
StandardError
wget vypisuje na stderr a jde to změnit parametrem -o-.
List se indexuje od 0 a k ničemu ho nepotřebuješ. Na vracení hodnot z funkce je příkaz return.
def getdata():
ser.reset_input_buffer()
ser.write(b"r")
serial_data = ser.read(SAMPLES * 4)
unpacked_data = s.unpack(serial_data)
ser.close()
return unpacked_data
To FFT máš skoro správně. Zkus to spustit a poopravuj, to co řve :)
import random
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
def getdata():
return (
[random.random() for _ in range(100)],
[random.random() for _ in range(100)]
)
def update(event):
set1, set2 = getdata()
line1.set_ydata(set1)
line2.set_ydata(set2)
plt.draw()
fig, (ax1, ax2) = plt.subplots(2)
set1, set2 = getdata()
line1, = ax1.plot(set1)
line2, = ax2.plot(set2)
btnax = plt.axes([0.4, 0.9, 0.2, 0.1])
button = Button(btnax, 'Update')
button.on_clicked(update)
plt.show()
eval(f"TEST_{i}")
Ale takové brikule se nedělají. Použij něco "normálního"
test = [10, 20]
test[0] # 10
test[1] # 20
#8 Montezo
To je přesně ten problém. Nechápeš na tom kódu ani písmenko, že to je jméno třídy, že ji nejdřív musí někdo napsat. Desetkrát ti může člověk vysvětlit, jak to funguje a ty se znova zeptáš, proč někde nějaká třída není vidět a čekáš kouzelnou radu bez toho, že bysme ten kód viděli. Takže zpátky k tomu telefonnímu seznamu.
Odkud to máš?
Ptáš se pořád na to samé.
Čínsky se nenaučíš tak, že budeš zírat na čínský text. Šachy se nenaučíš tak, že budeš hrát s velmistrem. Prostě musíš projít postupným učením.
Já jsem si myslel, že jako zralý chlap s jasným cílem (mně je taky přes 40) se tomu budeš systematicky věnovat a i když na to třeba máš čas jen pár hodin o víkendu, tak to dáš. Ale ty po buhví jak dlouhé době nedáš dokupy pár příkazů, děcka se ti tady smějou a ty místo, aby ses nasral a máknul, tak pořád vymýšlíš koniny.
Buď vrtáš do hotového projektu, tak tam není potřeba doplňovat usingy. Nebo to smolíš sám a tu třídu tam prostě nemáš.
Tak dej odkaz na ten skript a já se podívám, jak funguje.
Nějaký projekt eshopu má nějakou třídu Product. Co čekáš, že ti k tomu Google řekne?
Udělej si telefonní seznam, nebo piškvorky, nebo prostě něco pro začátečníky a nevrtej se v kódu, kde nechápeš ani řádek.
A syntaxi už ses naučil? Nehodila by se tam někam složená závorka?
A na serverý projekt prostě nemáš, tak to nedělej.
Find in files (ctrl+shift+f)
Třeba se vrať ve svých studijních materiálech o 15 kapitol zpátky.
Když třeba v namespace "Hrc" implementuješ třídu "Prc", tak její celé jméno je "Hrc.Prc". Nebo můžeš použít "using Hrc" a pak psát jen "Prc", protože using definuje, ve kterých "jmenných prostorech" se mají vyhledávat "jména".
Takže těch usingů je nekonečně mnoho, protože každý si může věci pojmenovat libovolně. A můžeš Hrc nebo Prc zkoušet do aleluja a nebude to fungovat, dokud překladač nemá jejich implementaci.
Což je jedna z věcí, kterou najdeš v popisu toho chybového kódu. Zřejmě ti chybí nějaké závislosti.
Jak, co z toho? Třída implementující nějaký interface musí implementovat metody definované v tom interface.
Nevím, možná je toto příliš brzy. Takhle se to spustí až když se všechno načte:
$(window).on("load", function() {
route.scrn([200, 50, 50, 50, 200]);
});
Jinak se zeptej autora "routescrn.js" jak se má používat.
Teď ti to při kliknutí vytáhne z toho elementu text a spustí ho jako skript. Tak ho spusť rovnou.
<script type="text/javascript">
$(function() {
route.scrn([200, 50, 50, 50, 200]);
});
</script>
To je jen jako nápověda pro editor, že ten blok kódu patří k sobě a pak jde ten region vizuálně sbalit a rozbalit.
A pokud teda chceš zachovat to, že ten kód je v divu a zároveň ho chceš spustit, tak ten kód nemusíš psát dvakrát. Třeba takhle:
<script type="text/javascript">
$(function() {
var code = $("#iddivuskodem").text();
eval(code);
});
</script>
<script type="text/javascript">
$(function() {
TO_CO_MAS_V_TOM_DIVU
});
</script>
Nechápu dotaz. Když máš třeba jeden čtverec 50x50 a pak druhý umístíš o 50 pixelů dál (nebo níž, nebo něco), tak bude vedle (nebo pod...) toho prvního. Nevím v čem je problém.
for y in range(20, 220, 20):
color = random.choice(("white", "black", "red", "green", "blue", "cyan", "yellow", "magenta"))
canvas.create_text(50, y, text="python", fill=color)
Přesně to jsem napsal.
& - and - výsledek bude 1 pokud oba operandy jsou 1
| - or - 1 pokud alespoň jeden z operandů je 1
^ - xor - 1 pokud pouze jeden z operandů je 1
<< - shl - bitový posun do leva
>> - shr - bitový posun do prava
Na úrovni procesoru to funguje stejně. Když třeba na x86 použiju prefix LOCK, tak se cache zamkne do dokončení instrukce.
Nemotej do toho cache a zásobník, když nevíš, co to je.
Lock funguje v podstatě takhle:
while (lock != 0) {
// čekám na odemčení
}
lock = 1; // zamknu
// něco dělám
...
lock = 0; // odemknu
Konkrétně tomuhle se říká spin-lock a ten while+lock je implementován atomickými instrukcemi. Samozřejmě nemusí být vždycky vhodné, aby každé vlákno takhle aktivně ten zámek pořád dokola testovalo a tak se třeba uspí a pak probudí po jeho odemčení apod.
To je celé, když nějaké vlákno chce lock, který už drží jiné vlákno, tak se "zasekne" dokud ho předchozí držitel nepustí.
Leda kulový. Kolik těch příkazů je? Projít je a udělat si představu o jejich použití je max na jeden den.
A mě při pití čaje bolí oko. Zkus nějak vydedukovat, že to souvisí s tím, že z hrnku nevytahuju lžičku.
Jaká tabulka by tam měla být; jak jsi ten příkaz napsal; co ti to hlásilo po jeho spuštění; vybral jsi správnou databázi nebo dokonce server; není potřeba ten seznam refreshnout? Křišťálová koule v servisu.
Vždyť s třídami a objekty děláš pořád dokola a najednou nevíš. Máš třidu a vytváříš její instance a přes ně pak můžeš přistupovat k jejim veřejným proměnným a metodám.
class Clovek
{
public String jmeno; // instancni promenna
public Clovek(String jmeno) {
this.jmeno = jmeno;
}
}
...
Clovek c1 = new Clovek("Pepik");
Clovek c2 = new Clovek("Honzik");
System.out.println(c1.jmeno + " a " + c2.jmeno); // Pepik a Honzik
c2.jmeno = "Jirik";
System.out.println(c1.jmeno + " a " + c2.jmeno); // Pepik a Jirik
A pak můžeš mít taky třídní proměnné (static), které nejsou spjaté s konkrétní instancí a když k nim přistupuješ přes instanci, tak to jde, ale dostaneš warning.
class Math
{
public static final double PI = 3.14; // tridni promenna
}
...
System.out.println(Math.PI); // OK
Math m = new Math();
System.out.println(m.PI); // jde, ale dostanes warning
Nevím, možná se zkus podívat jestli nemáš nějakou starší verzi těch knihoven.
Já jsem je instaloval až teď, takže mám poslední socks 2.6.1 a socks-proxy-agent 6.1.1 a chodí to.
Mně to takhle funguje (i s .onion). Hlásí to nějakou chybu?
join objednavky-zakaznici, sum castka, group by zakaznik, where rok 2021, order by suma, limit 10
Proč máš external-path zakomentovaný?
Jo.
Pomocí Timeru můžeš spustit TimerTask. Pak bacha na to, že poběží v jiném vlákně. Jestli chceš sahat na UI, tak můžeš použít třeba runOnUiThread nebo Handler (a v tom případě se pak obejdeš i bez Timeru, protože Handler má metody postAtTime a postDelayed).
Skoro, akorát se "neaktivuji" a "neupravují" částečně.
Přetížení: Metody mají stejné jméno, ale jiné parametry. Jde o různé metody a podle toho s jakými parametry je voláš se pozná, která se má zavolat.
Překrytí: Odvozená třída dědí metody rodičovské třídy. Metody definované v odvozené třídě překrývají (resp. mohou překrývat) metody zděděné z rodičovské třídy.
Prostě místo jedné adresy předáš seznam adres. Ten pak v cyklu projdeš, zpracuješ a vrátíš seznam výsledků.
Případně nemusíš vracet seznam výsledů, ale můžeš je reportovat průběžně. Tj. v tom cyklu použiješ publishProgress pro poslání dat do onProgressUpdate.
Pokud chceš to stahování dělat paralelně, tak prostě vytvoř samostatný task pro každou adresu. Ideálně asi v kombinaci s ThreadPoolExecutorem, kde definuješ velikost fronty a kolik tasků se má zpracovávat souběžně.
V Kotlinu nedělám, takže konkretní kód ti neukážu.
Někde v nastavení projektu se dá nastavit s jakým pracovním adresářem se má program spouštět. Nebo můžeš programově zjistit, kde ten exáč je, ale nejspíš to nepotřebuješ.
Už teď když ten program spustíš přímo, třeba z průzkumníka, tak pracovní adresář bude adresář exáče.
File.WriteAllText při chybě háže vyjímku, takže buď dostaneš vyjímku z popisem chyby, nebo k chybě nedošlo a ten soubor se vytvořil. Možná jen je jinde, než ho očekáváš.
Windows (a další systémy) mají koncept "pracovního adresáře" a program může mít jiný pracovní adresář, než je umístění programu. Když název souboru není uveden s celou cestou, tak se vytváří v tom pracovním adresáři. Jestli to spouštíš z VS, tak tam to bývá tak, že pracovní adresář není adresář s exáčem. Prohledej adresář projektu.
var json = JsonConvert.SerializeObject(query); // serializuj objekt do souboru JSON
var result = json;
File.WriteAllText("vystup.json", json); // data jsou zapsána do souboru vystup.json
Console.WriteLine(result);
Do souboru zapisuješ stejnou hodnotu, jakou vypisuješ na konzoli. Pořád nechápu v čem je problém.
Jestli to správně chápu, tak balón sestřelíš tím, že na něj klikneš.
Objekt z canvasu můžeš odstranit pomocí .delete a místo globálního click-handleru a zjišťování, na co jsi kliknul, bude jednodušší nastavit ten handler přímo na tom balónu pomocí .tag_bind.
Taky by se asi hodilo, aby tělo toho balónu i jeho provázek byl jeden objekt, ať to nemusíš dohledávat.
Pohyb pak uděláš tak, že pomocí .after budeš periodicky ty balóny posunovat.
Třeba nějak takhle:
import tkinter
class Balloon:
def __init__(self, canvas, x, y):
self.alive = True
self.canvas = canvas
self.balloon = canvas.create_oval(x, y, x + 40, y + 50, fill="red")
self.string = canvas.create_line(x + 20, y + 50, x + 20, y + 90)
self.canvas.tag_bind(self.balloon, "<Button-1>", self.kill)
def move(self):
if self.alive and self.canvas.coords(self.balloon)[1] > 0: # coords == (x1, y2, x2, y2)
self.canvas.move(self.balloon, 0, -10)
self.canvas.move(self.string, 0, -10)
def kill(self, event):
if self.alive:
self.canvas.delete(self.balloon)
self.canvas.delete(self.string)
self.alive = False
def create_balloons(canvas):
balloons = []
for x in range(1, 400, 75):
balloons.append(Balloon(canvas, x, 300))
return balloons
def move_balloons(canvas, balloons):
for balloon in balloons:
balloon.move()
canvas.after(100, move_balloons, canvas, balloons)
canvas = tkinter.Canvas(width=450, height=400)
canvas.pack()
balloons = create_balloons(canvas)
canvas.after(100, move_balloons, canvas, balloons)
tkinter.mainloop()
Já si myslím, že by to takhle mohlo fungovat. Co se ti tam zapíše a co chceš jinak?
Pokud je to reálný ukol z nějakého cvičeni, tak se dá předpokládat, že to teda asi bude řešitelné v rozumném čase i bez účasti na tajném čínském sympóziu o algoritmech minulý týden.
Možná česká slova opravdu mají takové parametry, že to nebude taková hrůzna, nebo je ten seznam pečlivě vybraný, nebo něco.
Zkus pogooglit a opsat nějaký z existujících algoritmů a uvidíš.
V csproj je definice projektu. V podstatě seznam souborů (To bývalo. Myslím, že dnes už se tam ani nezapisují) a nastavení.
Včera ses ptal k čemu je foreach, takže na NuGet zatím zapomeň. Ale jo, stáhne ti to nějaký balíček, ve kterém jsou implementované nějaké třídy.
Takže nějaká forma grafu, kde jen mezi některými uzly budou spoje? To co tady v nějaké formě napsal úplně každý? A není to 100k kombinací, ale 100k slov, což je mrtěmegamoc kombinací.
Ono by mohlo stačit tu dllku neunloadnout, nebo vytvořit kopii toho stringu.
orig := DllFunc();
copy := Copy(orig, 1, Length(orig));
orig := '';
Ale ruku do ohně za to nedám. Nejjistější bude stringy z programu a dllky nemíchat. Třeba předávej proceduře v dllce buffer k naplnění.
procedure GetString(buf: pchar; var bufsize: integer); stdcall;
...
k listování vším čím jde listovat
std::wifstream wif("input.txt");
wif.imbue(std::locale(std::locale(), new std::codecvt_utf8<wchar_t>));
std::wofstream wof("output.txt");
wof.imbue(std::locale(std::locale(), new std::codecvt_utf8<wchar_t>));
std::wstring line;
while (getline(wif, line))
{
std::replace(line.begin(), line.end(), L'č', L'c');
wof << line << "\n";
}
Takže výše uvedeným postupem převedeš ty seznamy na čísla a ta sečteš.