Hozzászólok Aktív témák

  • #hpq

    aktív tag

    Szia!
    Nagyon szépen köszi a fáradozásaidat, működik amit küldtél!
    Sokat segítettél a vizsgára való felkészülésemben, most már többet értek. :R

    // -

  • joysefke

    veterán

    Legyen szíves valaki segítsen. System.IO.Compression-al bohóckodom, biztosan valami bufferprobléma van, de nem látom, hogy hol... Elég béna vagyok :B

    Itt van két nyúlfarknyi kód, az egyikben nincs tömörítés és működik, a másikban van tömörítés és nem működik. Az írásnál nem futok bele exceptionba.

    Itt alább ez működik:
    Gyártok egy string[] tömböt és elemenként mint szöveget beleírom egy StreamWriter(new MemoryStream)-be. Majd ennek az ellentettje, mindent szépen rendben vissza tud olvasni. Egyszer 1000 utána 10000 elemet próbálok tömöríteni, kiírni.

    Előre is köszönöm!!!

    using System;
    using System.IO;


    class Program
    {
    //Gets a string[] array with n data items
    public static string[] GetNumbers(int n)
    {
    string[] numbers = new string[n];
    for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
    return numbers;
    }

    // writes the string[] array consisting of n items as text to an underlying memory stream
    // after that the backing byte[] data structure of the memory stream is extracted via toArray()
    // this byte[] array is used to instantitze a MemoryStream and read back the content as text
    // this works as expected

    public static void WriteReadStrings(int n)
    {
    string[] numbers = GetNumbers(n);

    byte[] data;
    using (MemoryStream ms = new MemoryStream())
    using (StreamWriter sw = new StreamWriter(ms))
    {
    int i = -1;
    try
    {
    for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception: " + ex.Message);
    Console.WriteLine("Current item: {0} \r\nhit key!", i);
    Console.ReadKey();
    }
    sw.Flush();
    ms.Flush();
    data = ms.ToArray();
    }
    Console.WriteLine("data size: {0}", data.Length);
    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);


    //reading back the compressed stream
    using (MemoryStream ms = new MemoryStream(data))
    using (StreamReader sr = new StreamReader(ms))
    {
    while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());
    }
    }

    static void Main(string[] args)
    {

    WriteReadStrings(1000);

    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);

    WriteReadStrings(10000);

    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);
    }
    }

    Ok, és most ugyanez tömörítéssel:
    Totálisan nem megy. Ha 1000 elemet próbálok tömöríteni, semmi nem kerül bele a MemoryStreambe, ha 10000-et, akkor meg csak valami 8000 környéki. Biztosan valami buffer hiba van, de hol???

    using System;
    using System.IO;
    using System.IO.Compression;

    class Program
    {
    //Gets a string[] array with n data items
    public static string[] GetNumbers(int n)
    {
    string[] numbers = new string[n];
    for (int i = 0; i < n; ++i) numbers[i] = (i + 20000).ToString();
    return numbers;
    }

    // writes the string[] array consisting of n items as text compressed to an underlying memory stream
    // after that the backing byte[] data structure of the memory stream is extracted via toArray()
    // this byte[] array is used to instantitze a MemoryStream and read back the content as text
    // this does NOT work

    public static void CompressAndDecompressStringArr(int n)
    {
    string[] numbers = GetNumbers(n);

    byte[] compressedData;
    using (MemoryStream ms = new MemoryStream())
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
    using (StreamWriter sw = new StreamWriter(ds))
    {
    int i = -1;
    try
    {
    for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception: " + ex.Message);
    Console.WriteLine("Current item: {0} \r\nhit key!", i);
    Console.ReadKey();
    }
    sw.Flush();
    ds.Flush();
    ms.Flush();

    compressedData = ms.ToArray();
    }
    Console.WriteLine("Compressed data size: {0}", compressedData.Length);
    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);

    //reading back the compressed stream

    using (MemoryStream ms = new MemoryStream(compressedData))
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
    using (StreamReader sr = new StreamReader(ds))
    {
    while (sr.EndOfStream != true) Console.WriteLine(sr.ReadLine());

    }

    using (MemoryStream ms = new MemoryStream(compressedData))
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Decompress))
    using (StreamReader sr = new StreamReader(ds))
    {
    string[] separator = new string[1];
    separator[0] = Environment.NewLine;

    Console.WriteLine("Split returned {0} lines", sr.ReadToEnd().Split(separator, StringSplitOptions.RemoveEmptyEntries).Length );
    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);
    }
    }

    static void Main(string[] args)
    {
    CompressAndDecompressStringArr(1000);

    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);

    CompressAndDecompressStringArr(10000);

    Console.WriteLine("hit key to proceed");
    Console.ReadKey(true);
    }
    }

    [ Szerkesztve ]

  • fatal`

    félisten

    Vedd ki a flush hívásokat, ha using blockot használsz, mert szükségtelen. De nem vagyok benne biztos, hogy ez okozza a problémát.

    http://goo.gl/gd6Zi5

  • joysefke

    veterán

    Vedd ki a flush hívásokat, ha using blockot használsz, mert szükségtelen. De nem vagyok benne biztos, hogy ez okozza a problémát.

    A működőben (tömörítés nélkül) kellenek a flush() hívások, próbáltam, anélkül hibázik :
    mire ez meghívódik: data = ms.ToArray() már mindennek a MemoryStream-ben kell lennie.

    A nem működő verziók (ami tömörít) pedig nem segít, akár bent van, akár nem. Egyébként mindenfélével próbálkoztam, nincs ötletem..

    [ Szerkesztve ]

  • Zalanius

    tag

    Pedig ott a flösch környékén lesz a hiba. Próbáld ki így:

    using (MemoryStream ms = new MemoryStream())
    {
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
    {
    using (StreamWriter sw = new StreamWriter(ds))
    {
    int i = -1;
    try
    {
    for (i = 0; i < n; ++i) sw.WriteLine(numbers[i]);
    }
    catch (Exception ex)
    {
    Console.WriteLine("Exception: " + ex.Message);
    Console.WriteLine("Current item: {0} \r\nhit key!", i);
    Console.ReadKey();
    }
    /* sw.Flush();
    ds.Flush();
    ms.Flush();*/
    }
    }
    compressedData = ms.ToArray();
    }

    --= Zalán =--

  • joysefke

    veterán

    Köszönöm!

    1, az általad javasolt megoldás működik ( :C )

    2, A Fush() megléte, meg nem léte nem változtatott semmit. (kipróbáltam)

    3, Ami megjavította a kódot az ez volt:

    using (MemoryStream ms = new MemoryStream())
    {
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
    {
    using (StreamWriter sw = new StreamWriter(ds))
    {

    Ezzel pedig hibázik:

    using (MemoryStream ms = new MemoryStream())
    using (GZipStream ds = new GZipStream(ms, CompressionMode.Compress))
    using (StreamWriter sw = new StreamWriter(ds))
    {......}

    Ne röhögjetek ki, de én azt hittem, hogy a kettő egyenértékű. Rengeteg példaprogramot láttam
    using (.....)
    using (.....)
    {...}

    sablon szerint, illetve a fönti tömörítés nélküli verzióban ami nem hibázik is több using statementet egymás után van, majd a kódblokk...

    [ Szerkesztve ]

  • joysefke

    veterán

    Miért gondoljátok, hogy a Flush() a using blokkon belül felesleges, ha még a using blokkon belül szeretném, hogy a stream konzisztens legyen azzal amit beleírtam:

    byte[] data;
    using (...)
    {
    írás....
    sw.Flush();
    ms.Flush();
    data = ms.ToArray();
    }

  • fatal`

    félisten

    Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívás, emiatt nem kell mindent bezárójelezni, de a biztonság kedvéért nem árt.

    A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.

    http://goo.gl/gd6Zi5

  • joysefke

    veterán

    Köszi!

    1,
    Nem a zárójelek javították meg, hanem az hogy a GZipStream using blokkon kívülre került a ToArray hívás

    Vak vagyok :)
    Próbálgattam a dolgot, és elegendő volt a ToArray() hívást a StreamWriter- using blokkján kívülre rakni, már az is megjavította (úgy hogy a GZipStream using blokkján még belül volt ) (!!!)
    Tehát abban igazad van, hogy ki kellett lépni valamelyik using blokkból.

    2,
    A flush pedig nem szükséges (mivel a végén van nem okoz problémát, csak kétszer hívódik), mert a Dispose során a Framework meghívja mindenképpen.

    OK, ezt értem, de azt nem értem, hogy az én megoldásom miért nem jó, tehát, ha még a legbelső (StreamWriter) using blokkon belül akarom a ToArray()-t megívni backing streamen (MemoryStream), akkor miért nem működik az, hogy szépen visszafele meghívom a Flush()-öket: sw.Flush(); ds.Flush(); ms.Flush(); aztán meghívom a MemoryStreamen a ToArray()-t.

    Itt azt várnám, hogy a Flush() hívások után a a MemoryStream mindent tartalmaz amit beleírtam (kiürültek a bufferek), tehát bátran hívhatok ToArray()-t...
    Itt ugye asszinkronitás sincsen, tehát abban a pillanatban amikor meghívom a Flush()-t, akkor már minden írás amit előtte kiadtam már megtörtént (bufferbe)

    És ez működik is úgy, hogy nincsen tömörítés (DeflateStream vagy GZipStream) hanem csak Streamwriter( MemoryStream()) van. Onnantól kezdve, hogy közé ékelek egy GZipStreamet vagy DeflateStream-et, borul az egész...

    [ Szerkesztve ]

  • joysefke

    veterán

    Uhh :U

    https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream.flush(v=vs.110).aspx

    DeflateStream.Flush Method ()

    The current implementation of this method does not flush the internal buffer. The internal buffer is flushed when the object is disposed.

    GZipStream.Flush() ugyanez...

    Mondjuk továbbra sem értem, miért elegendő, ha a ToArray() a StreamWriter blokkján kívül, de a GZipStream blokkján belül van. Azt várnám, hogy ahogy Te tanácsoltad, a GZipStream blokkja után kellene hogy legyen, hogy biztonságos legyen meghívni a ToArray-t. (mert ekkor a GZipStream is Dispose-olva és ezáltal a bufferje is ürítve lett)

    [ Szerkesztve ]

  • Tomi120T

    újonc

    Sziasztok!

    Éppen egy projekten dolgoztam visual studióban (xamarin.android), amikor frissítettem és azóta egyszerűen rossz. :W Az intent osztályra java.Lang.ClassNotFoundExceptoin dob. Valamikor meg az AppCompatActivity ős osztály használatakor az applikáció futásidőben kifagy, egyszerűtől a bonyolult projekttől mindig ezt csinálja.
    Aki a xamarint használja vagy a visual studiót és a legújabb verziót használja azok írjanak már hogy nekik működik-e? Mert van egy sanda gyanúm hogy az új verziót elrontották. Vagy hogy kiderítsük hogy én mit rontottam el. :F

  • Pörp

    senior tag

    Hi!

    Azt hogyan tudom megcsinálni, hogy ha pl. egy for ciklussal kiíratom a számokat 1000-ig egymás mellé, akkor egy billentyű lenyomására bármikor megálljon a kiírás, és kezdje el onnantól visszafelé írni? Tehát fusson a program, ami a számok kiírása 1000-ig, de közben mégis várjon billentyűzetről lenyomást, és ha van, akkor annak megfelelően módosuljon a futás. A Thread.Sleep()-el várnék kiírások között hogy legyen idő is billentyűt nyomkodni.

  • joysefke

    veterán

    Az egyetlen nehézséget az okozza ebben, hogy a Console.ReadKey() blokkol ha éppen nem volt megnyomva billentyű, ekkor addig vár amíg le nem nyomsz egy billenytűt, azt kiolvassa és csak azután megy tovább a végrehajtás. A Console.KeyAvailable segítségével ezt ki lehet küszöbölni, ennek akkor ha true az értéke, akkor volt lenyomva billentyű, amelynek az értéke bufferbe került, ezt ki lehet olvasni a Console.ReadKey()-jel, anélkül, hogy az blokkolna.

    using System;
    using System.Threading;

    // NonblockingReadKey
    class Program
    {
    // N > 1
    static void Count(int N)
    {
    //this will store the pressed key
    ConsoleKeyInfo consoleKey;

    // counter will be the running variable
    // starting to count down from N
    int counter = N;

    // when true: counting down
    // when false counting up
    bool countingDown = true;

    // ends one below zero when counting down and one above N when counting up
    while (!(counter==-1 && countingDown) && !(counter == N+1 && !countingDown) )
    {
    Console.Clear();
    Console.Write(counter);
    Thread.Sleep(250);

    // Console.KeyAvailable == true only if there was a keypress
    //in the console
    if (Console.KeyAvailable)
    {
    // reads the keypress
    consoleKey= Console.ReadKey();
    // reads any remaining keypresses from the buffer
    // if you have pressed more then one keys during sleep-time
    while (Console.KeyAvailable) consoleKey = Console.ReadKey();

    // Immediatelly breaks at reading ESC key
    if (consoleKey.Key == ConsoleKey.Escape)
    { Console.Clear(); break; }

    //switches the counting direction
    // true -> false
    // false -> true
    // countingDown ^= true; ;)
    countingDown = !countingDown;

    }

    //increments or decrements the counter according to
    // the value of countingDown
    if (countingDown == true) { --counter; }
    else { ++counter; }
    }
    Console.Clear();
    Console.WriteLine("Finished!!!");

    }
    static void Main(string[] args)
    {
    Count(100);
    }
    }

    [ Szerkesztve ]

  • nmate91

    csendes tag

    using System;
    using System.Threading;

    namespace ConsoleApp1
    {
    class Program
    {
    static int Increase(int count)
    {
    do
    {
    while (!Console.KeyAvailable)
    {
    Console.WriteLine($"count: {count++}");
    Thread.Sleep(25);
    }
    } while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
    return count;
    }

    static int Decrease(int count)
    {
    do
    {
    while (!Console.KeyAvailable)
    {
    Console.WriteLine($"count: {count--}");
    Thread.Sleep(25);
    }
    } while (Console.ReadKey(true).Key != ConsoleKey.Spacebar);
    return count;
    }

    static void Main(string[] args)
    {
    Console.WriteLine("Press Space to change, and ESC to stop");
    do
    {
    int count = 0;
    count = Increase(count);
    count = Decrease(count);
    } while (Console.ReadKey(true).Key != ConsoleKey.Escape);
    }
    }
    }

    Hasonlo, decrease utan megall, ujra spacet nyomva indul, nullarol. Ha nem nullarol kell, csak ki kell tenni eggyel kijjebb a count deklaralast. Ha kell az 1000 hatarnak, csak a do while-nal kondiciokent kikotod.

    [ Szerkesztve ]

  • Zalanius

    tag

    Még egy variáció alább (.net 4.5+). A fenti kettő amúgy jobb válasz, de eljátszottam kicsit a feladattal async eszközökkel, hátha érdekes lehet. Nem a legszebb a "novekvo" ilyen használata, de ennél a példánál belefér az ilyesmi is, nincsenek más konkurrens részek, amikre még tekintettel kellene lenni. A ReadKey hallgatózás hátránya, hogy ha el is értük a maxot, egy ESC akkor is kell, mielőtt a "Kész..." megjelenhet.

    static void Main(string[] args)
    {
    Console.WriteLine("Befejezés: ESC. Irányváltás: SPACE.");
    CancellationTokenSource cts = new CancellationTokenSource();
    const int MAX = 1000;
    int x = 0;
    bool novekvo = true;
    Task t1 = Task.Factory.StartNew(async () =>
    {
    while (!cts.Token.IsCancellationRequested && x < MAX)
    {
    Console.Write(novekvo ? ++x : --x);
    Console.Write(" ");
    await Task.Delay(50);
    }
    }, cts.Token);

    ConsoleKeyInfo keyInfo = Console.ReadKey(true);
    while (keyInfo.Key != ConsoleKey.Escape)
    {
    if (keyInfo.Key == ConsoleKey.Spacebar)
    {
    novekvo = !novekvo;
    }
    keyInfo = Console.ReadKey(true);
    }

    cts.Cancel();
    Console.WriteLine("Kész. A kilépéshez nyomj meg egy gombot.");
    Console.ReadKey();
    }

    --= Zalán =--

  • BTminishop

    aktív tag

    sziasztok,

    winform-ban rajzolok képeket és belerakom őket egy mátrixba, hogy eltudjam érni őket.

    for (int i = 1; i <= 8; i++) {
    for (int j = 1; j <= 8; j++) {
    rect = new Rectangle(x, y, 75, 75);
    cells[i-1, j-1] = rect;
    Graphics g = e.Graphics;
    g.DrawImage(whiteCell, rect);
    x += 75;
    }
    x = 0;
    y += 75;
    }

    Speciel ez egy sakktáblát rajzol ki teszt szempontjából még csak fehér cellákkal. Hogy tudnám elérni azt, hogy egy click eventre rá rajzoljon valamit a mátrixból kiválasztott elemre pl. egy bábút. Grafikai dolgok terén itt nem nagyon vagyok tisztában. Köszi!

  • Zalanius

    tag

    Ehhez előbb a Click eventet elfogni képes elemre van szükség. Többféleképpen is neki lehet vágni, ha mindenképpen szeretnél egy mátrixot, akkor azt fel lehet építeni pictureBox vagy hasonló elemekből is, és akkor a tömb minden eleméhez hozzárendelhető egy metódus rajzolási célból.

    De itt akár mellőzhetők is a tömbök, ha "canvas" céljából egy pictureBoxot vagy hasonlót alkalmazunk, és a kattintás koordinátáiból állapítod meg utána, hogy a sakktábla melyik mezőjére kell rajzolni. Tegyük fel, hogy adott egy 400*400 pixeles pictureBox (pb), meg valahol a fájlrendszerben egy kép tesztelésre (queen_41.png), ekkor vázlatosan:

    const int WIDTH = 50;
    const int SIZE = 8;
    const int IMGSIZE = 41;
    const string IMGPATH = @"T:\queen_41.png";

    public Form1()
    {
    InitializeComponent();
    pb.MouseClick += Pb_MouseClick;
    }

    private void button1_Click(object sender, EventArgs e)
    {
    Graphics g = pb.CreateGraphics();
    for (int i = 0; i < SIZE; i++)
    {
    for (int j = 0; j < SIZE; j++)
    {
    g.FillRectangle((i + j) % 2 == 0 ? Brushes.White : Brushes.Black, i * WIDTH, j * WIDTH, WIDTH, WIDTH);
    }
    }
    }

    private void Pb_MouseClick(object sender, MouseEventArgs e)
    {
    float x, y;
    x = e.X - (e.X % WIDTH) + (WIDTH - IMGSIZE) / 2;
    y = e.Y - (e.Y % WIDTH) + (WIDTH - IMGSIZE) / 2;
    Graphics g = pb.CreateGraphics();
    g.DrawImage(Image.FromFile(IMGPATH), x, y);
    }

    [ Szerkesztve ]

    --= Zalán =--

  • XP NINJA

    őstag

    Sziasztok!

    Regex-eket még nem használtam, és most elakadtam.

    MatchCollection m2 = Regex.Matches(html, "<td>
    <span style=\"font-style:italic;color:green\">\\s*(.+?)\\s*
    </span></td>", RegexOptions.Singleline);

    Van egy ilyen sorom, ami kigyűjti a két megadott részlet közötti szöveget, de nem tudom összerakni hogy ha a color:red akkor azokat is rakja bele. A sorrend fontos lenne, szóval vagy kapcsolatokkal próbálkoztam de nem működik. :(

    [ Szerkesztve ]

  • BTminishop

    aktív tag

    köszönöm a választ. Kicsit másképp oldottam meg, meg csináltam osztály a sakk figurákhoz stb. :R

  • tboy93

    veterán

    Csak zöld és piros lehet? Ez esetben a green-t a reg kif.-ben cseréld le erre: (red|green)

    [ Szerkesztve ]

  • joysefke

    veterán

    Sziasztok!

    Le akarok szedni YT-ról automatizáltan (barátnőmnek futáshoz) zenéket, mp3 formátumban. Engem nem érdekelnek túlságosan az ilyen olyan kódolások, csak működjön és legyen legalább 192kbps mp3. És lehetőleg tényleg mp3 kódolásban legyen.

    Ezt használom YT librariként:
    https://github.com/Tyrrrz/YoutubeExplode

    A képen egy tetszőleges YT zeneklipphez kinyert AudioStreamInfo bejegyzéseket lehet látni, összesen öt darabot.

    Opus AAC és Vorbis típusú kódolású audióstreamek vannak, mp3 sehol. Opusból van három különböző bitrátával.

    Van ezzel az Opussal valakinek valami tapasztalata?
    -telefonok media playere lejátssza önmagában vagy ez egy WEB-formátum?
    -könnyen konvertálható mp3-má? (értelemszerűen .NET-ben)

    [ Szerkesztve ]

  • Goose-T

    veterán

    Miért pont az Opus az érdekes? Az Android pont a Vorbist támogatja natívan, még a beépített rendszerhangok is olyan formátumban vannak (OGG Vorbis, ha úgy jobban ráismernél). Már ha androidos a telefon, bár más lehetőség nemigen van, mert IOS-re nem teszel csak úgy fel zenéket, a WP meg kvázi kihalt.

    https://fb.me/scharlotterhodes

  • joysefke

    veterán

    Neki pont WP van :)

    Mivel azt látom, hogy a YT videóknál az Opus adja a legtöbb bitráta-opciót, ezért az tűnik a legegyszerűbben használhatónak:
    -(1) Minden videóból kiszedem a bitrátában a legjobban illeszkedő (192kbps környéke) Opus sávhoz tartozó uri-t
    -(2) Letöltöm az Opus kódolású audió fájlt
    -(3) Miután lent van, konvertálom mp3-ra.

    Ez most a terv. Ha lenne 192-es mp3 sáv, egyből azt szedném le, de az alapprobléma az, hogy:

    Egy csomó videónak az audióját szeretném egyszerre letölteni, előre nem tudom, hogy ezek milyen kódolásban, milyen sávszélességekben lesznek fent. A végén pedig egységesen mp3-ban szeretném látni őket. A példaképen (fönt) egyértelműen ez az Opus csoda tűnik a legtámogatottabbnak...

  • cubix

    tag

    ajánlom a youtube-dl nevű szoftvert zenék letöltéséhez. Az MP3-ba convrtáláshoz szüksége lesz még egy "ffmpeg.exe" és egy "ffprobe.exe"-re

    「시작이 반이다」

  • Keem1

    addikt

    Csak halkan kérdezem: egy zenestream szolgáltatás nem lenne egyszerűbb? Spotify, Google Play Music, Deezer, Apple Music, stb. ;)
    Ezres körüli előfizetési díj, több tízmillió zene, és sohat többet nem kell zenét nagy macerával előtúrni, letölteni, esetleg konvertálni.
    Csak meg kell keresni, bekattintani (esetleg listához adni) és már hallgatható. Előfizus konstrukcióban van offline mód is. Ja, és vannak edzéshez, futáshoz való listák (is).

    Én két és fél éve vagyok előfizető, az elején még nem gondoltam így, de mostanra már az a véleményem, hogy youtube-bal, to..enttel bohóckodjon az, akinek két anyja van :DDD

    [ Szerkesztve ]

    Samsung Galaxy S10 | Nexus 7 (2013) | Dropbox reg: https://goo.gl/6rOnTn | OneDrive reg: https://goo.gl/7VH7RU ... Mindketten +500 MB-ot kapunk. Te is, én is. | Revolut: +3000 Ft neked is, nekem is http://bit.ly/2PgWzrG

  • joysefke

    veterán

    Engem nem nagyon érdekel a zene, ő meg nem fog ezért pénzt fizetni. Leginkább csak futásra kell neki

  • harylmu

    őstag

    Ez a feladat tenyleg csak max gyakorlasnak jo. Spotify. Megeri, mert sok mindent nyujt, futashoz pl futos playlistet berak vagy barmit. Raadasul a kabellel se kell bohockodni hogy attoltse a zenet.

    De a tokonloveshez talan ez a cikk segit: https://stackoverflow.com/questions/20500796/convert-pcm-to-mp3-ogg

    [ Szerkesztve ]

  • joysefke

    veterán

    Barátnőm még naptárból is papírt használ, facebookja nincs etc. Az egyetlen stabil pont, amire biztosan számíthatok, hogy meg fog kérni, hogy offline rakjam rá a YT-ról ezt meg azt a telefonjára. Havonta 10-15-20 számot. Fizetni meg biztosan nem fog ilyen streaming csodákért. Én sem. Én zenét sem hallgatok...

    tenyleg csak max gyakorlasnak

    tökéletes, gyakorlom a Task-async dolgokat :)

    Dobjuk légyszi ezeket a streaming előfizetéseket, a YT videók audió tartalmának párhuzamos letöltését azóta már megoldottam, már csak az Opus -> mp3 konverzió van hátra, azt holnap este megcsinálom.

    [ Szerkesztve ]

  • martonx

    addikt

    Halkan elárulom, ezeknek a szolgáltatásoknak a prémium változata a fizetős csak...

    Én kérek elnézést!

  • tboy93

    veterán

    Adott egy solution. Egyik projekt MVC és van egy másik projekt amibe Jasmine van telepítve. Az első projekt script file-jaira szeretnék spec-eket írni. Hogyan hivatkozzam be a fileokat a Jasmineos projektbe? :F

  • joysefke

    veterán

    WPF
    A letöltés szépen működik meg minden, de belefutottam egy problémába, amit nem tudtam megoldani:
    szeretném, ha az összes párhuzamos letöltés állapota egy progress csíkon aggregáltan látszódna, tehát letöltött bájtok/összes letöltendő bájt.

    Na ezt nem tudom megoldani, nem értem, hogy hol a hiba. Attól eltekintve, hogy már ránézésre is ronda. Már többször átstrukturáltam a releváns kódrészletet, de nem akarja az igazságot, a letöltések szépen működnek, de a progress bar nem moccan. debuggolni sem igazán tudom...

    A kód:
    MainWindow.xaml.cs

    Miután a user kiválasztotta, hogy mit akar letölteni, kreálok egy progress objektumot (ez fogja a teljes letöltés állapotát mutatni) és ezt illetve a cél könyvtárat átadom a _session objektum letöltő metódusának. Ez a metódus minden fájlt egy egy Task-async művelettel tölt le, amelyek egy-egy Progress<double> objektumon keresztül tudják állapotukat visszajelezni. Ezeknek az egyes Progress<double>-oknak a visszajelzéseit szeretném egyetlen egy Progress<double>-ba aggregálni. Na ez nem megy.

    private async void _downloadAudios(object sender, RoutedEventArgs e)
    {
    ...
    IProgress<double> [B]progress[/B] = [B]new Progress<double>[/B]([B]a =>[/B] _fileProgressBar.[B]Value = a*100[/B]);
    [B]await _session.DownloadAudioAsync(_folderPath, progress);[/B]
    }

    Másik fájl
    DownloadAudiosAsync:

    public async Task DownloadAudioAsync(string downloadPath, IProgress<double> progress)

    ....
    List<Task> dlTasks = new List<Task>();


    [B]Itt fogom az egyes fájlok teljes méretét illetve az aktuálisan letöltött
    bájt-számokat tárolni. Ezek az adatok az aggregáláshoz kellenek.
    [/B] Az összes Action<double> delegate hozzáfér ezekhez és ugyanazt látják.

    //[B]long[] bytesDownloaded[/B] = new long[_videoDisplayInfos.Count];
    //[B]long[] fileSizes[/B] = new long[_videoDisplayInfos.Count];

    //Előre előkészítem a Progress objektumoknak az üres helyet. Az első
    tömb fogja a valós, a második pedig a dummy (null) Progress objektumokat
    tartalmazni. Indokás később

    [B]IProgress<double>[] fileDLprogresses [/B]= new IProgress<double>[_videoDisplayInfos.Count];
    [B]IProgress<double>[] progressesEmpty [/B]= new IProgress<double>[_videoDisplayInfos.Count];

    [B]A dummy tömböt feltöltöm csupa Progress = null referenciával[/B].
    Indoklás később.

    for (int i=0; i< progressesEmpty.Length; ++i) progressesEmpty[i] = new Progress<double>();

    //összes fájl együttes mérete tárolódik itt
    long totalBytesToDownload = 0;



    [B]//Ezen a for cikluson belül lesznek megkreálva az egyes Action delegate-k,
    melyek elkapják a ciklusváltozót és lemásolják azt. Illetve itt lesznek az
    egyes Task-async letöltések elindítva.[/B]

    //végigmegyünk a letöltendő videókon
    for (int i=0; i < _videoDisplayInfos.Count; ++i)
    {

    //letöltendő videók letöltésre kijelölt streamjeinek adatait kiszedjük
    VideoDisplayInfo videoDisplayInfo2 = _videoDisplayInfos[i];
    AudioStreamInfo streamToDownload2=_videoDisplayInfos[i].PreferredAudioStream;

    //csak ha létezik a videóhoz megfelelő stream
    if (streamToDownload2 != null)

    //fájladatokat (név, útvonal, kiterjesztés) kiszedem/legyártom
    string fileExtension2 = streamToDownload2.Container.GetFileExtension();
    string sanitizedFileName2 = Utils.SanitizeFilename(videoDisplayInfo2.Title);
    string filename2 = Path.ChangeExtension(Path.Combine(downloadPath, sanitizedFileName2), fileExtension2);

    //fájlok méretadatait elmentem
    fileSizes[i] = streamToDownload2.Size;
    totalBytesToDownload += fileSizes[i];


    [B]//Megkreálom az egyes Progress<double> objektumok action delegate-ját.[/B]
    //Minden delegate updatelgeti az őt futtató letöltés által letöltött adatmennyiséget
    //Majd meghívja az aggregált delegatet
    //
    Action<double> action = value =>
    {
    // captured loop iterator
    int index = i;
    long fileSize = fileSizes[index];
    long totalBytesDownloaded;
    lock (bytesDownloaded)
    {
    long oldValue = bytesDownloaded[index];
    bytesDownloaded[index] = (long)(value * fileSize);
    totalBytesDownloaded = bytesDownloaded.Sum();
    progress.Report(totalBytesDownloaded / totalBytesToDownload);
    }
    };

    //megkreálom a valós Progress objektumokat
    fileDLprogresses[i] = new Progress<double>(action);

    //Elindítom a letöltéseket a dummy (null) Progress objektumokkal.

    dlTasks.Add(_youtubeClient.DownloadMediaStreamAsync(streamToDownload2, filename2, progressesEmpty[i]));

    [B]//if blokk vége[/B]
    }

    [B]//for blokk vége[/B]
    }

    // Miután kiléptem a for ciklusból és az int i ciklusváltozó érvényét vesztette lecserélem
    a dummy Progress referenciákat az igazi Progress referenciákra. A for cikluson belül
    nem lehet odaadni az igazi Progress referenciákat, mert az Action delegateben
    a ciklusváltozó akkor még érvényes.

    for (int j = 0; j < progressesEmpty.Length; ++j) progressesEmpty[j] = fileDLprogresses[j];

    // bevárom a letöltést
    await Task.WhenAll(dlTasks);

    }

    [ Szerkesztve ]

  • joysefke

    veterán

    a hiba megvan:

    Valamiért nem működik az, hogy menet közben lecserélem a letöltés metódusnak átadott dummy Progress<> objektumot egy igazira. Nem értem, hogy miért, de így van.

    Tehát a progress repoltolás itt nem működik a Progress objektum cseréje után sem:

    var p = new Progress<double>();
    Task t = _youtubeClient.DownloadMediaStreamAsync(streamToDownload, filename, p);

    // lecserélem a Progress-t valami olyanra ami csinál is valamit
    p = new Progress<double> (value => {....})

    await t

    nem működik.

    Nem értem miért nem működik, hiszen a DownloadMediaStreamAsync metódus is az átadott Progress objektumnak a referenciáját használja, _tudtommal_ nem készít róla fizikai másolatot.

    szerk:
    Uhh bakker, milyen jó volt leírni a problémát, most jövök rá mi a baj :D

    [ Szerkesztve ]

  • BTminishop

    aktív tag

    sziasztok

    WinForm-ban csinálok már egy ideje egy grafikus interfészt egy projekthez. Mostanában nem annyira foglalkoztam ezzel a témával de szerintetek érdemes lenne WPF-ben csinálni inkább, mi a különbség a kettő közt illetve mennyire különböznek? :R

    (nyílván rákerestem de személyes véleményekre vagyok kíváncsi)

    [ Szerkesztve ]

  • Alexios

    addikt

    Érdemes, pl. már csak azért is mert jobban skálázódik különböző felbontásokra.

  • martonx

    addikt

    Winforms a múlt, WPF a jelen / közelmúlt, UWP a jelen / jövő. Aztán persze, ahogy MS váltogatja a technológiáit, ki tudja, hogy az UWP-vel mi lesz hosszabb távon.

    Én kérek elnézést!

  • vlevi

    nagyúr

    Nekem az egyik bajom az a WPF-el, hogy valami irgalmatlanocsmány módon jeleníti meg a szöveget.
    Gondolom azért, mert már nem a WindowsXP-s GDI grafikus megjelenítést használja, hanem Directwrite-ot, de egy átlagos LCD monitoron szinte fáj elolvasni azokat az összevissza álló, elmosódott szövegeket.
    Értem én, hogy technológiai fejlődés, mert hardveres gyorsítás, de, ha ennyivel rosszabb a végeredmény, akkor nem ér semmit az egész.

  • kw3v865

    aktív tag

    Sziasztok!

    Kezdő vagyok C#-ban, és a következő kihívással állok szemben: adott egy C#-os, Visual Studioban megírt WinForm-os desktop alkalmazás, amelyet térképes megjelenítővel kell kiegészíteni. Tehát vektoros objektumokat (ki-be kapcsolható rétegekkel) és OpenStreetMap alaptérképet kell kezelnie, természetesen zoom-mal és mozgatás funkcióval ellátva, illetve az aktuális GPS-pozíciót is meg kell jeleníteni. Találtam 2 olyan C#-os függvénykönyvtárat (SharpMap és DotSharp), ami elvileg erre a célra bevethető, viszont nagyon komoly hátrányuk, hogy gyenge a dokumentációjuk (úgy is mondhtanám, hogy nincs is), és API reference sincs.
    Erre a célra JavaScriptben én az OpenLayerst használtam már, ami tökéletesen megfelel erre, remek dokumentációja is van. Szerintetek ez műküdhet, hogy megírom a megjelenítőt az OpenLayers-es eszközökkel, majd egy böngészőt integrálok a Win Froms-os alkalmazásba és úgy jelenítem meg a térképet? Mennyire járható út ez szerintetek? Ti mit javasoltok?

  • BTminishop

    aktív tag

    Miért nem web appot csinálsz? Miért ragaszkodsz a winform-hoz?

  • amargo

    addikt

    Winforms ba is megtudsz nyitni böngészőt. Mi a cél? Kell valamire használni az alkalmazáson belül a térképet? Vagy csak valamit meg kell jelenítened?
    DevExpress-ben is van térkép, igaz fizetős.

    “The workdays are long and the weekend is short? Make a turn! Bike every day, bike to work too!”

  • kw3v865

    aktív tag

    @ BTminishop
    A cégnél C#-ban fejlesztenek, a program 90%-a már meg van írva, évek óta ezt használják, most már térinformatikai funkciókat is akarnak.
    @amargo
    A Cefsharpot találtam, ez egész jónak tűnik, egyelőre nem látom semmi akadályát a használatának. Egyelőre csak a megjelenítés a lényeg: alaptérkép, rajta vektoros rétegek, ki-be kapcsolgatása, illetve valós időben GPS-pozíció megjelenítése. Erre az általam korábban már használt OpenLayers többnyire alkalmas is.

    A DevExpress-t nem néztem még korábban, de köszi a tippet, elsőre a doksija alapján jónak tűnik. Nem baj, ha fizetős, míg nem túl drága.

    [ Szerkesztve ]

  • zsolti_20

    senior tag

    Sziasztok! Régen sokat foglalkoztam a C#-al főleg a főiskola alatt, de mostanra eléggé elkopott a tudásom, szeretném kicsit fel eleveníteni ezeket. Valahol találok esetleg leírást hogyan megoldható két gép között a kommunikáció? Szeretnék írni egy olyan programot ahol egy egyszerű beszélgetést lehetne lebonyolítani.

    Ez egy gépen még megy is, de a hálózati részével soha nem foglalkoztam még.

  • Xiawave

    aktív tag

    Szia!

    Ezt már nézted? Én egész jónak találom, én is innen mazsoláztam anno a System.Net-et.

    [ Szerkesztve ]

  • BTminishop

    aktív tag

    sziasztok,

    WPF-ben miért nem tudok egymás alá Grideket tenni? 8*8-as táblát kellene rajzolnom de az alábbi eredményt kapom

    A kódom így néz ki :

    StackPanel stack = new StackPanel();
    stack.Orientation = Orientation.Horizontal;

    Content = stack;
    for (int i = 0; i < 8; i++)
    {
    for (int j = 0; j < 8; j++)
    {
    Grid grid = new Grid
    {

    HorizontalAlignment = HorizontalAlignment.Left,
    VerticalAlignment = VerticalAlignment.Top,

    Width = 50,

    Height = 50,

    Margin = new Thickness(0, y, 0, 0)

    };

    if (j % 2 == 0)
    {
    grid.Background = new SolidColorBrush(Colors.Brown);
    }
    else
    {
    grid.Background = new SolidColorBrush(Colors.Black);

    }
    stack.Children.Add(grid);
    }
    y += 50;
    }

  • vlevi

    nagyúr

    Próbáltad már vertikális stackpanelbe rakni a horizontális paneleket, és abba a kockáidat?
    Nem ismerem a WPF-t, de máshol ez szokott lenni a megoldás.

    Még esetleg a droidos gridlayout jutott eszembe, ott ezt úgy oldottam meg, hogy a gridlayout oszlopszámát változattam, és a gridlayout annyi sorba szervezte a feldobált elemeket, ahányra szükség volt az oszlopszámhoz.
    Nem tudom, WPF-ben van-e ehhez hasonló.

    [ Szerkesztve ]

Hozzászólok Aktív témák