<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TimoKallioDotNet</title>
	<atom:link href="http://www.timokallio.net/blogi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.timokallio.net/blogi</link>
	<description>Programmer&#039;s Learning Environment</description>
	<lastBuildDate>Mon, 21 Feb 2011 14:25:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>WinForms-WebService-projektin esittely</title>
		<link>http://www.timokallio.net/blogi/winforms-webservice-projektin-esittely/</link>
		<comments>http://www.timokallio.net/blogi/winforms-webservice-projektin-esittely/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 15:59:25 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[Projektit]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=127</guid>
		<description><![CDATA[Mainitsin aiemmassa blogi-kirjoituksessani ( Liukuva WPF-paneeli WinForms-sovellukseen ) työn alla olevasta Windows-sovellusprojektista, jonka tavoitteena oli luoda pienimuotoinen sovelluskokonaisuus tämän sivuston vieraskirja-osiossa olevien viestien hallintaan suoraan oman Windows-järjestelmän työpöydältä. Tässä postauksessa tarkoitukseni on esitellä kyseiseen projektiin liittyvät keskeiset seikat. Vuorossa on siis pieni esittely siitä, miten sain tämän sivuston MySql-tietokannan ja C#-kielellä luodun WinForms-sovelluksen kommunikoimaan keskenään. [...]]]></description>
			<content:encoded><![CDATA[<p>Mainitsin aiemmassa blogi-kirjoituksessani ( <a href="http://www.timokallio.net/blogi/liukuva-wpf-paneeli-winforms-sovellukseen/"><span class="link">Liukuva WPF-paneeli WinForms-sovellukseen</span></a> ) työn alla olevasta Windows-sovellusprojektista, jonka tavoitteena oli luoda pienimuotoinen sovelluskokonaisuus tämän sivuston vieraskirja-osiossa olevien viestien hallintaan suoraan oman Windows-järjestelmän työpöydältä. Tässä postauksessa tarkoitukseni on esitellä kyseiseen projektiin liittyvät keskeiset seikat. Vuorossa on siis pieni esittely siitä, miten sain tämän sivuston MySql-tietokannan ja C#-kielellä luodun WinForms-sovelluksen kommunikoimaan keskenään. Lisäksi suurennuslasin alla on luodun WinForms-sovelluksen käyttöliittymä, jonka pyrin luomaan testimielessä hieman perinteistä staattista Windows-käyttöliittymää joustavammaksi.</p>
<p><span id="more-127"></span></p>
<h4 class="postHeading">WebServicen luonti</h4>
<p>Lähtökohdiltaan projektin aihe oli varsin mielenkiintoinen ja haastava, sillä ajattelin toteuttaa järjestelmän tietokannan ja client-ohjelman välisen yhteydenpidon perinteisen WebService-rajapinnan avulla. Tämän sivuston <a href="http://www.timokallio.net/vieraskirja"><span class="link">vieraskirja-osion</span></a>, kuten myös koko muun sivuston, toiminnallisuus on toteutettu PHP-kielen avulla, joten luonnollisesti tarkoituksena oli, että myös sivustoon kehitettävä WebService luotaisiin PHP:n avulla. Lähdin siis liikkeelle projektin toteutuksessa yksinkertaisesti siitä, miten PHP-kielellä on ylipäätään mahdollista luoda WebService-rajapinta. Aiempaa kokemusta minulla ei ollut PHP:n osalta aiheen tiimoilta, mutta toki tiesin, että WebService-rajapinnan luonti aivan alusta alkaen on melko kivulias prosessi, jos käytössä ei ole mitään luontiin tarkoitettuja aputyökaluja, kuten Visual Studiota, tai kolmannen osapuolen tarjoamaa valmista palvelua. Olin tutustunut WebService-teknologiaan aiemmin .NET-tekniikoiden puolella, joten perusteet asiasta olivat selvillä.</p>
<p>Lähdin etsimään PHP:lle tarkoitettua valmista kolmannen osapuolen tarjoamaa palvelua, jonka avulla voisin luoda tarvittavan WebServicen. Pienimuotoisen kenttätutkimuksen jälkeen päädyin valinnassani NuSoap-nimiseen avoimen lähdekoodin palveluun, jonka avulla voidaan kehittää PHP-WebService-rajapintoja, jotka perustuvat WSDL 1.1, SOAP 1.1 ja HTTP 1.0/1.1 standardeihin. Palvelun <a href="http://sourceforge.net/projects/nusoap/files/" target="_blank"><span class="link">lataussivustolta</span></a> on mahdollista ladata myös NuSoap-kirjaston käyttöön liittyvä dokumentaatio. Lisäksi palvelun käytöstä on käyty lukuisia <a href="http://sourceforge.net/projects/nusoap/forums/forum/193579" target="_blank"><span class="link">keskusteluja</span></a>, joiden avulla on helppoa sisäistää sen hyödyntämiseen liittyvät perustason seikat.</p>
<div style="float:left;margin:0 10px 0 0">
<a href="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva5.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva5_p.jpg" alt="Kuvaus" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>1. Client lähettää pyynnön jonkin web-metodin suorittamisesta WebService:lle, joka vastaanottaa tunnistuksessa käytettävät salasanat ja tunnistusavaimen sekä muut parametrit.<br />2. WebService suorittaa pyynnön autentikoinnin.<br />3. Autentikointi onnistui, joten WebService suorittaa pyydetyn toiminnon mukaisen SQL-kyselyn tietokantaan.<br />4. Tietokantamoottori palauttaa SQL-kyselystä palautuneet tiedot WebService:lle.<br />5. WebService kokoaa kutsujalle palautettavat tiedot palveluun rekisteröityihin tietotyyppeihin.<br />6. WebService lähettää kootut tiedot client-ohjelmalle.</p>
</div>
</div>
<p>Koska WebService-rajapintaa voidaan pitää periaatteessa julkisena, tarkoituksenani oli luoda palveluun jonkinmoinen käyttäjän tunnistustoiminto. Palvelun jokainen SOAP-kutsu autentikoidaan siis erikseen kahden epämääräisen salasanan ja yhden vaihtuvan tunnistusavaimen avulla. Kyseiset tunnukset on lisäksi suojattu tiivisteiden avulla, kun käyttäjä lähettää ne SOAP-kutsussa verkon yli WebService:lle.<span style="clear:left"></span></p>
<p>Haastavimmaksi ongelmaksi WebServicen luonnissa koitui tarvittavien tietotyyppien rekisteröinti palveluun. Ajatuksena oli siis luoda rajapintaan ilmentymä käsiteltävien tietokannan taulujen riveistä. Näiden tietotyyppien avulla siten kuljetetaan tietokannasta palautuneet rivit client-ohjelmalle tai esimerkiksi päivityskyselyn johdosta päivitettävä rivi client-ohjelmasta tietokantaan. SOAP-standardi kutsuu tämänkaltaisen toiminnallisuuden mahdollistavia tietotyyppejä nimellä &#8220;complex data type&#8221;. Käytännössä tämän tyypin tietotyyppi voi siis olla joko struktuuri (struct) tai taulukko (array). Luonnollisesti yhteen array-tietotyyppiin voidaan sijoittaa perus tietotyyppien (simple types) lisäksi esimerkiksi joukko struct-tyyppejä, jonka avulla on siis mahdollista kuljettaa esimerkiksi joukko tietokannan rivi-ilmentymiä yhdessä kokoelmassa haluttuun kohteeseen.</p>
<h4 class="postHeading">Client-ohjelman käyttöliittymä</h4>
<p style="font-style:italic">(Voit avata kuvat klikkamalla hiirellä niistä. Voit löytää selvitykset kustakin näkymästä kuvien kuvateksteistä.)</p>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva1.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva1_p.jpg" alt="Kayttoliittyma" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Käyttöliittymän ulkoasu on tummanpuhuva. Ulkoasussa kiinnitettiin huomiota erityisesti tekstien fonttityyppiin ja -kokoon. Microsoftin perus fontti &#8220;Sans Serif&#8221; sais siis väistyä ja &#8220;Seqoe UI&#8221; otettiin tilalle. Fontin oletuskokoa kasvatettiin 10 pisteeseen. Päivämääriä käsitellään perinteisen Windows-kalenterikomponentin avulla, jonka kokoa on myös hieman kasvatettu alkuperäisestä.</p>
</div>
</div>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva2.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva2_p.jpg" alt="Kayttoliittyma" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Uusi vastaus kirjoitetaan erillisessä ikkunassa, jotta itse viestiä, johon vastataan, voidaan tarkastella samanaikaisesti.</p>
</div>
</div>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva3.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva3_p.jpg" alt="Kayttoliittyma" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Kun tunnistetiedot tallennetaan sovellukseen, ne tallettuvat samalla sovelluksen muistiin pysyvästi, jolloin niitä ei tarvitse antaa aina uudelleen, kun sovellusta käytetään myöhemmässä vaiheessa.</p>
</div>
</div>
<div style="float:left">
<a href="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva4.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/vieraskirja_desktopclient/kuva4_p.jpg" alt="Kayttoliittyma" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Sovelluksen muisti voidaan luonnollisesti tyhjentää, jolloin muistista poistetaan sinne tallennetut tunnistetiedot ja WebServicen kautta haetut tietokannan tiedot. Kun sovelluksessa ei ole hallittavaa tietoa saatavilla, käyttöliittymän tekstikentät menevät piiloon käyttäjältä. Tekstikentät menevät piiloon myös, mikäli yhtään viestiä ei ole aktivoitu käsiteltäväksi.</p>
</div>
</div>
<div style="clear:left"></div>
<p>Noniin..ja palautetta sovelluksen ulkoasusta ja käyttöliittymän toiminnallisuudesta saa antaa. Omasta mielestäni esimerkiksi käyttöliittymän värit ovat hyvin mielikuvituksettomat (mustaa ja harmaata). Jos haluat antaa vinkkiä esimerkiksi värien käytöstä normaaleissa työpöytä-sovelluksissa, niin kommentoinnin sana on vapaa. Myös jos tiedät jotain hyviä kirjoja värien käytöstä kyseisen aiheen saralla, niin ehdotuksia voi antaa.</p>
<p>Yhden asian haluan vielä nostaa esille kehitetyn sovelluksen käyttöliittymästä, joka koskee myös yleisesti kaikkien Windows-sovellusten kehittämistä. Mielestäni siis Windows-käyttöjärjestelmien tarjoama oletus fonttikoko on aivan liian pieni. Miksi käyttäjien silmiä pitää siis rasittaa pienellä tekstillä? Jos olet sovelluskehittäjä, niin toivottavasti tiedostat ongelman ja et käytä pienikokoisia fontteja omassa sovelluksessasi. Itse en ainakaan tule enää niin tekemään.</p>
<h4 class="postHeading">Versio 2.0</h4>
<p>Mikäli jatkan vielä kyseisen projektin parissa &#8220;tuusaamista&#8221;, niin ajatuksena on ollut, että toteuttaisin sovellukseen vielä vieraskirja-tietokannan varmuuskopiointi-ominaisuuden. Ominaisuus olisi siis mahdollista toteuttaa mitä luultavammin esimerkiksi .NET:n sarjallistamis-tekniikoiden avulla. Tällöin tietokannan palauttaminen voitaisiin hoitaa luonnollisesti siirtämällä aiemmin sarjallistettu tieto takaisin tyhjennettyyn vieraskirja-tietokantaan.</p>
<p>Toiminnon toteuttaminen voisi olla hyvin mielenkiintoinen operaatio sekin, mutta nähtäväksi jää löydänkö motivaation kipinän vielä itsestäni tämän osan tekemiseksi. Itselleni on siis tavanomaista, että en koske enää uudelleen valmiiksi saamiini projekteihin, vaan siirrän ne bittiarkistojen kätköihin pölyyntymään.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/winforms-webservice-projektin-esittely/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET-transaktiot osa 2/3</title>
		<link>http://www.timokallio.net/blogi/net-transaktiot-osa-23/</link>
		<comments>http://www.timokallio.net/blogi/net-transaktiot-osa-23/#comments</comments>
		<pubDate>Thu, 04 Nov 2010 16:40:49 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[dotNet]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=122</guid>
		<description><![CDATA[Tässä osassa tarkastellaan Microsoft:n COM+-palveluiden tarjoamaa tekniikkaa hallita tietokantojen transaction-käsittelyä. Aihetta tarkastellaan suurimmilta osin käytännön näkökulmasta katsottuna, jolloin selvitetään miten kyseinen tekniikka voidaan ottaa käyttöön omassa sovelluskoodissa. Tekniikkaa on tarkoitus tarkastella lisäksi hieman sovelluksen suorituskyvyn näkökulmasta katsottuna.

Käsittelin aiemmassa .NET-transaktiot-blogikirjoituksessani kahta erilaista .NET:n tarjoamaa tapaa tietokannan transaction-käsittelyn hoitamiseksi. Tähän kirjoitukseen viitaten kirjoitin pienen oikaisun aiheeseen, koska [...]]]></description>
			<content:encoded><![CDATA[<p>Tässä osassa tarkastellaan Microsoft:n COM+-palveluiden tarjoamaa tekniikkaa hallita tietokantojen transaction-käsittelyä. Aihetta tarkastellaan suurimmilta osin käytännön näkökulmasta katsottuna, jolloin selvitetään miten kyseinen tekniikka voidaan ottaa käyttöön omassa sovelluskoodissa. Tekniikkaa on tarkoitus tarkastella lisäksi hieman sovelluksen suorituskyvyn näkökulmasta katsottuna.</p>
<p><span id="more-122"></span>
<p>Käsittelin aiemmassa <a href="http://www.timokallio.net/blogi/net-transaktiot-osa-13/"><span class="link">.NET-transaktiot-blogikirjoituksessani</span></a> kahta erilaista .NET:n tarjoamaa tapaa tietokannan transaction-käsittelyn hoitamiseksi. Tähän kirjoitukseen viitaten kirjoitin pienen oikaisun aiheeseen, koska huomasin, että asiat eivät tietenkään mene aivan niin yksiselitteisesti kuin ne lyhykäisyydessään esittelin. Oikaisun voit löytää kyseisen <a href="http://www.timokallio.net/blogi/net-transaktiot-osa-13/#NETtransaktiotosa13correction"><span class="link">blogikirjoituksen lopusta</span></a>.</p>
<p>Sitten itse aiheeseen. Microsoft COM+-palvelut voidaan käsittää lyhyesti sanottuna kokoelmana komponentteja ja palveluita, joita voidaan hyödyntää esimerkiksi .NET-sovelluskehityksessä. COM+ on nimensä mukaisesti kehitysversio perinteisestä Microsoft:n <a href="http://msdn.microsoft.com/en-us/library/ms680573%28v=VS.85%29.aspx" target="_blank"><span class="link">COM-teknologiasta ( Component Object Model )</span></a>. .NET-ympäristössä COM+-palveluihin päästään käsiksi kätevästi System.EnterpriseServices-nimiavaruuden kautta, jolloin palveluiden käyttöönottoa omassa projektissa edellyttää viittauksen asettaminen System.EnterpriseServices.dll-luokkakirjastoon. Viittauksen asettamisen lisäksi palveluiden käyttöönottoa edellyttää, että oma projektikokonaisuus on allekirjoitettu &#8220;vahvalla nimellä&#8221; ( strong key name ), sovellus on näkyvä COM-komponentteille ( COM Visible ) ja luokka on periytetty System.EnterpriseServices.ServicedComponent-luokasta.</p>
<p>COM+-transaction-tekniikan avulla on mahdollista luoda automaattisen transaction-käsittelyn omaavia komponentteja, joiden toteuttamien toimintojen transaction-viitekehys voi ulottua &#8220;hajautetusti&#8221; esimerkiksi eri servereillä olevien tietokantojen välille, jolloin COM+ kommunikoi MSDTC:n ( Microsoft Distributed Transactions Coordinator ) kanssa transaction-käsittelyn toteuttamiseksi. Vaikka transaction-käsittely voidaan käsittää tässä tapauksessa täysin automaattisena, niin sitä voidaan kuitenkin hallita toimintaa ohjaavien <a href="http://msdn.microsoft.com/en-us/library/ms687663%28v=VS.85%29.aspx" target="_blank"><span class="link">transaction-attribuuttien</span></a> avulla. Attribuuttia &#8220;Required&#8221; ( C# syntaksin mukainen lause kirjoitetaan luokkamäärityksen yläpuolelle: [Transaction(TransactionOption.Required)] ) voidaan pitää suositeltuna attribuuttina, mikäli halutaan varmistaa, että objektin metodeissa toteutetaan aina transaction-käsittely. Täydellisen automatisoinnin takaamiseksi luokan metodeihin tulee asettaa vielä &#8220;AutoComplete&#8221;-attribuutti, joka sijoitetaan kunkin metodin määrityksen yläpuolelle ( C# syntaksi: [AutoComplete(true)] ). Näin siis transaction-käsittely on hyväksytty automaattisesti, jos yksikään transaction-viitekehyksen sisällä oleva metodi ei heitä poikkeusta ( throw Exception ). Mikäli transaction-luokan metodille ei aseteta &#8220;AutoComplete&#8221;-attribuuttia, niin transaction-käsittely tulee joko hyväksyä tai peruuttaa eksplisiittisesti System.EnterpriseServices-nimiavaruudesta löytyvien staattisten metodien &#8220;ContextUtil.SetComplete&#8221; tai &#8220;ContextUtil.SetAbort&#8221; avulla. Seuraavasta linkistä voit tarkastella pientä koodiesimerkkiä, joka edustaa kuvitteellista &#8220;Henkilö&#8221;-luokkaa sovelluksen tietokantarajapinnassa. Tähän luokkaan on luotu automaattinen transaction-käsittely COM+-palveluiden avulla.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=16"><span class="link">C#: COM+-cHenkilot</span></a></p>
<p>Kuten edellisestä esimerkistä voidaan huomata, niin kyseisellä tekniikalla on hyvin helppoa luoda korkean luotettavuuden omaavia tietokantakomponentteja, jolloin transaction-käsittelyn toteutus voidaan &#8220;ulkoistaa&#8221; COM+-palvelun hoiteisiin. Olen kuitenkin lukenut muutamia keskusteluja liittyen kyseisen tekniikan käyttöön ja olen saanut sen käsityksen, että palvelun käyttö lisäisi kohtuuttomasti sovelluksen suorituskykytarvetta. Tein siis pienen testiohjelman, joka päivittää identtisillä kyselyillä paikallisessa SQL Server -tietokannassa olevia tauluja &#8220;normaalin&#8221; SqlClient-DataProvider:n ja COM+-palvelun tarjoamien transaction-käsittelyiden avulla. Sovellus mittaa kyselyiden suorittamiseen kulunutta aikaa ja listaa kestot perinteiseen ListBox-komponenttiin. Tämän testiohjelman tulosten perusteella voidaan ainakin todeta, että kun COM+-kysely on suoritettu ensimmäisen kerran, niin seuraavien suorituskertojen kestot ovat melkolailla samaa luokkaa mitä normaalin transaction:n avulla tehdyt. Kunkin toiminnon ensimmäiset suorituskerrat eivät siis ole vertailukelpoisia, koska näissä tapauksissa täytyy ottaa huomioon .NET:n JIT-käännöksen (Just-In-Time) luonne, jolloin prosessorin suorittamaa &#8220;NativeCode&#8221;-konekieltä ei ole vielä luotu. <span class="highlight">Testin tuloksia voit tarkastella klikkaamalla allaolevasta kuvasta</span>.</p>
<div>
<a href="http://www.timokallio.net/blogi/Kuvat/transactions/Transactions2.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/transactions/Transactions2_p.jpg" alt="Testin tulokset" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Testisovelluksen antamat toimintojen suoritusajat.</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/net-transaktiot-osa-23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Liukuva WPF-paneeli WinForms-sovellukseen</title>
		<link>http://www.timokallio.net/blogi/liukuva-wpf-paneeli-winforms-sovellukseen/</link>
		<comments>http://www.timokallio.net/blogi/liukuva-wpf-paneeli-winforms-sovellukseen/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 17:48:33 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[dotNet]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=108</guid>
		<description><![CDATA[Olet varmaan joskus huomannut Windows-sovelluksia käyttäessäsi sulavasti näyttöön ilmestyviä toimintopaneeleja tai ilmoitusruutuja, jotka liukuvat hiljalleen piiloon. Tämän kaltainen käyttöliittymäkomponenttien animointi on peräisin Microsoft:n kehittämästä WPF-käyttöliittymätekniikasta, jonka tarkoituksena on ulkoisesti tarkasteltuna tarjota käyttäjilleen entistäkin rikkaampia ja mukautuvampia käyttöliittymiä. Perinteistä WinForms-käyttöliittymää voidaan yleisesti pitää WPF:ään verrattuna hyvin &#8220;staattisena&#8221;, joten uusimpaa projektia työstäessäni aloin tutkimaan mahdollisuuksia WPF-toiminnallisuuden tuomiseksi [...]]]></description>
			<content:encoded><![CDATA[<p>Olet varmaan joskus huomannut Windows-sovelluksia käyttäessäsi sulavasti näyttöön ilmestyviä toimintopaneeleja tai ilmoitusruutuja, jotka liukuvat hiljalleen piiloon. Tämän kaltainen käyttöliittymäkomponenttien animointi on peräisin Microsoft:n kehittämästä WPF-käyttöliittymätekniikasta, jonka tarkoituksena on ulkoisesti tarkasteltuna tarjota käyttäjilleen entistäkin rikkaampia ja mukautuvampia käyttöliittymiä. Perinteistä WinForms-käyttöliittymää voidaan yleisesti pitää WPF:ään verrattuna hyvin &#8220;staattisena&#8221;, joten uusimpaa projektia työstäessäni aloin tutkimaan mahdollisuuksia WPF-toiminnallisuuden tuomiseksi WinForms-sovellukseen.</p>
<p><span id="more-108"></span>
<p>Ajatuksena oli siis kehittää esiin ja piiloon sulavasti liukuva paneeli, joka pitää sisällään yhden ListBox- ja kaksi perinteistä Label-komponenttia. Kyseistä kokonaisuutta käytettäisiin siten hyväksi sovelluksen avulla tarkasteltavien vieraskirja-viestien selaamiseen. Voin paljastaa jo tässä vaiheessa, että koko projektin tarkoituksena on kehittää pieni Windows-sovellus, jonka avulla voin käsitellä tämän sivuston <a href="http://www.timokallio.net/vieraskirja/"><span class="link">vieraskirja-osiossa</span></a> olevia viestejä suoraan oman kotikoneeni työpöydältä. Tulen kirjoittelemaan tänne blogiin myös myöhemmin jotain juttua kyseisestä projektista, joten siitä ei sen enempää tässä vaiheessa.</p>
<p>Käytännössä WPF-toiminnallisuuden tuominen WinForms-sovellukseen on tehty hyvin yksinkertaiseksi toteuttaa .NET-ympäristössä ja sen vuoksi aiheesta löytyy useita hyviä kirjoituksia Internetin syövereistä ( <a href="http://www.switchonthecode.com/tutorials/wpf-tutorial-using-wpf-in-winforms" target="_blank"><span class="link">Esimerkiksi tämä</span></a> ). Käytännössä siis edellämainitusta tutoriaalista tulee ymmärtää seuraavat seikat: WPF-toiminnallisuus tulee toteuttaa erillisessä WPF User Control -projektissa ja WinForms-sovellukseen, johon WPF-komponentti liitetään, tulee lisätä Element Host -kontrolli, joka toimii alustana liitettävälle komponentille. Luonnollisesti myös se tekniikka, jonka avulla WPF-komponentti liitetään Element Host:iin, tulee ymmärtää. Tarkemmin ottaen liitos voidaan suorittaa useamman erilaisen menettelyn kautta. Se voidaan siis tehdä siten, että samaan sollution-kokonaisuuteen, missä myös kohteena oleva WinForms-projekti sijaitsee, lisätään uusi (Add -> New Project&#8230;) tai jo olemassa oleva (Add -> Existing Project&#8230;) WPF User Control -projekti. Tämän jälkeen WPF-kontrolli voidaan lisätä Element Host:iin Visual Studio:n designer:n kautta. Itseäni kiinnosti kuitenkin lähinnä se, miten ulkoiseksi dll-tiedostoksi käännetty WPF-komponentti liitetään Element Host:iin.</p>
<div>
<a href="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms_p.jpg" alt="komponentin bindaus" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>WPF-kontrolli voidaan liittää Element Host:iin Visual Studio:n designer:n kautta, jos kontrollista on luotu<br />
oma projekti samaan sollution-kokonaisuuteen, missä liitoksen kohteena oleva WinForms-projekti on.</p>
</div>
</div>
<p>Mikäli liitettävä WPF-komponentti on siis käännetty dll-tiedostoksi, joka on hyvin todennäköistä hyödynnettäessä esimerkiksi kolmannen osapuolen valmistamaa komponenttia, niin liitos Element Host:iin tulee suorittaa sovelluksen koodissa. Liitoksen tekeminen koodissa onnistuu kätevästi hyödyntämällä Element Host:n Child-ominaisuutta. Käytännössä siis ensin asetetaan projektiin viittaus (reference) ulkoiseen käännetyn WPF-kontrollin dll-tiedostoon, jonka jälkeen kontrolli instannoidaan esimerkiksi kohteena olevan luokan alussa ja asetetaan Element Host:n Child-ominaisuuteen..Helppoa!</p>
<div style="text-align:right">
<a href="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms2.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms2_p.jpg" alt="dll liitos" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Ulkoiseksi dll-tiedostoksi käännetty WPF-komponentti otetaan käyttöön sovelluksen koodissa instannoimalla se ensin<br />
luokkakoodin alussa (1) ja sen jälkeen asettamalla instannoitu objekti esimerkiksi luokan konstruktorissa Element Host:iin (2).<br />
Tämän jälkeen WPF-komponentin metodeihin ja tapahtumiin päästään käsiksi instannoidun objektin kautta (3).</p>
</div>
</div>
<p>Alapuolelta löytyvien linkkien kautta voit tarkastella vielä aiemmin mainitsemaani projektiin luodun WPF-kontrollin XAML- ja C#-koodeja. Toteutin liu&#8217;uttamis-animaation C#-koodin avulla, mutta yhtä hyvin se oltaisiin voitu tehdä tässä tapauksessa myös XAML:n avulla. Alapuolelta löytyy myös kuva, mistä voidaan huomata käyttöön otetun WPF-kontrollin ulkoasu.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=xml&#038;id=14"><span class="link">XAML: CustomMessageManager</span></a> <a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=15"><span class="link">C# (Code-Behind): CustomMessageManager</span></a></p>
<div>
<a href="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms3.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/wpf_winforms/WpfWinforms3_p.jpg" alt="komponentin ulkoasu" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Käyttöön otettu WPF-kontrolli löytyy kuvan oikeasta yläosasta. Kontrolliin kuuluu yksi ListBox-komponentti ja kaksi Label-komponenttia, jotka voidaan piilottaa tai tuoda esille liu&#8217;uttamis animaatiolla höystettynä.</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/liukuva-wpf-paneeli-winforms-sovellukseen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uutta ulkoasua pukkaa</title>
		<link>http://www.timokallio.net/blogi/uutta-ulkoasua-pukkaa/</link>
		<comments>http://www.timokallio.net/blogi/uutta-ulkoasua-pukkaa/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 11:31:39 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[PeLe]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=96</guid>
		<description><![CDATA[Nyt kun kesän työtaakka alkaa olemaan suurimmilta osin historiaa, on aikani riittänyt myös hieman vähemmän tärkeiden asioiden pohtimiseen. Aloin siis tuijottelemaan sivustoni ulkoasua ja odotin jotain pientä inspiraation kipinää syntyvän sisälläni. Noh..jotain sentään syntyi. Muutoksia on siis tulossa jälleen sivuston ulkoasuun ja ehkä suurin muutos liittyy fonttien vaihtumiseen. Myös tausta ja muutamat muut yksityiskohdat ulkoasussa [...]]]></description>
			<content:encoded><![CDATA[<p>Nyt kun kesän työtaakka alkaa olemaan suurimmilta osin historiaa, on aikani riittänyt myös hieman vähemmän tärkeiden asioiden pohtimiseen. Aloin siis tuijottelemaan sivustoni ulkoasua ja odotin jotain pientä inspiraation kipinää syntyvän sisälläni. Noh..jotain sentään syntyi. Muutoksia on siis tulossa jälleen sivuston ulkoasuun ja ehkä suurin muutos liittyy fonttien vaihtumiseen. Myös tausta ja muutamat muut yksityiskohdat ulkoasussa tulevat saamaan muutoksia osalleen. Tarkasta uuden ulkoasun suunta alapuolella olevasta kuvasta!</p>
<div>
<a href="http://www.timokallio.net/blogi/Kuvat/uusi_ulkoasu/leiska.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/uusi_ulkoasu/leiska_p.jpg" alt="Etusivu" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Etusivun uudet tuulet.</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/uutta-ulkoasua-pukkaa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET-transaktiot osa 1/3</title>
		<link>http://www.timokallio.net/blogi/net-transaktiot-osa-13/</link>
		<comments>http://www.timokallio.net/blogi/net-transaktiot-osa-13/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 18:27:36 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[dotNet]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=92</guid>
		<description><![CDATA[.NET-ympäristö tarjoaa muutamia toisistaan poikkeavia tekniikoita tietokantojen transaction-käsittelyn toteuttamiseksi. Oma näkemykseni on, että tyylin, miten tietokantakyselyiden transaction-käsittely hoidetaan, tulee mukautua kulloinkin kyseessä olevan kyselyiden sarjan tai esimerkiksi sovellusarkkitehtuurin luonteeseen. Lisäksi transaktioille saatetaan joutua asettamaan erityisiä vaatimuksia, jolloin aivan perinteisimmät tekniikat eivät enää yksinkertaisesti riitä. Esittelen siis seuraavissa &#8220;.NET-transaktiot&#8221;-blogikirjoituksissa muutamia erilaisia tekniikoita, joiden avulla on mahdollista [...]]]></description>
			<content:encoded><![CDATA[<p>.NET-ympäristö tarjoaa muutamia toisistaan poikkeavia tekniikoita tietokantojen transaction-käsittelyn toteuttamiseksi. Oma näkemykseni on, että tyylin, miten tietokantakyselyiden transaction-käsittely hoidetaan, tulee mukautua kulloinkin kyseessä olevan kyselyiden sarjan tai esimerkiksi sovellusarkkitehtuurin luonteeseen. Lisäksi transaktioille saatetaan joutua asettamaan erityisiä vaatimuksia, jolloin aivan perinteisimmät tekniikat eivät enää yksinkertaisesti riitä. Esittelen siis seuraavissa &#8220;.NET-transaktiot&#8221;-blogikirjoituksissa muutamia erilaisia tekniikoita, joiden avulla on mahdollista hoitaa oman järjestelmän tietokantakyselyiden transaction-käsittely. Samalla pyrin tarkastelemaan hieman sitä, mihin erilaisiin tilanteisiin kyseiset tekniikat voisivat kulloinkin soveltua.</p>
<p><span id="more-92"></span>
<p>Ensimmäisenä esiteltävistä transaction-tekniikoista tarkasteluun otetaan .NET:n Data Provider:ien tarjoamat perinteisimmät transaktiot ja .NET Framework 2.0:n tarjoama System.Transactions.TransactionScope-transaktioluokka. Kyseisten tekniikoiden huomattavin ero liittyy niiden kykyyn hallita useamman tietokantayhteyden transaktioita. Data Provider:ien tarjoamien transaktioiden avulla voidaan siis hallita ainoastaan tietokantakyselyitä, joissa käytetään yhteen tietokantaan kohdistuvaa tietokantayhteyttä. System.Transactions.TransactionScope-palvelun avulla voidaan sen sijaan hallita lisäksi niin sanottuja &#8220;hajautettuja transaktioita&#8221; (distributed transactions), jolloin tietokantakyselyiden yhteydet kohdistuvat eri tietokantoihin. Puhuttaessa hajautetuista transaktoista voidaan usein törmätä teknologiaan nimeltä &#8220;MSDTC&#8221; (Microsoft Distributed Transactions Coordinator). Kyseinen teknologia toimii hajautettujen transaktoiden koordinaattorina, joka valvoo transaktion toteutumista useamman tietokannan välillä ( <a href="http://itknowledgeexchange.techtarget.com/sql-server/what-exactly-is-msdtc-any-when-do-i-need-it/" target="_blank"><span class="link">aiheesta lisätietoa</span></a> ).</p>
<p>Miksi sitten käyttäisin perinteistä Data Provider:ien transaktio-mallia, kun tarjolla on suoraan TransactionScope-palvelun tarjoama tekniikka useamman tietokantayhteyden transaktioon? Syy tähän saattaisi löytyä esimerkiksi siitä, että Data Provider:t (esim. SqlClient, OleDb, Odbc, OracleClient) on suunniteltu toimimaan nimenomaan kullekkin Provider:lle tarkoitetun tietokannan kanssa, joten suorituskyky transaktoiden kohdalla on myös varmasti parhaimmillaan. Itse pyrin luomaan transaktiot esimerkiksi siten, että mikäli kyseessä on yksinkertainen yhdessä metodissa suoritettava kysely tai kyselyiden sarja, niin hyödynnän perinteistä transaktio-mallia. Mikäli sitten tietokantakyselyt suoritetaan useamman eri metodin kautta, niin hyödynnän TransactionScope-palvelun transaktio-tekniikkaa. Tällöin kyselyissä käytettävää tietokantayhteyttä ei tarvitse siis kuljettaa metodilta toiselle, joka tukee varmasti aina sovelluksen arkkitehtuurin eheyttä paremmin.</p>
<p>Lopuksi jotta kukaan ei jäisi kylmäksi, esittelen pienen perustason koodiesimerkin, missä havainnollistetaan esiteltyjen transaction-tekniikoiden käyttöä. Koodi on kommentoitu hyvin, joten siitä pitäisi olla helppoa ymmärtää ydin ajatukset.</p>
<p><a href="http://timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=13"><span class="link">Transaction-esimerkki</span></a></p>
<p style="margin:20px 0 0 0" id="NETtransaktiotosa13correction"><span class="highlight">Postaukseen lisätty oikaisu 2.10.2010:</span></p>
<div class="justified" style="width:520px;margin:0 auto 0 auto;padding:10px;font-style:italic">&#8220;Data Provider:ien tarjoamien transaktioiden avulla voidaan siis hallita ainoastaan tietokantakyselyitä, joissa käytetään yhteen tietokantaan kohdistuvaa tietokantayhteyttä. System.Transactions.TransactionScope-palvelun avulla voidaan sen sijaan hallita lisäksi niin sanottuja “hajautettuja transaktioita” (distributed transactions), jolloin tietokantakyselyiden yhteydet kohdistuvat eri tietokantoihin&#8221;.</div>
<p style="margin:0">Tämähän ei siis pidä täysin paikkaansa, sillä ADO.NET:n tarjoamien transaktioiden avulla voidaan hallita myös &#8220;hajautettuja transaktioita&#8221; käyttämällä hyväksi tietokantayhteys-objektin (esim. SqlConnection) <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.enlisttransaction.aspx" target="_blank"><span class="link">EnlistTransaction-metodia</span></a>, joka tuli uutena .NET:n piiriin .NET-framework 2.0:n myötä. Tämän myötä voidaan siis todeta, että suurin ero ADO.NET:n ja System.Transactions transaktoiden välillä liittyy niiden tapaan muodostaa transaction-käsittelyn &#8220;viitekehys&#8221;. ADO.NET:n transaktoita voidaan siis pitää tässä suhteessa &#8220;manuaalisena&#8221;, jolloin uusien tietokantayhteyksien liittäminen transaction-kehykseen täytyy suorittaa manuaalisesti, kun taas System.Transactions.TransactionScope liittää aina automaattisesti kaikki viitekehyksen piirissä avatut tietokantayhteydet samaan kehykseen. Viitekehyksellä tarkoitan tässä tapauksessa sitä kehystä, jonka piirissä valvotaan transaction-käsittelyn onnistumista (comit), jolloin virheiden ilmaantuessa kaikki tehdyt toiminnot kehyksen sisällä peruuntuu (rollback).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/net-transaktiot-osa-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET appConfig-tiedoston käsittely Visual Studion kautta</title>
		<link>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely-visual-studion-kautta/</link>
		<comments>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely-visual-studion-kautta/#comments</comments>
		<pubDate>Tue, 03 Aug 2010 10:49:35 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[dotNet]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=85</guid>
		<description><![CDATA[Esittelin aiemmassa blogikirjoituksessani (.NET appConfig-tiedoston käsittely) yhden tavan, jonka avulla voitiin toteuttaa .NET-sovelluksen appConfig-tiedostossa olevien asetusten käsittely. Kokemani perusteella totesin kuitenkin, että kyseinen tekniikka on hieman liian monimutkainen ja sama asia voidaan suorittaa huomattavasti yksinkertaisemminkin. Monimutkaisuutensa lisäksi aiemmin esittelemäni tekniikka voi koitua ongelmaksi, kun sovellusta ajetaan Windows-järjestelmissä rajoitetuin käyttöoikeuksin. Käyttäjän oikeudet eivät siis riitä tiedostokäsittelyä [...]]]></description>
			<content:encoded><![CDATA[<p>Esittelin aiemmassa blogikirjoituksessani (<a href="net-appconfig-tiedoston-kasittely/"><span class="link">.NET appConfig-tiedoston käsittely</span></a>) yhden tavan, jonka avulla voitiin toteuttaa .NET-sovelluksen appConfig-tiedostossa olevien asetusten käsittely. Kokemani perusteella totesin kuitenkin, että kyseinen tekniikka on hieman liian monimutkainen ja sama asia voidaan suorittaa huomattavasti yksinkertaisemminkin. Monimutkaisuutensa lisäksi aiemmin esittelemäni tekniikka voi koitua ongelmaksi, kun sovellusta ajetaan Windows-järjestelmissä rajoitetuin käyttöoikeuksin. Käyttäjän oikeudet eivät siis riitä tiedostokäsittelyä toteuttavien sovellusten suorittamiseen. Ainakin kun kyseessä on Windows Vista ja sovelluksen sijaintina on &#8220;C:\Program Files\&#8221;.</p>
<p><span id="more-85"></span>
<p>Sovellusasetukset voidaan siis luoda melko yksinkertaisesti suoraan Visual Studio:n (Visual Studio 2008) asetusten designer:n kautta (Properties &#8211;> &#8220;projektin nimi&#8221; Properties&#8230; &#8211;> Settings-välilehti).</p>
<p><a href="http://www.timokallio.net/blogi/Kuvat/appConfig2/kuva1.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/appConfig2/kuva1_p.jpg" alt="Sovellusasetusten designer" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Sovellusasetukset voidaan määrittää suoraan Visual Studio:n asetusten designer:n kautta.</p>
</div>
<p>Ennen asetusten luontia Settings-välilehden asetuksista on syytä ymmärtää muutama tärkeä seikka. Asetusten &#8220;Name&#8221;-attribuutti tarkoittaa siis asetuksen nimeä, jonka avulla ohjelmakoodissa voidaan viitata haluttuun asetukseen. &#8220;Scope&#8221;-attribuutti sen sijaan tarkoittaa asetuksen tyyppiä, johon voidaan asettaa kaksi erilaista arvoa. Mikäli arvoksi siis asetetaan &#8220;User&#8221;, niin luotu asetus on käyttäjäkohtainen kaikille Windows-järjestelmän käyttäjille erikseen. Tämän lisäksi asetukset tallentuvat erilliseen xml-tiedostoon käyttöjärjestelmän kansioon: &#8220;%systemroot%\Documents And Settings\%username%\Local Settings\Application Data\%Company%\&#8221;. Edellä mainitun polun &#8220;%Company%&#8221; tarkoittaa .NET-sovelluksen (C#-sovellus) &#8220;AssemblyInfo.cs&#8221;-tiedoston attribuutin &#8220;[assembly: AssemblyCompany("????")]&#8221; arvoa. Mikäli &#8220;Scope&#8221;-attribuutin arvoksi sitten asetetaan &#8220;Application&#8221;, niin asetus on sovelluskohtainen ja kaikille käyttäjille yhteinen. Erikoista tämän arvon saaneille asetuksille on, että kyseistä asetusta ei voi muokata sovelluksen ajonaikana (ainakaan suoraan!).</p>
<p>Seuraavaksi on vuorossa pienimuotoinen esimerkkisovellus, jossa käsitellään sovelluksen appConfig-tiedostoon luotuja asetuksia. Asetukset on luotu Visual Studio:n settings designer:n kautta (voit nähdä luodut asetukset aiemmasta kuvasta). Asetuksiin &#8220;form_locationX&#8221; ja &#8220;form_locationY&#8221; on tarkoitus tallentaan sovelluksen pääikkunan sijainti, kun käyttäjä painaa painiketta lomakkeelta (koodissa tapahtuma &#8220;btnTallenna_Click&#8221;). Kun sovellus sitten seuraavan kerran käynnistetään, niin pääikkuna avautuu asetustiedostosta löytyvien kordinaattien osoittamassa sijainnissa. Sovelluksen koodin toisessa painiketapahtumassa (&#8221;btnTuo_Click&#8221;) sen sijaan asetetaan sovelluksen asetuksista löytyvään &#8220;csTestitietokanta&#8221;-connectionstring:iin puuttuva data source. Kyseisen asetuksen &#8220;Scope&#8221;-attribuutille on annettu arvo &#8220;Application&#8221;.</p>
<p>Koodeista kannattaa huomata tekniikka, jonka avulla &#8220;Application&#8221;-tyypin asetusta voidaan muokata ajonaikana. Opin tekniikan katsomalla MSDN-sivustosta löytyvän <a href="http://msdn.microsoft.com/en-us/vbasic/cc307956.aspx" target="_blank"><span class="link">videon</span></a>, jossa kyseinen tekniikka esitellään. En siis selosta kyseistä tekniikkaa tässä sen enempää, koska video havainnollistaa sitä riittävän hyvin. Voit tarkastella esimerkkikoodeja klikkaamalla alla olevia linkkejä.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=xml&#038;id=10"><span class="link">appConfig-tiedosto</span></a>: Tiedosto joka on syntynyt Visual Studio:n settings designer:n kautta tehtyjen asetusten johdosta.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=11"><span class="link">Settings.cs-tiedosto</span></a>: Tiedostoon on luotu itse tehty ominaisuus, jonka avulla voidaan muokata &#8220;Application&#8221;-tyypin asetusta sovelluksen ajonaikana.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=12"><span class="link">Esimerkkisovelluksen päälomakkeen koodi</span></a>: Asetuksiin päästään käsiksi C#-kielessä nimiavaruuden &#8220;Properties.Settings.Default&#8221; kautta. Asetuksiin tehdyt muutokset voidaan tallentaa saman nimiavaruuden &#8220;Save()&#8221;-metodin avulla. On huomattava, että &#8220;Application&#8221;-tyypin asetuksia ei voida tallentaa pysyvästi, vaan tämän tyypin asetuksiin tehdyt muutokset ovat voimassa vain sovelluksen istunnon ajan.</p>
<p>Mikäli tätä tekniikkaa verrataan aiemmin esittelemääni, niin voidaan todeta huomattava ero muun muassa asetuksien käsittelyn yksinkertaisuudessa. Tätä tekniikka noudattaessa oma sovellus on lisäksi hieman vakaampi toiminnaltaan. Sovellusta voidaan siis ajaa rajoitetuin käyttöoikeuksin, joka on merkittävä osa Windows-järjestelmän tietoturvaa. Lisäksi sovellusten käyttäjät varmasti arvostavat sitä, että juuri heidän omat asetuksensa säilyvät aina muuttumattomana. Mikä voi olla ärsyttävämpää kuin asetusten virittäminen aina uudelleen toisen käyttäjän jäljiltä.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely-visual-studion-kautta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kahvikuppi-SuDoKu (lataa ja pelaa!)</title>
		<link>http://www.timokallio.net/blogi/kahvikuppi-sudoku-lataa-ja-pelaa/</link>
		<comments>http://www.timokallio.net/blogi/kahvikuppi-sudoku-lataa-ja-pelaa/#comments</comments>
		<pubDate>Mon, 03 May 2010 17:38:20 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[Projektit]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=79</guid>
		<description><![CDATA[Vaikka sudokulukujen pohtiminen tuntuukin monen mielestä varmasti ajan haaskaukselta, niin itselleni siitä muodostui hyvänmakuinen aivopähkinä purtavaksi. Purtavaa oli siis tarjolla tällä kertaa perus sudokupeli ohjelmointiprojektin merkeissä, jonka varmasti hyvin usea aloitteleva ohjelmoija on joskus toteuttanut. Tavoitteena oli luoda peliin omalla logiikalla toimiva sudoku-moottori, joka luo uusia pelejä napin painalluksesta. Projekti toteutettiin VB.NET-kielellä Visual Studio -kehitysympäristössä, [...]]]></description>
			<content:encoded><![CDATA[<p>Vaikka sudokulukujen pohtiminen tuntuukin monen mielestä varmasti ajan haaskaukselta, niin itselleni siitä muodostui hyvänmakuinen aivopähkinä purtavaksi. Purtavaa oli siis tarjolla tällä kertaa perus sudokupeli ohjelmointiprojektin merkeissä, jonka varmasti hyvin usea aloitteleva ohjelmoija on joskus toteuttanut. Tavoitteena oli luoda peliin omalla logiikalla toimiva sudoku-moottori, joka luo uusia pelejä napin painalluksesta. Projekti toteutettiin VB.NET-kielellä Visual Studio -kehitysympäristössä, joten toivomuksena oli luonnollisesti myös, että jotain uutta tietoa jäisi taas .NET:n tiimoilta omaan takaraivoon.</p>
<p><span id="more-79"></span></p>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva4.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva4_p.jpg" alt="Perusnäkymä" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Pelin pääikkuna. Sudokuluvut lisätään ruudukkoon itsetehdyn .NET:n User Control -komponentin avulla. Peli mittaa lisäksi sudoku-ongelman ratkaisemiseen kulunutta aikaa. Pelaajalla on yksi mahdollisuus tarkastaa syöttämiensä sudokulukujen oikeellisuus.</p>
</div>
</div>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva1.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva1_p.jpg" alt="Onnistunut suoritus" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Mikäli sudoku-ongelman ratkaisemiseen kulunut aika on kyllin hyvä, niin se palkitaan pääsyllä Top5-listaan.</p>
</div>
</div>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva3.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva3_p.jpg" alt="Top5-tulokset" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Pelin Top5-lista parhaat tulokset.  Tulokset voidaan myös palauttaa, jos mieli niin tekee. Tulokset tallennetaan käyttöjärjestelmässä pelin kansiorakenteeseen olioiden sarjallistamis-tekniikan (serialization) avulla.</p>
</div>
</div>
<div style="float:left;margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva2.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/kahvikuppi_sudoku/kuva2_p.jpg" alt="Mitä meni vikaan?" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>Jos GameOver alkaa sapettamaan ja pelaaja haluaa kaivaa syitä pelin epäonnistumiseen, niin sen voi tehdä vertaamalla omaa ja oikeaa vastausta.</p>
</div>
</div>
<div style="clear:left"></div>
<p>Tälläistä siis tällä kertaa! Itse pelin ohjelmointiprosessista voisin kuitenkin kertoa muutaman sanan. Nimittäin ylivoimaisesti suurimmaksi ongelmaksi projektin työstämisessä muodostui odotetusti pelimoottorin logiikan ohjelmointi, mihin kuuluu sudokulukujen (itse pelin ratkaisuluvut) ja pelaajalle näytettävien vihjelukujen generoinnit. Kaikki sudokulukuja tarkemmin tutkineet tietävät siis esimerkiksi, että sudokun vaikeusastetta ei voida määritellä pelkästään pelaajalle näytettävien vihjelukujen määrän pohjalta, vaan enemmänkin niiden sijoittelun perusteella. Tämänkin vuoksi pelimoottorille piti siis kehitellä pienimuotoinen tekoäly, jonka avulla lukujen generoinnit suoritetaan.</p>
<p>Sudokujen ratkaisulukujen generointi toteutettiin perinteisien olio-ohjelmoinnin menetelmien avulla. Jokaisesta numeroruudukon 9&#215;9 alueesta muodostettiin siis omat luokat, joissa käsitellään vain kullekkin alueelle kuuluvia numeroita. Tämän avulla eteentulevat ongelmat voitiin pilkkoa pienempiin kokonaisuuksiin, jolloin niiden hallitseminen on helpompaa. Ruudukon jakaminen ei kuitenkaan vielä riittänyt ratkaisemaan lukujen käsittelyyn liittyviä erilaisia tilanteita, joten projektiin luotiin erillinen &#8220;staattinen&#8221; moduli, joka oli suoraan käytettävissä kaikissa luokissa. Tähän moduuliin ohjelmoitiin siis kaikille luokille yhteisiä metodeja ja ominaisuuksia, joiden avulla lukuja voidaan käsitellä halutulla tavalla.</p>
<p>Pelaajalle näytettävien vihjelukujen generointi pyrittiin toteuttamaan taas siten, että pelattavat sudokut olisivat melko helppoja. Tämä toteutettiin siten, että vihjelukuja paljastetaan melko paljon käyttäjälle ja kullekkin 9&#215;9 numeroalueelle määrätään satunnaisesti oma määrä näytettäviä vihjelukuja. Kun alustava vihjelukujen generointi on suoritettu, pelimoottori pyrkii siirtelemään lukuja hieman erilleen toisistaan, mikäli ne ovat liian lähekkäin. Siirtelyn logiikka perustuu siihen, että moottori pyrkii välttämään tilanteita, joissa vihjelukuja on vierekkäin kolme kappaletta joko vaaka- tai pystysuunnassa. Se kuitenkin voi sallia joissain peleissä kolmen vierekkäisen vihjeluku-ryhmän esiintymisen maksimissaan 3 kertaa. Olen huomannut, että tämä ei toimi aina ja sen vuoksi kolmen ryhmiä voi olla joissain peleissä enemmänkin.</p>
<p>Mitä uutta sitten opin projektia työstäessäni? Jos keskittymiskyvyn ja itsehillinnän harjaantumista ei lasketa, niin .NET:n piirtonimiavaruudet (System.Drawing ja System.Drawing.Drawing2D) tulivat joissain määrin tutummiksi. Lisäksi tutustuin ensimmäistä kertaa omien käyttöliittymäkomponenttien luontiin, josta voidaan todeta, että: &#8220;seKIN on tehty mukavan helpoksi&#8221;.</p>
<p>Tässäpä oli pienimuotoinen esittely projektista. Jos mielesi tekee nyt pelata peli tai pari uutta &#8220;Kahvikuppi-SuDoKua&#8221;, niin saamasi pitää. Voit ladata pelin alla olevasta linkistä. Latauspaketti sisältää ainoastaan pelin käynnistämiseen vaadittavan exe-tiedoston. Peli luo Top5-tuloksia varten automaattisesti yhden tiedoston samaan kansioon, missä itse exe sijaitsee. Peliä on testattu Windows XP -ja Vista -käyttöjärjestelmissä, joten toiminta esimerkiksi Windows 7:ssa on epävarmaa.</p>
<p><a href="http://www.timokallio.net/blogi/download/Sudoku_Released1.1.exe"><span class="link">Sudoku_Released1.1.exe</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/kahvikuppi-sudoku-lataa-ja-pelaa/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.NET AppConfig-tiedoston käsittely</title>
		<link>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely/</link>
		<comments>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 13:55:49 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[dotNet]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=75</guid>
		<description><![CDATA[Xml-tiedostojen käsittely on yksi ohjelmoijan perustaidoista, joka korostuu entisestään, kun puhutaan tietojärjestelmien kehittämisestä. Aiheeseen tutustuminen tuli ajankohtaiseksi työskennellessäni uusimman projektini parissa, jossa ongelmaksi muodostui normaalin Winforms-sovelluksen AppConfig-tiedoston käsittely. Käsittelyn tarkoituksena oli hallita sovelluksen tietokantaan, mikä oli Access 2007 -tyyppinen, kytkeytymisessä käytettävää connectionstring-merkkijonoa. Tästä siis kannattaa huomata, että connectionstring oli tallennettuna nimenomaan AppConfig:iin.Tavoitteena oli siis se, [...]]]></description>
			<content:encoded><![CDATA[<p>Xml-tiedostojen käsittely on yksi ohjelmoijan perustaidoista, joka korostuu entisestään, kun puhutaan tietojärjestelmien kehittämisestä. Aiheeseen tutustuminen tuli ajankohtaiseksi työskennellessäni uusimman projektini parissa, jossa ongelmaksi muodostui normaalin Winforms-sovelluksen AppConfig-tiedoston käsittely. Käsittelyn tarkoituksena oli hallita sovelluksen tietokantaan, mikä oli Access 2007 -tyyppinen, kytkeytymisessä käytettävää connectionstring-merkkijonoa. Tästä siis kannattaa huomata, että connectionstring oli tallennettuna nimenomaan AppConfig:iin.Tavoitteena oli siis se, että tietokantaan kytkeytyminen voitaisiin hoitaa riippumatta siitä, missä käyttöjärjestelmän kansiossa tietokanta sijaitsee. Connectionstring-merkkijonossa oleva Data Source:han muodostuu sen kansiopolun merkkijonosta, mistä hallittava tietokanta löytyy. On siis syytä vielä tiedostaa, että tässä tapauksessa tietokanta oli sijoitettu itse sovelluksen kansiorakenteen sisään.</p>
<p><span id="more-75"></span>
<p>Ennen kun ryhdyin koodaamaan AppConfig-tiedoston käsittelyä, niin pyrin selvittämään itselleni, mistä itse tiedosto löytyy ohjelman ajon aikana. .Net-ympäristö toimii siis Winforms-sovellusten kohdalla siten, että kun sovellus käännetään, niin samalla Config-tiedostosta muodostuu &#8220;ohjelman nimi&#8221;.exe.config niminen kopio samaan kansioon, missä sovelluksen exe-tiedosto sijaitsee. Tämä Config-tiedosto on siis se, mihin tiedostokäsittely tulee kohdistaa. </p>
<p>Seuraavaksi on syytä siirtyä havainnollistamaan sitä, miten selvitin käsiteltävänä olevan ongelman. Esittelen tässä siis hallittavan Config-tiedoston koodin, joka on kirjoitettu xml-kielellä, ja itse C#-kielellä ohjelmoidun testiohjelman koodin, millä tiedostonkäsittely hoidetaan. Testiohjelmasta mainittakoon sen verran, että xml-käsittely hoidetaan koodissa .Net-luokan &#8220;XmlDocument&#8221; avulla. Config-tiedoston sisältö siis ladataan XmlDocument-luokasta istannoituun olioon, jonka jälkeen tiedostoa käsitellään halutulla tavalla foreach-silmukoissa perinteisen merkkijonojen käsittelyn avulla. Voit tarkastella koodeja klikkaamalla allaolevia linkkejä.</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=csharp&#038;id=8"><span class="link">Testiohjelma</span></a> <a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=xml&#038;id=9"><span class="link">Config-tiedosto</span></a></p>
<p>Testiohjelman koodista (rivit 139-140) kannattaa huomioida erityisesti se, miten tehdyt muutokset tallennettiin config-tiedostoon. Tässä siis &#8220;RefreshSection&#8221; -metodin parametriksi annetaan &#8220;configuration&#8221;, jolloin tiedostossa olevien configuration-tagien välissä oleva sisältö virkistetään eli otetaan uudet muutokset käyttöön. Tässä tapauksessa koko tiedoston sisältö siis virkistetään. Tämä on tarpeellista erityisesti silloin, jos muutoksia kohdistetaan config-tiedostoon, joka on kryptattu (salattu). Se miten salaaminen sitten toteutetaan, on oma aiheensa erikseen ja sitä ei tässä yhteydessä käsitellä. Tästä kuitenkin voidaan ymmärtää, että kun connectionstring on sijoitettu esimerkiksi ohjelman config-tiedostoon, niin siihen voidaan kohdistaa erilaisia sovelluksen tietoturvatasoa nostavia toimenpiteitä.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/net-appconfig-tiedoston-kasittely/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perintä ja kantaluokka-tyyppimuunnokset</title>
		<link>http://www.timokallio.net/blogi/perinta-ja-kantaluokka-tyyppimuunnokset/</link>
		<comments>http://www.timokallio.net/blogi/perinta-ja-kantaluokka-tyyppimuunnokset/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 16:38:31 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[Olio-ohjelmointi]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=70</guid>
		<description><![CDATA[Jokainen ohjelmoinnin perustekniikoihin tutustunut tietää varmasti, mitä olio-ohjelmoinnin käsitteisiin kuuluva &#8220;perintä&#8221; tarkoittaa perustasolla. On selvää, että oikein toteutettuna sillä on selkeä vaikutus monien muiden seikkojen ohessa esimerkiksi luodun ohjelmakoodin käytettävyyteen. Seuraavaksi esittelen yhden keinon, mitä voidaan hyödyntää perinnän avulla toteutetun luokkarakenteen ohjelmakoodin käytössä. Tutustuin oheiseen tekniikkaan lukemalla Ahti Haukilehdon kirjoittaman kirjan: &#8220;Visual C#.NET&#8221;. Tähän postaukseen [...]]]></description>
			<content:encoded><![CDATA[<p>Jokainen ohjelmoinnin perustekniikoihin tutustunut tietää varmasti, mitä olio-ohjelmoinnin käsitteisiin kuuluva &#8220;perintä&#8221; tarkoittaa perustasolla. On selvää, että oikein toteutettuna sillä on selkeä vaikutus monien muiden seikkojen ohessa esimerkiksi luodun ohjelmakoodin käytettävyyteen. Seuraavaksi esittelen yhden keinon, mitä voidaan hyödyntää perinnän avulla toteutetun luokkarakenteen ohjelmakoodin käytössä. Tutustuin oheiseen tekniikkaan lukemalla Ahti Haukilehdon kirjoittaman kirjan: &#8220;Visual C#.NET&#8221;. Tähän postaukseen luodut havainnollistavat koodinpätkät on kuitenkin kirjoitettu Javalla, joka on täysiverinen olio-ohjelmointikieli siinä missä C#.NET:kin.</p>
<p><span id="more-70"></span>
<p>Karkeasti sanottuna käsiteltävän tekniikan avulla voidaan siis suorittaa minkä tahansa luokkarakenteessa olevan luokan yksittäinen metodi ilman, että tarvitsee tietää minkä tyyppinen käsiteltävä luokka on. Pieninä ehtoina on kuitenkin, että käsiteltävien luokkien tulee olla <span class="highlight">periytetty (inherit)</span> samasta kantaluokasta ja suoritettava metodi tulee löytyä kantaluokasta, jolloin sen tulee olla <span class="highlight">ylikuormitettu (override)</span> periytetyissä luokissa. Tämän lisäksi itse koodilauseessa, missä suoritetaan satunnaisen olion ylikuormitetun metodin kutsu, tehdään implisiittinen kantaluokka-tyyppimuunnos (implicit type conversion), missä siis periytetyn luokan tyyppinen olio muunnetaan (cast) sen kantaluokan tyyppiseksi.</p>
<p>Seuraavan esimerkin tarkoituksena on havainnollistaa käsiteltävää tekniikkaa. Luodussa esimerkkisovelluksessa generoidaan JList-komponenttiin napin painalluksesta henkilöauto- tai kuorma-auto-olioita, mistä valintoja tekemällä voidaan tulostaa kulloinkin aktivoidun olion tiedot JTextArea-komponenttiin. Ongelmana sovelluksen koodin toteutuksessa on, että miten kulloinkin aktivoidun olion tietojen tulostus metodia kutsutaan, jos tutkimuksia siitä, minkä tyyppinen olio on, ei saa tehdä. Voit huomata sovelluksen toimintaperiaatteen alla olevasta kuvankaappauksesta.</p>
<div style="margin-right:10px">
<a href="http://www.timokallio.net/blogi/Kuvat/perinta_ja_kantaluokka-tyyppimuunnokset/perintaesim.jpg" class="highslide" onclick="return hs.expand(this)"><br />
<img src="http://www.timokallio.net/blogi/Kuvat/perinta_ja_kantaluokka-tyyppimuunnokset/perintaesim_p.jpg" alt="testisovellus" title="Suurenna klikkaamalla kuvaa" /></a></p>
<div class="highslide-caption">
<p>&#8220;Generoi ajoneuvo&#8221; -napista generoidaan ajoneuvo oikeassa reunassa olevaan &#8220;ajoneuvo&#8221; -listaan, josta voidaan tulostaa olioiden tietoja alla olevaan &#8220;ajoneuvon tiedot&#8221; -kenttään.</p>
</div>
</div>
<p>Voit tarkastella alla olevista linkeistä esimerkkisovelluksen ohjelmakoodia. Luokka &#8220;cAjoneuvo&#8221; toimii kantaluokkana luokille &#8220;cHenkiloauto&#8221; ja &#8220;cKuormaauto&#8221;, joista sovellus generoi &#8220;ajoneuvo&#8221; listaan vietäviä olioita. Luokkien &#8220;Tiedot()&#8221; -metodin avulla suoritetaan tietojen tulostus ja esimerkkikoodeista voidaan huomata, että metodi on toteutettu kaikissa luokissa (periytetyissä luokissa ylikuormitettuna). Testiohjelman koodista kannattaa huomata tapahtuman &#8220;jLstAjoneuvotValueChanged&#8221; koodi, missä suoritetaan metodikutsu, joka vie olion tiedot alaosassa olevaan tekstikenttään..</p>
<p><a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=java&#038;id=4"><span class="link">cAjoneuvo</span></a> <a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=java&#038;id=5"><span class="link">cHenkiloauto</span></a> <a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=java&#038;id=6"><span class="link">cKuormaauto</span></a> <a href="http://www.timokallio.net/PHP/viewCode.php?p=blog&#038;lang=java&#038;id=7"><span class="link">Testiohjelma</span></a></p>
<p>Lauseella &#8220;(cAjoneuvo)oList.get(intSelectedIndex)).Tiedot()&#8221; suoritettiin siis vuorossa olevan olion tietojen tulostus. Tutkimuksia siitä, minkä tyyppisen olion ArrayList-olio (oList) kulloinkin sisälsi, ei siis tarvittu. Erityisen hyödylliseksi tämä tekniikka tulisi silloin, kun eri tyyppisiä olioita olisi esimerkiksi useita kymmeniä.</p>
<p>Olioteorioiden ja -tekniikoiden ymmärtäminen on modernin ohjelmakoodin edellytys ja niiden avulla voidaan luoda helposti ylläpidettäviä ohjelmakokonaisuuksia. Toisaalta väärin käytettynä niistä voi olla haittaakin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/perinta-ja-kantaluokka-tyyppimuunnokset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tilannekatsaus Ple-projektiin</title>
		<link>http://www.timokallio.net/blogi/tilannekatsaus-ple-projektiin/</link>
		<comments>http://www.timokallio.net/blogi/tilannekatsaus-ple-projektiin/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 17:07:37 +0000</pubDate>
		<dc:creator>TK</dc:creator>
				<category><![CDATA[PeLe]]></category>

		<guid isPermaLink="false">http://www.timokallio.net/blogi/?p=45</guid>
		<description><![CDATA[Kiitokset kaikille ple-projektin palautteenantajille ensimmäisen palautejakson kommenteista. Olen pyrkinyt tarkastelemaan saamiani palautteita aktiivisesti ja hyödyntämään niitä sivuston uusien kehitysideoiden pohtimisessa. Intoni sivuston kehittämistä kohtaan ei ole siis laantunut ja tunnen olevani oikeilla jäljillä siinä, millainen oma-ple:ni voisi valmiina olla. On siis huomattava, että sivustoa ei voi missään nimessä vielä kutsua valmiiksi.

Mitä Timo Kallio -ple:ltä on [...]]]></description>
			<content:encoded><![CDATA[<p>Kiitokset kaikille ple-projektin palautteenantajille ensimmäisen palautejakson kommenteista. Olen pyrkinyt tarkastelemaan saamiani palautteita aktiivisesti ja hyödyntämään niitä sivuston uusien kehitysideoiden pohtimisessa. Intoni sivuston kehittämistä kohtaan ei ole siis laantunut ja tunnen olevani oikeilla jäljillä siinä, millainen oma-ple:ni voisi valmiina olla. On siis huomattava, että sivustoa ei voi missään nimessä vielä kutsua valmiiksi.</p>
<p><span id="more-45"></span>
<p><span class="highlight">Mitä Timo Kallio -ple:ltä on sitten tulevaisuudessa odotettavissa?</span> Ajatuksena on ollut kehitellä paremmaksi ainakin kirjatietokantaa ja vieraskirjaa. Kirjatietokantaan siis suunnitteilla on ollut ominaisuus, minkä avulla kirjoja voidaan selata kategorioittain. Lisäksi perinteiset selauspainikkeet saattavat poistua käytöstä, koska mielestäni niiden käyttö on hankalaa ja rajoittaa tiedon tarkastelun ainoastaan yhteen kirjaan kerralla. Vieraskirja sen sijaan saa tulevaisuudessa luultavasti osakseen ominaisuuden, mikä näyttää kommentoijien ilmoittamia sivusto-osoitteita erillisessä tilassa. Tämän avulla palautteenantajan sivusto saa huomiota enemmän osakseen ja samalla voin myös itse helpommin huomata ketkä ovat olleet kiinnostuneita kommentoimaan sivuston sisältöä.</p>
<p>Sivuston ulkoasusta on tullut palautetta niin puolesta kuin vastaankin. Yksinkertaisuus ja käytetty värimaailma ovat herättäneet selvästi ajatuksia ja on hienoa saada kommentteja erityisesti väreistä. Sivuston yksinkertaisuutta en tule muuttamaan, mutta luultavammin jossain vaiheessa uusia värejä ja pieniä tyylimuutoksia saattaa olla luvassa. <span style="text-decoration:line-through">Sivuston ilmiasu ei siis tällähetkellä ole se kaikkein tärkein kehityksen kohde</span>.</p>
<p>Kaikkien muiden kehitysideoiden toteuttamisen lisäksi yritän pitää yllä jonkinmoista tahtia sisällön tuottamiseen niin blogiin kuin arkistoonkin. Tähän ei tuo yhtään helpotusta se, että aloitan työskentelyn uuden asiakaslähtöisen projektin parissa juuri parhaillaan. Huomasithan muuten uuden harjoitustyöesittelyn arkistossani? Panostin tähän työhön melko paljon, sillä .NET ja SQL Server ovat erittäin mielenkiintoisia aihealueita.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.timokallio.net/blogi/tilannekatsaus-ple-projektiin/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

