Adott egy unix időket tartalmazó txt fájl. Ebben oszlopszerűen sorakoznak az időpontok.
Valahogy így:
1341148920
1341220000
1342856333
1341318300
1341220020
1341266213
1341275897
Azt szeretném elérni hogy a már elmúlt időpontok törlődjenek. A többi maradjon meg. Az sem biztos hogy az időpontok sorrendben vannak!
Jelenleg az aktuális időhöz legközelebbi még el nem múlt időpontot így találom meg.
secs=$(sort -n ${date_file} | awk -v _now=$(date +%s) ' $1 >= _now {print $1}' | head -1)
Bár most jut eszembe az is elég lehet ha a fájl nem tartalmaz semmilyen időt mely a kritériumnak megfelelne, akkor törlődjön az egész tartalom.
De kérdés hogy ez az idő mikor jön el? Mert addig meg csak nő az állomány.
- 5236 megtekintés
Hozzászólások
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace TimeStampSelector
{
class Program
{
static void Main(string[] args)
{
List<string> lines = new List<string>();
using (StreamReader inFile = new StreamReader(args[0]))
{
double now = (DateTime.Now - new DateTime(1970, 01, 01)).TotalSeconds;
string line;
do
{
line = inFile.ReadLine();
if (line != null)
{
Int32 timeStamp;
if (Int32.TryParse(line, out timeStamp) && timeStamp >= now)
{
lines.Add(line);
}
}
}
while (line != null);
inFile.Close();
}
using (StreamWriter outFile = new StreamWriter(args[1]))
{
foreach (string line in lines)
{
outFile.WriteLine(line);
}
outFile.Close();
}
}
}
}
Természetesen ellenőrizni kell, hogy az argumentumok megfelelőek-e, de erre most nem volt energiám. Meleg van.
Fordítás (mono):
dmcs -out:a.exe a.cs
Futtatás (mono):
./a.exe a.txt aa.txt
Fájlok tartalma:
$ cat a.txt
1000000000
1100000000
1200000000
1300000000
1400000000
1500000000
1600000000
$ cat aa.txt
1400000000
1500000000
1600000000
Aktuális UNIX idő (T): 1.300.000.000 < T < 1.400.000.000
Fuszenecker_Róbert
- A hozzászóláshoz be kell jelentkezni
Üzenet az utókornak: jobb lenne konzolról írni-olvasni (pipe-friendly), nem memóriában gyűjteni a sorokat, hanem azonnal kiírni, és using blokkban nem kell Stream.Close().
- A hozzászóláshoz be kell jelentkezni
deltime:
#! /bin/bash
declare -i now time
now="$(date "+%s")"
while read time; do
if [ "$time" -ge "$now" ]; then
echo "$time"
fi
done
# ./deltime < timelist.old > timelist.new
- A hozzászóláshoz be kell jelentkezni
a) Abban a now=... sorban te biztoan így akarod az idézőjeleket használni? (Amúgy mivel a date - elvben - csak egész számot adhat vissza ennél az opciónál, a "külső" idézőjeleket simán elhagyhatod.)
b) ha "declare -i" helyett "typeset -i" lenne (vagy pláne sőt "integer" - oppsz, ez utóbbi bash-nál nem gyári alias; grrr), akkor nem csak a bash enné meg, hanem egyéb shellek - hint: ksh - is. Ráadásul sok jelentősége nincs, hisz elvben csak számokat adhatsz értékül mind a két változónak, ellenben műveletet nem végzel velük. Mondjuk annyi pozitívuma van így a dolognak, hogy ha integerként használod, akkor ha valamiért szemét van a fájlban (bármi sztring, ami nem tekinthető számnak - mondjuk "xyz"), akkor az így átalakul 0-vá (*), és nem okoz később az összehasonlításban szintaktikai hibát.
(*) kivéve, ha van xyz nevű változó, aminek szám az értéke, mert akkor az xyz-ből simán $xyz lesz mind az értékadás, mind a read parancs során
- A hozzászóláshoz be kell jelentkezni
Abban a now=... sorban te biztoan így akarod az idézőjeleket használni?
Megszoktam, hogy minden stringet idezojelbe teszek (sok ev C programozas), es raadasul igy kesobb nem lesznek meglepetesek a kulonleges karakterekkel. Foleg, ha egy kulso parancs eredmenyet akarom feldolgozni.
ha "declare -i" helyett "typeset -i" lenne, akkor nem csak a bash enné meg, hanem egyéb shellek - hint: ksh - is.
Nem volt szerencsem a {b,d,}ash-en kivul mashoz.
Ráadásul sok jelentősége nincs, hisz elvben csak számokat adhatsz értékül mind a két változónak
Az ilyen elvben dolgok szoktak kesobb megvaltozni, vagy nem ugy tortenni, ahogy az ember elkepzelte, es akkor csak pislogunk, hogy miert nem mukodik valami. Amugy igazad van.
Mondjuk annyi pozitívuma van így a dolognak, hogy ha integerként használod, akkor ha valamiért szemét van a fájlban, akkor az így átalakul 0-vá, és nem okoz később az összehasonlításban szintaktikai hibát.
Defenziv programozas :-)
Sokszor elofordul, hogy egy-egy programomba/szkriptembe sok ev utan bele kell nyulni, akkor nagyon jol jon, ha nem kell vegigbogaraszni a programot, hogy "ebbe a valtozoba belekerult egy space, lassuk, mindenutt idezojelben van-e?"
- A hozzászóláshoz be kell jelentkezni
Csak ehhez tennék még hozzá valamit:
now="$(date "+%s")"
Így, ahogy ide van írva, ez a következőt jelenti:
- egy "sztring" a $-jeltől a szóközig (inkluzíve)
- ehhez hozzáragasztjuk azt, hogy +%s (amit viszont *nem* "sztringizálsz")
- ehhez hozzáragasztjuk a ) -et, amit megint sztringgé "változtatsz".
Tekintettel arra, hogy amúgy shell-változóban nincs olyan hogy sztring (mert ugye az idézőjel nem arra szolgál, hane speciális karakterek takarására; ellenben minden sztring, ha csak nem jelzed az ellenkezőjét, pl. integer) - ez a fenti nem egészen úgy történik, ahogy *szerintem* gondoltad.
Én személy szerint a "belső" idézőjelpár helyére sima aposztrófot tennék, és akkor már pontosan az történik, amit valószínűleg akartál.
Ugyanis a miatt, hogy a +%s nincs shell elől eltakarva, később belefuthatsz abba, hogy a shell esetleg a %XYZ-t majd valamiként értelmezi. Speciel bash-ban/kshban a %akarmi az akarmi-háttérprocess job-id-jeként értelmeződik. Legalábbis bizonyos parancsoknál mindenképp - fg/bg/kill pl.
Szóval az általad is emlegetett defenzív programozás miatt nem hiszem, hogy ez így jó ötlet, helyette javasolható:
now="$(date '+%s')"
- A hozzászóláshoz be kell jelentkezni
Így, ahogy ide van írva, ez a következőt jelenti:
- egy "sztring" a $-jeltől a szóközig (inkluzíve)
- ehhez hozzáragasztjuk azt, hogy +%s (amit viszont *nem* "sztringizálsz")
- ehhez hozzáragasztjuk a ) -et, amit megint sztringgé "változtatsz".
Ez igy igaz is lenne, ha nem lenne ott a $(), de eloszor az azon belul levo dolgokat nezi. Pelda:
[muszi@muszi test]$ touch "abc def"
[muszi@muszi test]$ echo "$(ls "abc def")"
abc def
Ha ugy ertelmezne, ahogy te mondod, akkor nem talalta volna meg a file-t.
- A hozzászóláshoz be kell jelentkezni
No ezt még rágnom kell, meg voltam győződve, hogy előbb történik a szavakra tördelés, és utána a különböző helyettesítáések. (sőt mi több a bash man-ja ezt explicit módon le is írja:
EXPANSION
Expansion is performed on the command line after it has been split into
words. There are seven kinds of expansion performed: brace expansion,
tilde expansion, parameter and variable expansion, command substitu-
tion, arithmetic expansion, word splitting, and pathname expansion.
The order of expansions is: brace expansion, tilde expansion, parame-
ter, variable and arithmetic expansion and command substitution (done
in a left-to-right fashion), word splitting, and pathname expansion.
Mondjuk az első és a második bekezdés némileg ellentmond egymásnak. (*) Meg a fönti példád. Egyébként lőször azt akartam írni, hogy mihelyt 2 vagy több szóköz lesz a fájlnévben, már látszani fog, hogy rosszul mondod, ellenben kipróbálva akkor is jól működik, úgyhogy valaki elmagyarázhatná, mert nekem ez így nem kerek.
(*)Szerk. Nincs ellentmondás, később még ez is van:
The shell scans the results of parameter expansion, command substitu-
tion, and arithmetic expansion that did not occur within double quotes
for word splitting.
Szóval előbb szavakra tördel, után helyettesít, és amennyiben nincenek takarva, akkor a helyettesítések eredményét tovább tördeli. Akkor miért működik úgy, ahogy írtad?
- A hozzászóláshoz be kell jelentkezni
Azt tartanam logikusnak (es a mukodes alapjan is erre lehet kovetkeztetni), hogy ha $()-vel talalkozik, akkor a benne levo szoveget kulon parancssorkent fogja fel, es a teljes szabalyrendszert elolrol alkalmazza ra.
The shell scans the results of parameter expansion, command substitu-
tion, and arithmetic expansion that did not occur within double quotes
for word splitting.
Ez szerintem az eredmenyre (a parancs kimenetere) vonatkozik.
- A hozzászóláshoz be kell jelentkezni
ha előbb olvasnék...
- A hozzászóláshoz be kell jelentkezni
Részemről is döbbenet. Úgy látszik a $( megjelenése kivált egy újrakonkatenálás-újratördelést.
Legalábbis ezt súgja ez:
>cat x.sh
echo "<$1>"
>s="$(./x.sh "a b c")"
++ ./x.sh 'a b c'
+ s='<a b c>'
>s="(./x.sh "a b c")"
+ s='(./x.sh a'
+ b 'c)'
+ '[' -x /usr/lib/command-not-found ']'
+ /usr/bin/python /usr/lib/command-not-found -- b
b: command not found
+ return 127
$ nélkül úgy teszi, ahogy elvárja az egyszeri ember.
- A hozzászóláshoz be kell jelentkezni
Ha már az awk irányába indultál a nyitó hozzászólásban, akkor egy kicsit átalakítva például így:
awk 'BEGIN { _now=systime() } ; $1 >= _now { m=1; print $1 >>"ujfile" } END { exit m }' <eredetifile
A visszatérési értéket tudod vizsgálni shellből is (0 = nem volt találat; 1 = volt), és igény szerint például átnevezed a szűrt file-t a régi nevére.
- A hozzászóláshoz be kell jelentkezni
Húú ez tetszik, de még van vele egy kis gondom. A létrejövő "ujfile" ott jön létre ahol a parancsot kiadom. S ez nem jó.
Az lenne a jó, ha abban a mappában jönne létre, ahol a ${date_file} van.
Az "ujfile" elé meg nem írhatok útvonalat, mert fatal: can't redirect to
- A hozzászóláshoz be kell jelentkezni
"Az "ujfile" elé meg nem írhatok útvonalat, mert fatal: can't redirect to"
Nem tudtam előidézni ezt a hibaüzenetet, GNU Awk 3.1.7 (Debian 6.0.5) alatt működni látszik ez:
awk 'BEGIN { _now=systime() } ; $1 >= _now { m=1; print $1 >>"/tmp/ujfile" } END { exit m }' <eredetifile
De nyugodtan ki is lehet vinni, és az átirányítást a shellre bízni:
awk 'BEGIN { _now=systime() } ; $1 >= _now { m=1; print $1 } END { exit m }' <eredetifile >/tmp/ujfile
Vagy mint említettem, az átnevezést (vagy mozgatást) megoldhatod shellből:
awk 'BEGIN { _now=systime() } ; $1 >= _now { m=1; print $1 >>"ujfile" } END { exit m }' </valahol/eredetifile || mv ujfile /valahol/nagyonujfile
Többféleképpen is meg lehet oldani ugyanazt a feladatot.
- A hozzászóláshoz be kell jelentkezni
Sot, az ARGV-bol ki is lehet emelni a fajlnevet, es oda hozom letre. Persze ilyenkor pipe-olas az nincs, de hat vmit vmiert.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Köszi. Végül a shell átirányítás maradt. De most sok sok tesztelés során belefutottam abba problémába, hogy az adatbázisba belekerültek azonos időpontok.
Ezt vajon hogyan védhetném ki?
Az a helyzet hogy dolgozom egy projekten, mely senkit nem érdekel, (akkor mégis miért csinálom?) emiatt apróbb darabokban tudom itt feltárni a kérdéseimet. Melyet aztán mégis csak magamnak kell megoldani, mert konkrét segítséget sajna hiába várok, hogy valaki(k) bekapcsolódjon(ak) a projektbe. Pedig én még csak programozni sem tudok. Nyilván volna megfelelőbb platform is a bash-nál de ehhez sem értek csak rám ragadt valami kosz.
Arról nem is beszélve hogy több szem többet lát (teszt).
Kezdésnek az lenne a jó ha eleve nem kerülne bele ugyanaz az időpont a fájlba.
Tehát kell egy ellenőrzési rutin.
Az user időpontokat ad meg feladatok elvégzéséhez. Ezek az idők unix formátumban belekerülnek egy txt fájlba.
Hogyan tudom kivédeni az ütközéseket? Igazából nagy intervallum kellene hozzá, mert ezek az idők másodperc pontosak.
De fizikailag lehetetlen 5 percen belül lenni. Ezek ébresztő időpontok.
A gép bekapcsol, bebootol, elvégzi a feladatot, és lekapcsol. Ha csak EGY másodperces feladatot lát el, akkor is a következő bekapcsoláshoz az elsőhöz viszonyítva kell neki 3 perc. De legyen inkább 5.
Tehát ha már megadott idő van, akkor az ne kerüljön bele újra, illetve ha az adott idő 5 percen belül van akkor szintén ne kerüljön bele. Ehelyett figyelmeztessen.
Nyilván sorról sorra át kell nézni a megadott időpontokat és egy feltétel vizsgálaton át kell szűrni.
Akár a bc is jó lehet mivel csak számok vannak a fájlban. Ha a most megadott időpont (szám!) = vagy +-300 a már listában lévőkkel, akkor ERROR, ha nem, akkor mehet a listába.
Ez nekem egyelőre magas. De meg fogom oldani akár így akár úgy.
Lehet hogy a sed lenne a jó ehhez, de a sed az nekem tényleg kínai.
- A hozzászóláshoz be kell jelentkezni
Elég keveset árultál el a feladatról. Segítene, ha tudnánk még néhány részletet. Például:
- A gép elindulása után mi indítja a futtatandó programot? Az rc.local? Vagy esetleg a cron? Vagy ...?
- Mindig ugyanaz a szkript/program hajtódik végre?
Az is egy lehetőség lehet, hogy az egymáshoz közeli időpontokat nem szűröd ki. Amikor lefut a program, akkor a gép leállítása előtt ellenőrzi, hogy van-e 5 percen belül végrehajtandó feladat. Ha nincs ilyen, akkor leáll a gép. Ha van közeli feladat, akkor a megfelelő időpontban elindítja azt.
Ebben az esetben elegendő az egyező időpontokat kiszűrni. Pl. sort -u.
Kiegészítés:
Gondold át, hogy mit szeretnél, majd készíts egy algoritmust, és csak után kezdj el szkriptet írni.
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
Úgy vélem félreértettél, vagy pedig nem tudok fogalmazni.
Nem az a lényeg hogy mi indít mit. Hanem az hogy az adott fájlba ne kerülhessenek bele a kritériumnak nem megfelelő időpontok.
Tehát még egyszer. Teljesen mindegy hogy milyen program fog lefutni. A gép bekapcsolása a lényeg.
Adott egy szöveges fájl, amelyben mint a topic elején már írtam unix időpontok vannak felsorolva egymás alá. Ezek azok az időpontok amikor a gépnek be kell kapcsolódnia.
Ezeket az időpontokat egy script rakja bele a fájlba, miután megkapta a megfelelő paramétereket.
A lényeg az, hogy az ebben a fájlban lévő időpontok ne legyenek ugyanazok.
wake_time.txt
1341843380
1341662220
1341662880
1341664680
1341664780
1341664980
1341665460
1341665580
1341665940
1341666480
1341666480
Nos ide a fájl végére belekerült KÉTSZER ugyanaz az időpont. A sorrend érdektelen.
Olyan is lehet hogy van KETTŐ olyan időpont mely nagyon közel van egymáshoz. Tehát 5 percen belüli.
A lényeg hogy a paraméterek megadásakor le kell fusson egy "ellenőrző" mely azt hivatott ellenőrizni hogy a megadott időpont nem-e ütközik a wake_time.txt-ben felsorolt időpontokkal. Ha igen akkor az hiba. Azt is figyelnie kell hogy a paraméterekkel megadott időpont ne legyen a fájlban lévőhöz időben túl közel, tehát nem eshet 5 percen belülre.
Ennél magyarabbul nem tudom megfogalmazni.
Nem az a lényeg hogy a gép bekapcsolásakor milyen script hajtódik végre. Az a lényeg hogy mikor kapcsolódjon be a gép. Ha már egyszer bekapcsolt, de van egy olyan időpont mely 100 másodperccel később újra bekapcsolná, akkor az hiba, meg felesleges, hiszen a gép már működik. Érthető?
- A hozzászóláshoz be kell jelentkezni
Nem egy dologról beszélünk. Én az eredeti feladat megoldásáról, te pedig az elképzelésed szerinti megoldásról. Az általad leírtakból arra következtettem, hogy
- van egy fájl amiben időpontok vannak
- be van állítva a gép, hogy az első időpontban automatikusan induljon el
- az elindulás után hajtson végre valamilyen feladatot
- a feladat végrehajtása után beállítja a következő ébredési időpontot
- lekapcsol a gép
Az általad leírtak alapján nekiláttál a feladat megoldásának, és abban akadtál el. Erre adtam egy másik megoldási javaslatot, mert szerintem az a lényeg, hogy az eredeti feladatot megoldjuk. Úgy gondolom, hogy a megoldás egyszerűbb, ha az „algoritmusodat” kicsit módosítjuk. (Legtöbbször egy feladat nagyon sok algoritmussal megoldható.) Arra alapoztam, hogy a kikapcsolás előtt mindenképpen meg kell keresni a fájlban a következő időpontot (a következő ébredés beállításához), így ekkor meg lehet csinálni egyúttal az ellenőrzést is. Ezért gondolom úgy, hogy ez egyszerűbb is.
Másrészt vegyünk egy példát: be kell kapcsolni 08.00-kor, és 09.00-kor is ez ugye elég távol esik egymástól. Ha a végrehajtandó feladat 58 percig tart (rémlik valamilyen TV-kártyás projekted is), akkor a kikapcsolás és a bekapcsolás között csak 2 perc lesz, ami viszont nem elég a ki- és bekapcsolásra. Az eredeti elképzelés szerint a leállítási időpont nincs benne a fájlban, így ezt előre nem is lehet kiszűrni, vagyis csak a kikapcsolás előtt tudunk dönteni a dologban. Az én megoldási javaslatom ezt az problémát is kezeli.
De hogy konstruktív is legyek:
sort -u val rendezed a fájlt (kiszűri az ismétlődéseket), majd egy szkripttel elvégzed a szomszédos időpontok ellenőrzését. A sorba rendezés miatt elég a szomszédok vizsgálata. A bash egész számok kivonására képes, így azzal is csinálhatod. Tipp:
$((1341683241-1340683241))
A különbséget kell vizsgálni, hogy kisebb-e egy adott értéknél.
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
be kell kapcsolni 08.00-kor, és 09.00-kor is ez ugye elég távol esik egymástól. Ha a végrehajtandó feladat 58 percig tart
akkor a kikapcsolás és a bekapcsolás között csak 2 perc lesz, ami viszont nem elég a ki- és bekapcsolásra.
Látod erre például nem is gondoltam. Ezért is vetettem fel az egész projektet a fórumon de senkit nem érdekelt. Nem jelentkezett.
Holott ha az egészet átlátja olyasvalaki aki ért a programozáshoz, lehet hogy jobb ötlete is van.
Én csak műkedvelő vagyok, és eddig erre futotta. Mert a sima parancsok beírásától már elegem volt, hogy mindig mindenre figyelni kellett.
Így már rengeteg dolgot leellenőriz nekem a script. Megkönnyítette a dolgom.
Arra alapoztam, hogy a kikapcsolás előtt mindenképpen meg kell keresni a fájlban a következő időpontot (a következő ébredés beállításához),
Ez valóban így van. Ezt egy rc6.d scriptre bíznám, ami a halt előtt lefut.
Erre már van megoldásom, de még nem raktam bele az rc-be. Csak szép sorjában.
date_file_path="/home/$USER/.config/TvRip"
date_file=wake_time.txt
awk 'BEGIN { _now=systime() } ; $1 >= _now { m=1; print $1 } END { exit m }' <${date_file_path}/${date_file} >${date_file_path}/new_${date_file}
rm -f <${date_file_path}/${date_file}
mv ${date_file_path}/new_${date_file} ${date_file_path}/${date_file}
secs=$(sort -n ${date_file_path}/${date_file} | awk -v _now=$(date +%s) ' $1 >= _now {print $1}' | head -1)
echo "Ekkor kapcsol be a gép - ${secs} - vagyis - $(date -d @${secs}) "
# sudo /home/$USER/.TvRip/modules/tvrip_wake_install.sh ${secs}
# sudo /home/$USER/.TvRip/modules/tvrip_wake_install.sh ${secs}
Megfigyeltem hogy a sudoers-be csak parancsot írhatok be, így kellett egy különálló parancs amire a sudo-ban engedélyt adtam.
Ez lefut és beleteszi az aktuális időponthoz legközelebbi időpontot a wakealarm-ba. Egyúttal a lejárt időpontokat meg kitörli.
Mint említettem társakat keresek, mert ez egyedül már kezd nehézzé válni, de az is igaz, hogy tanulok is ezáltal.
S írtam hogy csak kis adagokban kérdezek, Most az volt a soron hogy ne legyenek ütköző időpontok.
Viszont az fárasztó hogy minden kérdésnél mindent elölről el kell magyarázni hogy mi miért van. Bár ezt felfoghatom egyfajta reklámnak is.
Mert úgy hiszem van még létjogosultsága.
Az is majd egy kis része lesz a dolognak hogy miként tudnám paraméterrel indítani? Hiszen szinte ugyanezekkel a beállításokkal tökéletesen lehet használni VHS rip-re is. Csak az input-ot kell megváltoztatni. S az azért mégsem járja hogy emiatt átírják a tvrip_config fájlt. De ezt majd később.
Sok ötletem van. Sokan is segítettek már. De minden bizonnyal lehetne akár egyszerűbbé és gyorsabbá is tenni, de ez egyelőre meghaladja a képességem. Nyilván ha esetleg nemzetközivé válna, akkor akármi is lehet belőle. De a gettextes dolgok igen távol állnak tőlem.
Hiába néztem például ezt. Sajnos nem lettem okosabb.
- A hozzászóláshoz be kell jelentkezni
Azt, hogy mindent elolrol kell magyarazni, az azert vna, mert midnenre kapasbol tizenot fele megoldas van, viszont neked lehet, hogy ebbol csak ketto jo. Le kell egyszerusitened a rendszert, de epp csak annyira, hogy a jellegzetessegei ne tunjenek el. Persze, ehhez nagyon pontosan kell tudnod, mit szeretnel csinalni, elerni.
Egyebkent a programozas tanulhato dolog. Az AWK meg csak nem is olyan nehez. En mind programozni, mind AWK-ozni autodidakta modon tanultam meg.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import time
ido = int(time.time())
f = open(sys.argv[1], "r")
for s in f:
----if int(s) >= ido:
--------print s,
f.close()
Itt is a -- jeleket cseréld szóközre, mivel a fórummotor utálja a szóközt.
Használata: ./fenti_progi fájlnév > újfájlnév; mv újfájlnév eredetinév
Természetesen ha valaki a bonyolultabb megoldásokat szereti, lehet azt is választani.
- A hozzászóláshoz be kell jelentkezni