Gallery koe

Dell 5530 HSPA modeemi ja Windows 7 64-bit

Dell ei vaan saa tuolle modeemille julkaistua ajureita, ei 32-bittisiä eikä 64-bittisiä. Ongelman voi kiertää oheisen linkin takaa löytyvän ohjeen mukaan:

http://www.mydellmini.com/forum/3g-mobile-broadband-discussion/27310-dell-5530-windows-7-working-gps.html

Suomennettuna vastaava:

  1. Lataa R251153.exe tiedosto Dell:n sivuilta
  2. Tyhjennä %temp% hakemisto kaikesta (Käynnistä->hakukenttään %temp%)
  3. Aja Setup ohjelma joka tuli R251153.exe:n mukana, kunnes törmäät virheilmoitukseen. Älä sammuta asennusohjelmaa vaan mene uudestaan %temp% hakemistoon
  4. Etsi hakemisto jossa on ”Dell Wireless HSPA Mini-Card Drivers.msi” ja kopioi koko tämä hakemisto toisaalle
  5. Sulje asennusohjelma.
  6. Käynnistä Microsoft Orca, avaa äskeinen Dell Wireless HSPA Mini-Card Drivers.msi tiedosto tällä ohjelmalla
  7. Poista seuraavat toimenpiteet (actions):
  8. CustomAction > Authenticate
  9. InstallExecuteSequence > Authenticate
  10. InstallUISequence > Authenticate
  11. CustomAction > CheckGPSSupport
  12. InstallExecuteSequence > CheckGPSSupport
  13. Tallenna MSi tiedosto.
  14. Aja tämä MSI tiedosto. Nyt ajurit toimivat.
  15. Lataa Dell:n sivuilta ”Mobile Broadband Manager” ohjelma. Tiedosto on nimeltään ”DELL_MULTI-DEVICE_A07_R262123.exe”
  16. Tee tälle tiedostolle samat toimenpiteet kuin kohdat 2-7
  17. Lopuksi aja MSI paketti
  18. Rekisteriin pitää vielä merkata seuraava DWORD arvo
  19. HKEY_LOCAL_MACHINE\SOFTWARE\WMCore\GPSSupport DWORD 0
  20. Kun kyseessä 64-bittinen Windows 7, polku on HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\WMCore
  21. Pari kertaa uudelleen käynnistys ja 3G modeemi GPS tuella toimii.

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.

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]

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.