C# tehtävä 1, valokuvausliikkeen tiedot

Tehtänä oli rakentaa luokkakuvaukset kaikista niistä tiedoista joita valokuvausliike toiminnassaan tarvitsee. Ei niinkään simppeli muttei mahdotonkaan.

Itse lähdin ratkaisemaan tehtävää määrittelemällä kriittisimmän päivän mitä voi eteentulla. Kuviteltuna päivänä pitäisi:

  1. Valmistaa valokuvia
  2. Myydä pari kameraa, toinen käteisasiakkaalle ja toinen yritykselle laskulla
  3. Käydä ottamassa hääkuvia
  4. Tilata täydennystä varastoon, kiire joten tämä tehtiin sähköpostilla
  5. karhuta yhtä laskua vuoden vanhasta hääkuvauksesta
  6. Tehdä inventaario
  7. Apunasi ollut myyjä irtisanoutui päivän päätteeksi

Kuvitteellinen tilanne mutta tuona päivänä tietomäärän käsittely on yllättävän korkealla. Koska liike itsessään on pieni, kirjanpidon hoitaa tilitoimisto. Tilitoimistoon hoidetaan perinteiseen tapaan paperilla kaikki. Nuuka yrittäjä tulostaa pankista itse tiliotteet ja toimittaa ne kirjanpitäjälle kunhan on tarkistanut saadut suoritukset.

Ensiksi mietin mitä kaikkea tietoa tarvitsee säilyttää ja hallita. Ei muuta kuin Visual Studiolla class diagrammia vääntämään. Suluissa on viittaus kuviteltuna päivänä tehtävään työhön

  1. kaiken takana yksi luokka joka huolehtii tietokantataulusta (dbtaulu). Seuraavan luokat siis perii tämän dbtaulun.
  2. tuote (1,2,3,6)
  3. asiakas (1,2,3,5)
  4. toimittaja (4)
  5. tilaus (1,2)
  6. tilausrivi (1,2)
  7. lasku (2,5)
  8. laskurivi (2,5)
  9. myyntireskontra (5)
  10. myyntireskontrarivi (5)
  11. maksuehto (5)
  12. myyjä (7)
  13. varasto (4)
  14. maksusuoritukset (5)

Tilaus, lasku, myyntireskontra periaatteessa voisi olla sama taulu. Ajattelin kuintenkin että varmistuksessa myyntireskontralla on suurempi painoarvo kuin tilauksilla. Lisäksi, tietomäärää kasvaa tilauksesta, laskuun ja lopuksi reskontraan.

Koska yksinkertaisimpia tauluja ja samalla luokkia on maksuehto ja myyjä lähdin ratkaisemaan niitä ensiksi. Ja eiku koodaamaan. Luokkadiagrammi syntyi pähkäillen näitä tauluja ja näyttipä se hienolta. Oli periytetty kantaluokasta seuraava, edellinen, lisää, poista, muokkaa yms ”perus” jutut mukaan. Oli jopa interface määritelty jolla huoldehtitaan että jokainen luokka sisältää ne vaadittavat tekijät.

Tässä mallikuva maksuehtoluokasta:

No, tästä pääsi sitten kommentoimaan ja koodaamaan toiminnallisuutta. Ja, sainhan sen toimimaankin. Tosin, koodin siinä osassa joka huolehtii tiedon näyttämisestä ja vastaavista toimenpiteistä tuli yllättävän hankala ja työläs ylläpitää.  Mutta tulisihan se nippa nappa täyttämään sen mitä vaadittiinkin (kaikki tieto vain oli tietokannassa suoraan). Aikaakaan ei mennyt kuin 8 iltaa.

Entäs jos lähtisi siitä että luokka sisältää listan tiedoista ja vieläpä siten että luokan voisi heittää suoraan vaikka datagridview:ille?

Kantaluokista (joista periytetään muut) tuli rautalankana tällainen:

[sourcecode lang=”csharp”]

// Ensin luokka joka on tasoa atom, (yksittäinen maksuehto yms)

public abstract class BusinessBase
{
/// <summary>
/// Business Base: constructori
/// </summary>
public BusinessBase()
{
}
/// <summary>
/// Update komennon pohja
/// </summary>
public virtual void Update()
{
}
/// <summary>
/// Delete komennon pohja
/// </summary>
public virtual void Delete()
{
}
/// <summary>
/// Update komennon pohja
/// </summary>
public virtual void Update()
{
}
/// <summary>
/// Yhden rivin lukutoiminnon pohja
/// </summary>
protected virtual void Read()
{
}

}
// Sitten luokka joka sisältää atomit

public class BusinessListBase<T> : BindingList<T> where T : BusinessBase

{

}

[/sourcecode]

Nyt oli siis perusluokka määritelty. Mika Kolari on kirjoittanut yhteenvedon eri geneerisistä kokoelmista.  Kannattaa tulostaa talteen.

Ja sitten tietokantataulun mukainen luokka:

[sourcecode lang=”csharp”]

public class myyja : BusinessBase
{
// luokalle toimintaa, kentät yms

private int _myyjaID=0;
private string _myyjanimi="";
private void Read(SqlDataReader dr)
{
this._myyjaID = Convert.ToInt16(RuntimeHelpers.GetObjectValue(dr["myyjaID"]));
this._myyjanimi = Convert.ToString(RuntimeHelpers.GetObjectValue(dr["myyjaNimi"]));
}

public override void Update()

{

//tähän tulee yksittäisen myyjän update toiminnot, poisto, lisäys ja muutos (delete,insert,update). Helpoiten menisi stored procedurella?

}

public int myyjaID
{
get { return this._myyjaID; }
set { this._myyjaID = value; }

}
public string myyjaNimi
{
get { return this._myyjanimi; }
set { this._myyjanimi = value; }
}

}

public class myyja_list:BusinessListBase<myyja>
{
/// <summary>
/// Luetaan myyjät sisään
/// </summary>
public void Read()
{
}

/// <summary>
/// Luodaan myyjä luettelo ja haetaan kannasta tiedot
/// </summary>
/// <returns></returns>
public static myyja_list Getmyyja_list()
{
myyja_list list2 = new myyja_list();
list2.Read();
return list2;
}
public static myyja_list Getmyyja_list_dummy()
{
myyja_list list2 = new myyja_list();
//list2.Items.Add(myyja.GetDummy());

//Jos halutaan pelata ilman tietokanta, luodaan myyja luokalle vielä oma GetDummy funktio joka palauttaa myyjä luokan satunnaisella sisällöllä
return list2;
}

}

[/sourcecode]

Jos BusinessListBaseen olisi kytkettynä IBindingListView interface, saataisiin sorttaukset ja filtteröinti toteutettua.

Huom. koodit ei itsessään toimi vaan tarkoitus on näyttää rautalankamalli jonka päälle toteutin toiminnallisuuden. Varsinaisessa formissa jossa tietoa käsitellään luonti ja kytkentä tapahtuu seuraavasti:

[sourcecode lang=”csharp”]

private void SimpleGrid_Load(object sender, EventArgs e)
{
//Luodaan bindingsourceen myyja_list luokka tietoineen
this.bindingSource1.DataSource = myyja_list.Getmyyja_list();
//Sallitaan uusien rivien lisäys
this.bindingSource1.AllowNew = true;
}
public SimpleGrid()
{
//luodaan eventti joka laukeaa kunhan formin omat kuviot on selvät
base.Load += new EventHandler(this.SimpleGrid_Load);
InitializeComponent();
}

[/sourcecode]

Formilla oli siis valmiiksi bindingSource1 joka on kytketty datagridview komponenttiin. Tässä vain ilmoitetaan bindingSource:lle tietolähde josta tiedot haetaan.

Koe postaus Word 2010 ohjemalla

Tottahan toki tämä pitää kokeilla. Tämä siis leipätekstinä.

Kategoriaksi laitettu Ravintola Milky-way

Yläpuolella pitäisi olla nyt valokuva.

[sourcecode language=”csharp”]
private void vendorsBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.vendorsBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.saruDataSet);

}
[/sourcecode]

Sitten SmartArt:

Yksi piirakka tähän alapuolelle.

Virransäästöä, osa 1

Toimialueessa on 5 konetta jotka voi olla pois päältä yöllä. Toki koneet voi itse sammuttaa mutta usein ne vain jäävät päälle. Ja, aamulla aikaa kuluu odottamiseen kun koneet yksitellen käynnistyvät.

Tavoitteena virransäästössä on että toimialueen ohjauskone hoitaa iltaisin sammutuksen ja vastaavasti käynnistyksen aamulla.

Etäältä käskyttäessä yksittäisen koneen saa virransäästötilaan (suspend) helposti komennolla:

[sourcecode language=”vb”]
psshutdown \\ws3.ad.local -d -t 1
[/sourcecode]

psshutdown ohjelman voi ladata Microsoft:n sivuilta.

Vastaavasti koneen herätyksen voi tehdä wake-up ohjelmalla, tässä käytössä on rw.exe niminen ohjelma. Ohjelma vaatii verkkokortin MAC osoitteen. Lisäksi verkkokortin asetuksissa pitää sallia Wake-up toiminto päälle ja lisäksi Windows:ssa sallia ”tämän laitteen herättävän koneen”.

Tämän jälkeen herätys horroksesta tapahtuu

[sourcecode]
RW /m:001122334455
[/sourcecode]

jossa 001122334455 on verkkokortin MAC osoite herätettävässä koneessa.

Virtuaalikone ympäristö

Kurssilla opittavien asioiden ”kotiläksyihin” asentelin 3 virtuaalikonetta. Kombinaatioita on varmasti monia mutta tässä yksi:

Domain controller

Windows Server 2008 joka on promotettu toimialueen PDC:ksi. Virtuaalikoneen asetuksiin laitoin kaksi verkkokorttia päälle:

  1. Local only. Windows 2008:aan tälle on annettu kiinteä ip 192.168.22.1
  2. Oman koneen verkkokortti. Windows 2008 hakee DHCP:llä ip-osoitteen hosti koneen kulloisestakin verkosta. Jos verkkoyhteys hosti koneella vaihtuu verkkokortilta toiselle (lan tai wlan), pitää vain tämän koneen virtuaalikoneen asetuksista käydä muuttamassa.

Lisäksi asensin tälle koneelle Network Policy and Access Services roolin. Perusasennuksesta on hyvät ruutukaappaukset  windowsnetworking sivustolla.  Muistia koneelle on varattu 992 megaa. Ohessa ruutukaappaus

Windows 2008 DC koneen perusasetukset

Windows 2008 DC koneen perusasetukset

SQL server kone

Virtuaalikoneen asetuksissa vain yksi verkkokortti, local only. Mukaan asennettu SQL server 2008 + pakolliset hilkkeet. Kone lisätty domainiin memberiksi (Oma tietokone-ominaisuudet-liitä toimialueeseen). Myöhemmin tälle koneelle ajattelin laittaa varsinaiset ASP.NET harjoitelmat. Kun koodiharjoituksissa on vaihe jossa ei tarvi SQL serveriä, koneen voi pitää suljettuna. Muistia koneelle on annettu 847 megaa. Ohessa ruutukaappaus tästä koneesta:

WS2008-iis-2

 

Windows 7 clientti

Samoin, yksi verkkokortti annettu virtuaalikoneessa ja se local only. Jos ulkoverkkoon pitää päästä, DC kone hoitaa reitityksen. Koneita on kopioitu kahdet, toisessa Visual Studio 2008 ja toisessa Visual Studio 2010 beta.

Kun ei hötkyile, 4:n gigan muistilla varustettu kannettava hoitaa nämä koneet ”kohtuullisella” ajalla. Itseasiassa hommassa jäi 2 kpl 2 gigasia kampoja ylimääräisiksi, tarvetta?

Excel tiedoston muokkaus WSH:lla

Tallenna oheinen koodi tiedostoon muokkaus.vbs. Tiedosto voi olla vaikka työpöydällä. Raahaamalla excel tiedosto ”muokkaus.vbs” tiedoston päälle, käynnistyy prosessi. Prosessi pyörii taustalla oman aikansa ja lopuksi työpöydälle ilmestyy muokattu tiedosto.

[sourcecode language=”vb”]   
Dim ArgObj
    Set ArgObj = WScript.Arguments
    sfilename =ArgObj(0) ’luetaan raahatun tiedoston nimi

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.GetFile(sfilename)
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkbook = objExcel.Workbooks.Open (sfilename)

    intRow = 2

’tässä siirretään solut B1 ja C1 talteen

    kk1 = objExcel.Cells(1,2).value
    kk2 = objExcel.Cells(1,3).value

’soluun A1 lisätään teksti

    objExcel.Cells(1,1).value="Muokattuteksti"

’solut B1 ja C1 tyhjennetään
    objExcel.Cells(1,2).value=""
    objExcel.Cells(1,3).value=""

’soluista B1 ja C1 talteen otetut arvot tallennetaan soluun C1 ja G1
    objExcel.Cells(1,3).value=kk1
    objExcel.Cells(1,7).value=kk2

    akk = (month(kk1))
    ayy = (year(kk1))
    slyhyt =  Right("00" & Month(kk1),2)

’Käydään excel sivua läpi niinkauan että törmätään sanaan TULOSLASKELMA
    Do Until objExcel.Cells(intRow,2).Value = "TULOSLASKELMA"
’Siirretään sarake F -> I
        objExcel.Cells(introw,9).value = objExcel.Cells(introw,6).value
        objExcel.Cells(introw,6).value = ""
’Siirretään sarake E -> G
        objExcel.Cells(introw,7).value = objExcel.Cells(introw,5).value
        objExcel.Cells(introw,5).value = ""
’Siirretään sarake D -> E
        objExcel.Cells(introw,5).value = objExcel.Cells(introw,4).value
        objExcel.Cells(introw,4).value = ""
        intRow = intRow + 1
    Loop

’lopuksi tallennetaan excel tiedosto uudella nimellä…

    objExcel.DisplayAlerts = False
    objWorkbook.SaveAs (objFSO.GetParentFolderName(objFile) & "\(" & ayy & slyhyt & ")" & objFSO.GetBaseName(objFile) & "siistitty." & objFSO.GetExtensionName(objFile))
    objWorkbook.close
    objExcel.Quit

[/sourcecode]

Kauan eläköön Firefox

Oheinen kuva tulee joka kerta kun antaa Firefox:n automaattisen päivityksen pyöriä. Ja, eiku käsin poistamaan ja käsin asentamaan uudelleen. Tiedäthän, ohjauspaneeli – lisää / poista sovellus – firefox – poista asennus. Epämiellyttäväksi tämän tekee se että firefox:ssa on sen seittämän eri lisuketta säätöineen.

Mutta miksi firefox tekee näin?

Firefox:n virhekannassa kerrotaan vastaavasta tilanteesta mutta siinä käyttäjä on ollut liikkeellä ns. rajoitettuna käyttäjänä. Itse pyörin koneessa (Windows:n termein sanottuna) tehokäyttäjänä. Muut automaattipäivitykset toimivat, jopa Applen.

Sopii toivoa että 3.5 versio firefox:sta korjaa vihdoin tilanteen.

Aina ei näköjään open-source ole se toimivin ratkaisu. Meneppäs tästä ongelmasta kyselemään open source fundamentalisteilta. Ei kiitos.

Ns. Lex Nokia

Pitihän se esitys lukea läpi. Tässä yksi kohta jota ei julkisuudessa näy ja yllätyin positiivisesti:

9 §
Tunnistamistietojen käsittely palvelujen toteuttamiseksi ja käyttämiseksi

Tunnistamistietoja saa käsitellä siinä määrin kuin se on tarpeen verkkopalvelun, viestintäpalvelun tai lisäarvopalvelun toteuttamiseksi ja käyttämiseksi sekä jäljempänä säädetyllä tavalla tietoturvasta huolehtimiseksi.

Tunnistamistietoja saa käsitellä vain teleyrityksen, lisäarvopalvelun tarjoajan, yhteisötilaajan ja tilaajana olevan oikeushenkilön palveluksessa oleva sekä näiden lukuun toimiva luonnollinen henkilö, jonka tehtävänä on käsitellä tietoja tässä luvussa erikseen säädettyjen tarkoitusten toteuttamiseksi.

Aikaisempi laki (vuodelta 2004) ei tuntenut käsitettä ”lisäarvopalvelun tarjoaja”. Operaattorit siis estivät lisäarvopalvelun tarjoajilta toiminnan televerkossa esimerkiksi vikatilanteiden selvittämiseksi.

Käytännössä tämä tuli esille ADSL yhteyksien katkeamisen yhteydessä. Rupea siinä sitten soitteleen Soneralle että yhteysnumerolla nnnn ei vastaa, onko kaivuri käyny paikalla vai miksei homma toimi.

Kun selvität oman liittymän tilaa ei ongelmaa ole esiintynyt, ongelma oli vain kaikilla kolmansilla osapuolilla jotka koittivat hoitaa tehtäviään joihin asiakaat ne oli valtuuttanut.

Diggi Daggi

Lahden kaupungin kirjasto tarjoaa asiakkailleen Naxos:n musiikkikokoelman netistä kuunneltavaksi pelkästään kirjastokortin numeron syöttämällä.

Palvelussa on rajoitteensa:
– 15 minuutin selausmahdollisuus
– kappaleet on pakattu melko tiukkaan
– 10 yhtäaikaista käyttäjää
Näistä rajoitteista huolimatta ihan kelvollinen kanava tutustumaan eri levytyksiin.

Klassisen musiikin ystävänä kokeilin heti palvelua ja löysin taas uutta ja tuntematonta. Mozart sävelsi  aikoinaan laulunäytelmän (singspiel) Bastien und Bastienne. Näytelmän hullun taikurin aaria paljastui varsin hauskaksi niin sävelmän kuin sanojenkin suhteen.

Diggi, daggi,
schurry, murry,
horum, harum,
lirum, larum,
raudi, maudi,
giri, gari,
posito,
besti, basti,
saron froh,
fatto, matto,
quid pro quo.

Sanoitus muistuttaa niin herkullisesti nykyaikaisia ekonomi-konsultteja jotka tietävät kaikesta kaiken ja tarjoavat lääkkeekki liirum-laarumia. Jotenkin tulee mieleen digi-tv polemiikki, soneran, elisan ja gigantin sloganit. Johtuneeko sitten kieroutuneesta huumorista?

Löytämäni levytys on Naxos:n tyyliin tehty. Diggi, daggin laulaa basso Conal Coad yhdessä Tasmanian sinfoniaorkesterin kanssa. Sinänsä mielenkiintoista että Classical Music Archive ei sisällä lainkaan Bastien und Bastienne teosta.

Linkit:

Naxos:in musiikki kirjasto

Parempi tapa aukaista tietty hakemisto

1. Luo pikakuvake työpöydälle

2. Anna pikakuvakkeen kohteeksi ”explorer.exe”

3. Pikakuvakkeen nimeksi hakuamasi, esimerkiksi ”Keskeneräiset”

4. Aukaise pikakuvakkeen ominaisuudet

5. Anna uusi kohde: %windir%\explorer.exe /e, /root, ”c:\Documents and settings\käyttäjänimi\Omat tiedostot\keskeneräiset”

6. Paina Ok

Tämän älkeen työpöydällä on kuvake joka aukaisee omissa tiedostoissa olevan keskeneräiset kansio omaan selausikkunaan siten että keskeneräiset kansio on ns. root kansio eli ylin selattava kansio.

Screencast linkki

”mese” viirus ja sen poisto

Netti tarjoaa joitakin ohjeita messengerissä liikkuvan photo-album viiruksen poistamisesta. Tässä yksi:

1. Mene Käynnistä sieltä Suorita
2. Kirjoita ”regedit” ja OK
3. Etsi seuraavaa polku HKEY_LOCAL_MACHINE\
4. Sen alta software
5. Sen alta microsoft
6. Sen alta Windows
7. Sen alta currentversion
8. Sen alta shellserviceobjectdelayload
9. Nyt oikealle puolelle ikkunaa pitäisi tulla rivejä joista yksi alkaa sanalla printers,
10. Ota oikealta sivulta numerosarja talteen ja poista koko rivi ensin sinistämällä printers ja painamalla delete näppäintä
11. Selaa vasenta luetteloa ylös
12. Selaa kohteeseen HKEY_CLASSES_ROOT\CLSID
13. CLSID haarasta löydät samaisen numerosarjan kuin mitä oli printers kohdassa (löytyy kansio kuvakkeena)
14. Sinistä ko. kansio ja paina F2 ja lisää numerosarjan alkuun — merkit.
15. Poistu regedit ohjelmasta
16. Boottaa kone.
17. Sen jälkeen poistellaan (jos löytyy) seuraavat tiedostot:
1. notiffy.dll (c:\windows\system -kansiossa)
2. printers.exe (c:\windows\systems -kansiossa)
3. new.txt (userprofile -kansio (siis omat tiedostot kansiossa))
4. Ja vielä Windows kansiosta ”c:\windows” kaikki zip -tiedostot joiden nimi on jotain tyyliä ”images0″,”photos0”, ”album”, ”photo”, ”pictures0” tai ”picture”
18. Lopuksi tyhjennä roskakori

Ja se on siinä!

Huom. Joissakin koneissa windows kansio on nimellä winnt.