#2 KIIV
Hluboká, hluboká, HLUBOKÁ poklona! Vaše lama se plazí v prachu, čumák má až u země! To je přesně ten jeden řádek, který to spravil. Děkuji!
Příspěvky odeslané z IP adresy 84.16.103.–
Dobrý den,
mám program Open Hardware Monitor, který ukládá informace o hardwaru do WMI (Windows Management Instrumentation). Napsal jsem program, který je z WMI tahá ven a přes USB posílá na LCD displej. Problém je, že tu část kódu, která se stará a přístup do WMI, jsem našel na netu a strašlivě mi leakuje RAM, což je u programu, který má běžet pořád, celkem záasadní věc... Po cca třech hodinách ten program zabírá 1 GB RAM. Nevidíte někde na první pohled něco, co by chtělo uvolnit nebo dealokovat?
Funkce:
function GetWMIstring(wmiHost, root, wmiClass, wmiProperty, co: string): string;
var
objWMIService : OLEVariant;
colItems : OLEVariant;
colItem : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
function GetWMIObject(const objectName: String): IDispatch;
var
chEaten: Integer;
BindCtx: IBindCtx;//for access to a bind context
Moniker: IMoniker;//Enables you to use a moniker object
begin
OleCheck(CreateBindCtx(0, bindCtx));
OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker));//Converts a string into a moniker that identifies the object named by the string
OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));//Binds to the specified object
end;
begin
objWMIService := GetWMIObject(Format('winmgmts:\\%s\%s',[wmiHost,root]));
colItems := objWMIService.ExecQuery(Format(co,[wmiClass]),'WQL',0);
oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
while oEnum.Next(1, colItem, iValue) = 0 do
begin
Result:=colItem.Properties_.Item(wmiProperty, 0); //you can improve this code ;) , storing the results in an TString.
end;
end;
Volání:
try // Prikon CPU
CoInitialize(nil);
try
str := (GetWMIstring('.', 'root\OpenHardwareMonitor', 'Sensor','Value', 'SELECT * FROM Sensor WHERE INSTANCEID = "3860"'));
pos := ansipos(',', str);
if pos>0 then final := copy(str, 1, pos-1) else final:=str;
Label1.Caption :=final;
ven:=final;
finally
CoUninitialize;
end;
except
on E:Exception do
Begin
Writeln(E.Classname, ': ', E.Message);
Readln;
End;
end;
P.S.: druhá část kódu, která to udesílá přes USB je v pohodě, když jsem jednotlivé části zakomentoval, tak jsem zjistil, že to dělá ta, která tahá informace z WMI.
Díky za tipy!
Asi je to trapný dotaz, ale s JSON jsem nikdy nepracoval. Mám parser, ale jak sakra dostanu data do stringu, který ten parser bude chroupat?
Konkrétně potřebuji tohle: http://202.127.24.18/bin/astro.php?lon=16.3&lat=49.9&ac=0&unit=metric&output=json&tzshift=0 jakýmkoliv způsobem dostat v JS do stringu.
Když to dělám přes jQuery, tak mi to radí přesunout zdroj na stejnou doménu (což tak úplně nejde) nebo povolit CORS, o kterém jsem v životě neslyšel. Když to dělám v čiístém JS (vizte níže), tak to nechodí vůbec.
function getJSONP(url, success) {
var ud = '_' + +new Date,
script = document.createElement('script'),
head = document.getElementsByTagName('head')[0]
|| document.documentElement;
window[ud] = function(data) {
head.removeChild(script);
success && success(data);
};
script.src = url.replace('callback=?', 'callback=' + ud);
head.appendChild(script);
}
getJSONP('http://202.127.24.18/bin/astro.php?lon=16.3&lat=49.9&ac=0&unit=metric&output=json&tzshift=0', function(data){
console.log(data);
});
Určitě je na to nějaká známá finta, kterou jsem ale ani po velmi důsledném googlení nenašel. Díky...
Tak nakonec jsem použil tohle:
function GetLastModifiedFileName(AFolder: String; APattern: String = '*.*'): String;
var
sr: TSearchRec;
aTime: Integer;
begin
Result := '';
aTime := 0;
if FindFirst(IncludeTrailingPathDelimiter(AFolder) + APattern, faAnyFile, sr) = 0 then
begin
repeat
if sr.Time > aTime then
begin
aTime := sr.Time;
Result := sr.Name;
end;
until FindNext(sr) <> 0;
FindClose(sr);
end;
end;
a volám
soubor:=GetLastModifiedFileName('C:\Meade Images','*.jpg');
Každou minutu mi vypadne z celooblohové kamery obrázek, ale soft ke kameře neumí text overlay. Takže bych potřeboval do každého obrázku doplnit datum a čas. To bych dovedl celkem jednoduše, ale nějak nevím, jak detekovat nový soubor ve složce...
Dáky za Vaše nápady...
Hraju si tady s drobným skriptem, který umožní download souboru až po zadání platné e-mailové adresy (abych pak mohl spamovat uživetele, jak se jim soubor líbí ). PHP vypadá to v zásadě takto:
<?php
$saving = $_REQUEST['saving'];
if ($saving == 1){
$data = $_POST['data'];
$kontrola = isValidEmail($data);
if ($kontrola == TRUE){
$file = "data.txt";
$fp = fopen($file, "a") or die("Couldn't open $file for writing!");
fwrite($fp, $data . "\n") or die("Něco je špatně");
fclose($fp);
echo "Soubor ke stažení zde...";
}
else {
echo "Zadejte prosím platnou e-mailovou adresu! <br><a href=\"down.php\">Zkusit znovu</a>";
}
}
function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
if (eregi($pattern, $email)){
return true;
}
else {
return false;
}
}
?>
Konkrétně mi jde o to, co použít jako znak konce řádku v ukládaném textu. Zkoušel jsem i PHP_EOL, ale taky nic moc...
Hraju si tady s drobným skriptem, který umožní download souboru až po zadání platné e-mailové adresy (abych pak mohl spamovat uživetele, jak se jim soubor líbí ). PHP vypadá to v zásadě takto:
<?php
$saving = $_REQUEST['saving'];
if ($saving == 1){
$data = $_POST['data'];
$kontrola = isValidEmail($data);
if ($kontrola == TRUE){
$file = "data.txt";
$fp = fopen($file, "a") or die("Couldn't open $file for writing!");
fwrite($fp, $data . "\n") or die("Něco je špatně");
fclose($fp);
echo "Soubor ke stažení zde...";
}
else {
echo "Zadejte prosím platnou e-mailovou adresu! <br><a href=\"down.php\">Zkusit znovu</a>";
}
}
function isValidEmail($email){
$pattern = "^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$";
if (eregi($pattern, $email)){
return true;
}
else {
return false;
}
}
?>
Konkrétně mi jde o to, co použít jako znak konce řádku v ukládaném textu. Zkoušel jsem i PHP_EOL, ale taky nic moc...
Tak problém částečně vyřešen, byl to nesoulad velikostí. Ale ještě bych potřeboval vyřešit jednu věc - aby se nejdřív vykreslila ta ručka ze souboru a pak až ty tři další. Prostým přesunem kódu se mi to nedaří...
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>Analog clock by Javascript feat. HTML5</title>
</head>
<body>
<canvas id="clock" width="500" height="500"></canvas>
<script type="text/javascript">
<!--
var canvas = document.getElementById('clock');
// vložení obrázku
ruka = new Image();
ruka.src = "hod.png";
main();
function main()
{
if(canvas.getContext)
{
clock();
setInterval('clock()', 1000);
}
}
function clock()
{
var context = canvas.getContext('2d');
context.save();
context.clearRect(0, 0, 500, 500);
context.translate(250, 250);
context.scale(2.5, 2.5);
context.rotate( - Math.PI / 2 );
context.save();
// dial plate
context.strokeStyle = "gray";
context.fillStyle = "white";
context.lineWidth = 4;
context.lineCap = "round";
context.beginPath();
context.stroke();
context.restore();
context.save();
var now = new Date();
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
// hour hand
context.strokeStyle = "black";
context.fillStyle = "yellow";
// calculating formula for the angle of the hour hand
// ( 2 * Math.PI / 6 ) * hour + ( ( 2 * Math.PI / 24 ) / 60 ) * minute + ( ( ( 2 * Math.PI / 24 ) / 60 ) / 60 ) * second
context.rotate( ( Math.PI / 6) * hour + ( Math.PI / 360 ) * minute + ( Math.PI / 21600 ) * second );
context.lineWidth = 8;
context.lineCap = "round";
context.beginPath();
context.moveTo(-10, 0);
context.lineTo(45, 0);
context.stroke();
context.restore();
context.save();
// minute hand
context.strokeStyle = "black";
context.fillStyle = "black";
// calculating formula for the angle of the minute hand
// ( 2 * Math.PI / 60 ) * minute + ( ( 2 * Math.PI / 60 ) / 60 ) * second
context.rotate( ( Math.PI / 30 ) * minute + ( Math.PI / 1800 ) * second );
context.lineWidth = 6;
context.lineCap = "round";
context.beginPath();
context.moveTo(-14, 0);
context.lineTo(62, 0);
context.stroke();
context.restore();
context.save();
// second hand
context.strokeStyle = "red";
context.fillStyle = "red";
// calculating formula for the angle of the second hand
// ( 2 * Math.PI / 60 ) * second
context.rotate( Math.PI / 30 * second );
context.lineWidth = 4;
context.lineCap = "round";
context.beginPath();
context.moveTo(-15, 0);
context.lineTo(70, 0);
context.stroke();
context.restore();
// frame
context.beginPath();
context.lineWidth = 12;
context.strokeStyle = "green";
context.arc(0, 0, 90, 0, Math.PI * 2, true);
context.stroke();
context.restore();
context.save();
// obrázek hod.png je 500x500px
context.save();
// Translate to the center point of our image
context.translate(ruka.width * 0.5, ruka.height * 0.5);
// Perform the rotation
context.rotate(0.45);
// Translate back to the top left of our image
context.translate(-ruka.width * 0.5, -ruka.height * 0.5);
// Finally we draw the image
context.drawImage(ruka, 0, 0);
// And restore the context ready for the next loop
context.restore();
context.restore();
}
//-->
</script>
</body>
</html>
Zde živá ukázka: http://black-hole.cz/public/hodiny.html
Ta ručka se ani neukáže, při náhodném upravování konstant funkce context.drawImage (viz konec kódu výše) ji dostanu na canvas, ale stejně rotuje úplně nesmyslně...
Dobrý den,
hraji si s těmito hodinami v HTML5 a rád bych přidal ještě ručičku na druhý (světový) čas jako např. zde. Tu bych chtěl udělat jako PNG obrázek, který je před vykreslením potřebqa narotovat podle vypočteného úhlu. Vyšel jsem z tohohle tutoriálu, ale stejně to moc nefrčí.
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>Analog clock by Javascript feat. HTML5</title>
</head>
<body>
<canvas id="clock" width="300" height="300"></canvas>
<script type="text/javascript">
<!--
var canvas = document.getElementById('clock');
// vložení obrázku
ruka = new Image();
ruka.src = "hod.png";
main();
function main()
{
if(canvas.getContext)
{
clock();
setInterval('clock()', 1000);
}
}
function clock()
{
var context = canvas.getContext('2d');
context.save();
context.clearRect(0, 0, 300, 300);
context.translate(150, 150);
context.scale(1.5, 1.5);
context.rotate( - Math.PI / 2 );
context.save();
// dial plate
context.strokeStyle = "gray";
context.fillStyle = "white";
context.lineWidth = 4;
context.lineCap = "round";
context.beginPath();
context.stroke();
context.restore();
context.save();
var now = new Date();
var hour = now.getHours();
var minute = now.getMinutes();
var second = now.getSeconds();
// hour hand
context.strokeStyle = "black";
context.fillStyle = "black";
// calculating formula for the angle of the hour hand
// ( 2 * Math.PI / 6 ) * hour + ( ( 2 * Math.PI / 24 ) / 60 ) * minute + ( ( ( 2 * Math.PI / 24 ) / 60 ) / 60 ) * second
context.rotate( ( Math.PI / 6) * hour + ( Math.PI / 360 ) * minute + ( Math.PI / 21600 ) * second );
context.lineWidth = 8;
context.lineCap = "round";
context.beginPath();
context.moveTo(-10, 0);
context.lineTo(45, 0);
context.stroke();
context.restore();
context.save();
// minute hand
context.strokeStyle = "black";
context.fillStyle = "black";
// calculating formula for the angle of the minute hand
// ( 2 * Math.PI / 60 ) * minute + ( ( 2 * Math.PI / 60 ) / 60 ) * second
context.rotate( ( Math.PI / 30 ) * minute + ( Math.PI / 1800 ) * second );
context.lineWidth = 6;
context.lineCap = "round";
context.beginPath();
context.moveTo(-14, 0);
context.lineTo(62, 0);
context.stroke();
context.restore();
context.save();
// second hand
context.strokeStyle = "red";
context.fillStyle = "red";
// calculating formula for the angle of the second hand
// ( 2 * Math.PI / 60 ) * second
context.rotate( Math.PI / 30 * second );
context.lineWidth = 4;
context.lineCap = "round";
context.beginPath();
context.moveTo(-15, 0);
context.lineTo(70, 0);
context.stroke();
context.restore();
// frame
context.beginPath();
context.lineWidth = 12;
context.strokeStyle = "green";
context.arc(0, 0, 90, 0, Math.PI * 2, true);
context.stroke();
context.restore();
// Nový kód podle http://creativejs.com/…into-canvas/
// obrázek hod.png je 500x500px
context.save();
context.translate(150, 150);
context.translate(250, 250);
context.rotate(0.15);
context.drawImage(ruka, -150, -150);
context.restore();
}
//-->
</script>
</body>
</html>
Případně ještě onen zpropadený obrázek.
Děkuji za případné návrhy...
Tak jinak :)
Snažím se udělat takovýhle obrázek:
Tj. obrázek, který se zobrazí správně ve válcovém zrcadle. A tou transformací se obrázek rozplizne, takže pixel se nezobrazí jako pixel, ale jako lichoběžník (v ideálním případě kruhová úseč, ale když se udělajkí dostatečně malé lichoběžníky, tak se to ztratí...).
Díky za trpělivost...
Tak tohle je naprosto super, děkuji!
Ano, to je přesně ono!
Jen pro upřesnění: Tady to zkouším pomocí PutPixel, ale není to samozřejmě ono...
Problém je právě ta poslední věta - jak určit ten region. Jinak je mi všechno jasné a ten obdélník už mi to maluje, i převod do polárních souřadnic jsem zvládl, ale teď jak určit ten region.
Dejme tomu, že mám v souboru 360 řádků po 90 prvcích
0.1545;0.1542;0.1539;...
0.1235;0.1234;0.1253...
.
.
.
Potřeboval bych vykreslit na základě číselné hodnoty barevnou mapu, ale ne jako obdélník, ale jako kruh - těch 360 řádků odpovídá 360 stupňům azimutu a těch 90 prvků 90 stupňům elevace (kdyby se někdo divil, co to je za dementní soubor, tak to jsou podklady pro mapu oblohy z radioteleskopu).
Jen tak z legrace jsem si udělal osnovu, což je celkem snadné:
Image1.Canvas.Brush.Style:=bsclear;
for i:=1 to 90 do begin
Image1.Canvas.Ellipse((Image1.Width-i*5) div 2,(Image1.Height-i*5) div 2,(Image1.Width+i*5) div 2,(Image1.Height+i*5) div 2);
end;
for i:=0 to 360 do begin
Image1.Canvas.MoveTo(Image1.Width div 2,Image1.Height div 2);
Image1.Canvas.LineTo(trunc(Image1.Width div 2+konst*cos(i/180*pi)),Image1.Height div 2-trunc(konst*sin(i/180*pi)));
end;
Ale jak teď zařídit, aby se ty jednoltivé dílky osnovy vybarvily, anebo ještě lépe, aby ta osnova nebyla vůbec potřeba a mapa byla celistvá.
Díky za Vaše rady!
Mám takovýhle autorun s API funkcí:
procedure TForm1.FormClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'index.html',nil,nil,SW_SHOWNORMAL) ;
Application.Terminate
end;
Když se spustí autorun, kliknu na okno, okno se zavře, ale neotevře se index.html v prohlížeči. Když autorun najdu na CD a spustím, tak vše funguje (okno se zavře a index.html se otevře). Budu vděčný za rady...
Jinak proč se mi do toho shora uvedeného algoritmu nechce: Znamenalo by to jít v nějakém cyklu, počet sekund převést na hodiny:minuty, porovnat se souborem (nebo naopak, jít souborem a porovnávat stringy) a sčítat hodnotu za středníkem + si někde hlídat, kolik hodnot přísluší které minutě a pak to vydělit, no prostě hrozného sr*ní...
Mějme soubor .CSV:
16:54:12; 20
16:54:37; 20
16:55:02; 20
16:55:27; 30
16:55:52; 60
16:56:17; 20
16:56:42; 10
Potřeboval bych vykreslit graf z těchto dat a to za celý den (přičemž soubor nemusí začínat v 0:00 nebo mohou některé části chybět). Naivní přístup: udělám si Image o šířce 864px (den má 86400 sekund), půjdu po souboru, za jednotlivé minuty data zprůměruji, našlapu do nějakého vektoru [0..863] a pak vykreslím. Ale asi by to šlo i nějak nejdnodušeji...
Díky za tipy...
Vyřešeno! Děkuju:)
Máme objekt Kniha, která má jako jeden z parametrů číslo, a chceme smazat jednu konkrétní knihu, jejíž číslo známe:
public void smazat(int cislo) {
for (Kniha k : knihy) {
if (k.getCislo() == cislo) {
knihy.remove(k);
}
}
}
Vyhazuje
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
Proč tam nejde použít tento iterátor? Jaký jiný způsob by tenhle úkol vyřešil? Díky za rady...
Nakonec ten komparátor nevypadá tak hrozně :) Už to funguje, díky všem!
Ve třídě Album.java máme nadefinován objekt public Album(String nazev,int cislo) (včetně všech getrů a setrů, přidávání, ukládání vypisování funguje).
V hlavní třídě je (krom jiného:)
private void seradDleAlb(){
List<Album> seznam = new ArrayList<Album>();
for (Album k : databaze.getAlbum()) {
seznam.add(k);
}
Collections.sort(seznam);
vypisAlba(seznam);
}
a samozřejmě to nefunguje... Dočetl jsem se, že asi budu muset udělat vlastní komparátor, ale to jsem nikdy nezkoušel... Nejde to nějak obejít?
Díky za rady...
Z pohledu kosmonauta plyne čas na Zemi pomaleji, protože může řící, že raketa stojí na místě a Země se pohybuje směrem od něj.
Pozorovatel na Zemi však vidí, že plyne čas pomaleji pro kosmonauta. Je to, jak říkáš, kompatibilní. Tolik speciální teorie relativity.
Po návratu by ale astronaut zjistil, že na Zemi zatím uplynulo mnoho let (nedojde tedy k žádnemu "vyrovnání"). Zde je tedy paradox (v rámci speciálky). Lze to však velmi dobře vysvětlit pomocí obecné teorie relativity. Ta se ale na středních školách nedělá, což je škoda.