|
|

|
Tervetuloa Ohjelmistokehityksen asiantuntijaryhmän sivuille!
Allaolevaa blogia pitävät ryhmän jäsenet. |
|
|
| Suomen Standardisoimisliitto SFS on julkaissut kesän aikana suomenkielisen käännöksen standardista web-sivujen suunnitteluun. Standardi on osa laajempaa ISO-standardia 9241, jonka osa 151 käsittelee web-sivuja.
Viralliselta nimeltään suomenkielinen standardi on "Ihmisen ja järjestelmän vuorovaikutuksen ergonomia. Osa 151: Opastusta WWW-käyttöliittymiä varten", ja standardin saa hankittua 88 euron hintaan SFS:n verkkokaupasta.
Alkuperäinen englanninkielinen standardi 9241-151 on vuodelta 2008, joten aivan viimeisimpiä teknisiä editysaskeleita tämä nyt suomennettu standardi ei käsittele, mutta on silti hyvä että asiasta voi lukea myös kotimaisella kielellä. |
| Mikäli mobiilikehittäminen Windows Phone -alustalle kiinnostaa, kannattaa tutustua kesän aikana päivittyneisiin uusiin dokumentteihin. Ensimmäistä kertaa tarjolla on esimerkiksi ohjeistusta siitä, miltä sovellusten tulisi näyttää ja toimia.
Tuoreita dokumentteja ovat mm. seuraavat:
Varsinkin UI Design and Interaction Guide on mielenkiintoista luettavaa uudesta Metro-nimellä kulkevasta käyttöliittymästandardista. |
| Microsoft kertoi eilen VSLive!-tapahtumassa, että virtuaalikoneympäristöjen hallintaan testauskäytössä tarkoitettu Visual Studio Lab Management -toiminnallisuus tulee tarjolle kaikille, joilla on voimassa oleva tilaus korkeimmista MSDN-tilaustasoista.
Tarkemmin sanottuna Lab Managementin saa, jos käytössää on Visual Studio 2010 Ultimate with MSDN tai Visual Studio Test Professional with MSDN. Saatavuudeksi on ilmoitettu elokuun 2010 loppu. Aiemmin kerrottiin, että Lab Management olisi erikseen hankittava tuote.
|
|
ASP.NET MVC tuntuu kehittyvän nopeaa tahtia, ja näin kesähelteiden jatkoksi Microsoftilta on juuri tullut saataville ASP.NET MVC 3 Preview 1. Uutta on mm. tuki uudelle Razor-näkymämoottorille (view engine), sovelluskohtaiset suodattimet (global filters) sekä esimerkiksi ViewDatan tuki dynamic-tietotyypille.
ASP.NET MVC 3 Preview 1:n voi asentaa aiempien MVC-versioiden kylkeen, eikä tämä sotke aiempia projekteja. Asennuspaketin voi ladata täältä. |
| Microsoft on saanut pari päivää sitten valmiiksi Scrum-prosessimallin (process template) Visual Studio Team Systemille, eli Team Foundation Serverille kuten nykyinen nimikäytäntö menee. Valmistunut paketti on nimeltään Microsoft Visual Studio Scrum 1.0 ja sen voi ladata täältä. Prosessimallin takana on Microsoftin työntekijä Aaron Bjork, joka kertoo Scrum-paketista tarkemmin omassa blogissaan. Team Foundation Serveriin (TFS) kuuluu jo Microsoftin aiempi ketterän kehityksen prosessimalli MSF Agile, mutta Scrum on nykyisin niin yleinen malli, että Microsoftilla nähtiin tarpeelliseksi tuoda uusi malli kaikkien saataville. Ja hyvä niin. |
| Silverlight taipuu moneen, ja melko yleinen kysymys on Silverlightin kyky ottaa yhteyttä TCP:llä tai UDP:llä erilaisiin palveluihin. Tällaista socket-tason kommunikointia varten Silverlight tarjoaa omia luokkiaan (erityisesti System.Net.Sockets-nimiavaruuden luokat), ja tästäkös kehittäjä innostuu. Aivan suinpäin yhteyksiä ei kuitenkaan voi avata, sillä sisäänrakennettu tietoturva estää Silverlight-sovelluksia ottamasta yhteyttä mihin tahansa palvelimeen ja porttiin. Mitä hyötyä socket-luokista sitten on, jos niitä ei pääse käyttämään? Vastaus on Silverlight 2:n ja 3:n tapauksessa erityinen policy-tiedosto, ja Silverlight 4:n tapauksessa joko tästä tai siitä, millä oikeuksilla sovelluksia ajetaan. Tässä lyhyt yhteenveto asiasta: - Silverlight 2 ja 3 -sovelluksissa socket-yhteydet voidaan muodostaa minne vain, kunhan sillä palvelimella, jolta sovellus on lähtöisin, on tarjolla TCP-portin 943 kautta XML-pohjainen policy-tiedosto, joka kertoo mihin yhteyksiä saadaan muodostaa. Tämä ratkaisu toimii tosin vain kohtuudella, koska portti on epästandardi (ainakin porttiin 80 verrattuna) ja lisäksi yhteyttä yritetään vain kerran.
- Silverlight 4 voi myös käyttää policy-tiedostoa, mutta käyttää portin 943 sijaan HTTP:tä portissa 80. Toinen vaihtoehto on käynnistää Silverlight-sovellus Elevated Trust -tilassa, jolloin policy-tiedostoa ei tarvita, vaan socket-yhteydet voidaan avata melkeinpä minne vain. Lähinnä rajoituksia on UDP-porttinumeroissa.
MSDN:stä löytyvät tarkemmat speksit, ja lisätietoja Silverlight 4:n uusista mahdollisuuksista löytyy täältä. |
|
Viime päivinä Microsoftin web-kehitysalustoiden parissa on tapahtunut paljon uutta. Jouni kirjoitti muutama päivä sitten, että kehittäjiä autetaan eteenpäin uudella IIS Expressillä, joka on siis kevytversio tyypillisesti palvelimissa käytetystä IIS:stä.
Tämän lisäksi Microsoftilta on tullut kaksi muutakin hyvin mielenkiintoista uututta: WebMatrix sekä ASP.NET “Razor”. Mitä nämä kaksi oikein ovat?
Lyhyesti sanottuna WebMatrix on yksinkertaistettu web-kehitystyökalu, joka näyttäisi olevan tarkoitettu siihen välimaastoon, joka jää perinteisten web-editorien (Expression Web, Dreamweaver, ym.) ja varsinaisten kehitysvälineiden (Visual Studio) väliin. Toisin sanoen, WebMatrix on tarkoitettu web-sovellusten pienimuotoiseen kehittämiseen ja levittämiseen. Tuotteesta on mainio läpijuoksu Scott Guthrien blogissa, tämä kannattaa ehdottomasti kurkata.
Toinen varsin mielenkiintoinen uusi tulokas on koodinimi Razor, joka on uusi “näkymämoottori” eli view engine ASP.NET:lle. Razor vapauttaa kehittäjän paikoin hankalaksi mutta kovin standardiksi muodostuneesta ASP.NET-syntaksista (.aspx). Tässä esimerkki kaikille tutusta syntaksista:
<ul id="tuotelista"> <% foreach(var p in products) { %> <li><%= p.Name %>: <%= p.Price %> €</li> <% } %> </ul>
Tässä vastaava Razorilla:
<ul id="tuotelista"> @foreach(var p in products) { <li>@p.Name: @p.Price €</li> } </ul>
Aika näppärää ja ennen kaikkea selkeää. Näemmä @-merkille tulee siis uutta käyttöä. Jälleen kerran Razorista kannattaa opiskella lisää Scott G.:n blogista täältä.
Jos näin kesäaikaan sattuisi käymään niin, että lomailun ohessa alkaa olla tekemisen puutetta, niin tässä jälleen uutta opiskeltavaa. |
| Microsoft julkaisi tänään aikeensa tuoda kehittäjien käyttöön IIS:n kevytversion, IIS Expressin. Ensimmäinen beta on tulossa pian. Tämä on iso muutos sikäli, että aiemmin vaihtoehdot ovat olleet koko IIS:n käyttäminen tai kevyt Web Development Server. Koko IIS on melko raskas paketti käytellä ja vaatii admin-oikeudet Visual Studio –prosessilta. WDS taas ei tue kaikkia ominaisuuksia, esim. IIS:n moduuleja tai SSL:llä. IIS Express on siis yhdistelmä näiden parhaista puolista. Siispä ei muuta kuin odottelemaan ensimmäistä versiota! |
| WCF Data Services on tekniikka, jolla esimerkiksi ADO.NET Entity Framework -tietomalli voidaan julkaista verkkoon käytettäväksi http(s)-protokollan ylitse. Tähän mennessä WCF Data Servicestä on puhuttu lähinnä Silverlight-sovellusten osana, mutta itse asiassa mikään ei estä käyttämästä WCF Data Service -palveluita vaikkapa ASP.NET-sovellusten osana. Pohditaanpa hetki sopivia käyttökohteita tällaiselle WCF Data Service + ASP.NET -arkkitehtuurille. Mikäli halutaan tehdä perinteinen web-sovellus, jossa esitetään tietoja paikallisesta (samassa verkossa olevasta) SQL-tietokannasta, ei liene järkeä julkaista sama tieto ensin WCF:n avulla, ja sitten käyttää tätä dataa ASP.NET-sovelluksessa, koska tällöin ASP.NET-sovellus pääsisi suoraankin kiinni SQL-tietokantaan. Mutta entäpä tilanne, jossa WCF Data Service -palvelu on jonkin toisen organisaation tekemä? Jos tarpeenamme on tehdä tällä tavalla julkaistulle datalle web-käyttöliittymä, saattaakin tulla tarve hyödyntää WCF Data Serviceä ASP.NET-sovelluksesta. Toisaalta, kuten viimeisimmässä SANKO-tapahtumassa kesäkuun alussa puhuttiin, kannattaa varautua ohjelmistoarkkitehtuureissa siihen, että asiakaslaitteita ja -ohjelmistoja on useita erilaisia. Tähänkin ajatukseen sopii se, että ASP.NET-sovellus olisi yksi asiakasohjelmisto WCF Data Service -palvelulle. Avain WCF Data Services -palvelun käyttöön ASP.NET-sovelluksissa on palveluviittauksen (service reference) lisääminen. Voisi siis ajatella, että WCF Data Service toimii kuten mikä tahansa web service -palvelu, tai ainakin viittauksen käyttö on samanlaista. Kun palveluviittaus on lisätty ASP.NET-projektiin, tulee WCF-palvelun julkaisema tietomalli suoraan käytettäväksi sovellukseen.
Automaattisesti generoitujen luokkien avulla päästään entities-luokan kimppuun, jolloin esimerkiksi Northwind-tietokannan (kokeilepa vaikkapa esimerkkisovellusta tässä osoitteessa) käyttö voisi sujua yksinkertaisella LINQ-lauseella: string url = "http://services.odata.org/Northwind/Northwind.svc/"; NorthwindEntities entities = new NorthwindEntities(new Uri(url)); var finnishCusts = from c in entities.Customers where c.Country == "Finland" select c; GridView1.DataSource = finnishCusts; GridView1.DataBind(); Edellä esitetty koodi oli esimerkki synkronisesta tavasta kutsua palvelua, käytettävissä on toki asynkroninenkin malli. |
| Microsoft julkaisi maanantaina uuden version Expression-sarjan tuotteistaan. Uusi nelosversio Expression Studiosta kattaa tutustu Expression Web-, Expression Design- ja Expression Blend -tuotteet. Varsinkin kehittäjiä kiinnostavat Blend 4:n uudet ominaisuudet, joihin kuuluu parantunut Silverlight-tuki sekä valmistautuminen tulevia Windows Phone 7 -puhelimia varten. Uudet kalut ovat jo ladattavissa MSDN-sivustolta, ja uusiin ominaisuuksiin voi tutustua esim. tuotteen kotisivujen kautta. Lehdistötiedotekin löytyy, jos markkinointihenkisyyttä kaipaa. |
View in Web Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|
|
View in Web Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|
|
View in Web Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|
View in Web Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/VisioWebAccess/VisioWebAccess.aspx?listguid={ListId}&itemid={ItemId}&DefaultItemOpen=1 0x0 0x1 FileType vdw 255 Compliance Details javascript:commonShowModalDialog('{SiteUrl}/_layouts/itemexpiration.aspx?ID={ItemId}&List={ListId}', 'center:1;dialogHeight:500px;dialogWidth:500px;resizable:yes;status:no;location:no;menubar:no;help:no', function GotoPageAfterClose(pageid){if(pageid == 'hold') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/hold.aspx?ID={ItemId}&List={ListId}'); return false;} if(pageid == 'audit') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/Reporting.aspx?Category=Auditing&backtype=item&ID={ItemId}&List={ListId}'); return false;} if(pageid == 'config') {STSNavigate(unescape(decodeURI('{SiteUrl}'))+'/_layouts/expirationconfig.aspx?ID={ItemId}&List={ListId}'); return false;}}, null); return false; 0x0 0x1 ContentType 0x01 898 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XsnLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 FileType xsn 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.2 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.3 255 Edit in Browser /_layouts/images/icxddoc.gif /asiantuntijaryhmat/ohjelmistokehitys/_layouts/formserver.aspx?XmlLocation={ItemUrl}&OpenIn=Browser&Source={Source} 0x0 0x1 ProgId InfoPath.Document.4 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsx 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsm 255 View in Browser /asiantuntijaryhmat/ohjelmistokehitys/_layouts/xlviewer.aspx?id={ItemUrl}&DefaultItemOpen=1 0x0 0x1 FileType xlsb 255 |
|
|