Tuesday, May 29, 2007

.Net biblioteka video montavimui

Neseniai programming@konferecijos.lt mailing liste kažkas prašė bibliotekos garso kodavimui.

Šiandien užtikau Auckland'o blog'e Splicer įrankį.


Ką gi jis gali daryti:
* Encode video or audio suitable for use on a website.
* Create slideshows from images, videos and audio.
* Apply effects and transitions to audio and video.
* Grab System.Drawing.Image clips from a video at certain times.
* Add new soundtracks to existing video clips.
* Watermark videos.
* Build a video editing suite, if you were so inclined.


Splicer galite rasti čia : http://www.codeplex.com/Wiki/View.aspx?ProjectName=splicer

Monday, May 28, 2007

Dokumentų spausdinimas

Vienas klausimas yra kokį būda naudoti ataskaitoms generuoti, o visai kitas, kaip į dokumentą duomenis sudėti.

Pirmasis variantas (kurį prieš pusę metų dariau) buvo paprastas switch / replace sakinių rašymas.

Rezultas - dėl kiekvieno menkniekio reikia programuoti. Tikrai nepavydinėtina.

Ką gi, naudojame kitą būdą, juk vis dėlto, gyvename .Net aplinkoje, ir skirtingai nei java yra daug ir įvairių kalbų. Tuo ir pasinaudokime.

Galbūt dar mažai kam žinoma, bet greitai auganti kalba Boo :)

Boo yra dinaminė kalba, pagrįstas pytono sintakse. Ką gi mums duoda Boo.
Ogi du dalykus:
  • Boo turi interpretatorių
  • - kurį galime įtraukti į programą
  • Įdomiau gyventi



  • Taigi, dabar vietoje skurdžių sakinių

    ...
    if (m_node.InnerText = "Studento vardas">)
    m_node.Text = student.Name + student.Surname
    ...



    galime rašyti taip:
    kode:


    Interpretator m_interpetator = new Interpretator()
    m_interpratator.setValue ("RootEntity", student);

    ...
    m_interpretator.Eval(node.InnerText);
    m_node.Text = m_interpretator.LastValue
    ..




    dokumento šablone tuomet galima rašyti ką tik norime.
    Pavyzdžiui, dokumento pradžioje galime įdėti paslėptą tag'ą (jei konkrečiau - tai input field'ą) su tokiu kodu "Mokinys = RootEntity".

    tuomet tose vietose, kur turi atsidurti tekstas įdedame tokius paslėptus tag'us:

    vardas = Mokinys.Name + Mokinys.Surname; vardas.ToUpper();


    Šiais dviem sakiniais sujungėm mokinio vardą ir pavardė ir padarėm juos upper string'ais. Kadangi tai yra .Net aplinka, tai praktiškai galima naudotis absoliučiai visomis funkcijomis, kurias duoda .Net


    Daugiau jokių switch replace! :)

    Ataskaitų generavimas

    Yra užduotis : programa turi spausdinti įvairius dokumentus - sutartis, objektų sąrašus ir pan.

    Yra keli atsakymo variantai:
  • HTML templeitai
  • - net nepradėsiu kalbėti apie tai. Visi žinome kaip daryti replace'us.

  • CrystalReports
  • - teko naudoti porą kartų. Geri, greitai veikia. Bet širdies nedžiugina. Traukti ir kišti duomenis per datasetus nėra labai jau gudrus dalykas.
    Be to, už visą tą darbą gauni tik paprastą neredaguojamą dokumentą.

  • SharpReports
  • - tas pats kas crystal reports, tik laisvas produktas. Laisvė yra gerai, bet reportai ir afrikoj reportai. Ne.

  • Automatizuoti wordą
  • - mintis visai nebloga. Turint omeny, kad gauname begalę formatų, galimybę redaguoti duomenis po atspausdinimo. Tik nežinia kaip tuo wordu programuoti. Turbūt kažkokiu bibliotekų reikia. Be to, kažkas sakė, kad stabdo.

    Bet gal melavo

  • Automatizuoti OpenOffice
  • - kodėl gi ne? Formatas aiškus, visiems prieinamas. Bibliotekų yra
    OpenOffice į programą įdėti galima.

    Undo / Redo galimybės programoje (2 dalis)

    Ankščiau rašiau apie tai, kad mūsų kuriamoje desktop programoje reikia galimybės atšaukti naudotojo padarytus veiksmus.

    Nors API undo atžvilgiu dar nėra iki galo nusistovėjusi (tiesą sakant, undo mechanizmas šiek tiek *nervina*, nes jam *palaikyti* reikia tam tikrų pastangų), sprendimas yra.

    Sprendimas veikia, ir štai kaip jis maždaug atrodo.

    Undo mechanizmui užtenka turėti sąrašą objektų, kurie gali atstatyti naują būseną į seną būseną. Tarkime, IMemento:


    ///
    /// An interface for all undo / redo actions
    ///

    public interface IMemento
    {
    ///
    /// Restores the state of the object.
    ///

    /// A new memento, which performs the Redo action
    IMemento Restore();
    }


    Kiekvienas IMememtno Restore() metode atstato kokią nors informaciją į prieš tai buvusį būvį.

    Man kol kas prireikė dviejų memento tipų:
    PropertyMenento - atstato bet kurio properčio reikšmę į prieš tai buvusį
    DelegateMemento - lengvai kustomizuojamas memento per delegatus