Jos nyt unohdetaan äärimmäinen syvällinen osaaminen tietokoneen sielunelämän suhteen, niin sanokaapa, mikä olisi hyvä kieli ja ympäristö tehdä tuottavaa työtä?
Otetaan esimerkiksi vaikka tuollainen alemmassa keskustelussa ollut nakkikioskisofta. Sillä hallittaisiin snagarin tuotetietokantaa ja listattaisiin tuotteet nettiin josta niitä voisi vaikka tilailla. Takana pitäisi siis olla joku kannantapainen ja käyttöliittymä työasemalle ja nettiin.
Laitetaan vielä sellainen lisämauste, että työasemasoftan pitää toimia ilman verkkoyhteyttä stand alonena koska snagarilla ei ole aina yhteyksiä.
Graafikset käyttöliittymät ja helppokäyttöisyys ovat tietty must koska työntekijöinä on monasti uutta porukkaa.
Millä kielellä, millä IDE:llä ja millaisella ratkaisulla liikkeelle jos halutaan, että työ tehdään tuottavasti eikä millään hirveällä viilauksella vaikka C:llä tai Assyllä :)
Otetaan esimerkiksi vaikka tuollainen alemmassa keskustelussa ollut nakkikioskisofta. Sillä hallittaisiin snagarin tuotetietokantaa ja listattaisiin tuotteet nettiin josta niitä voisi vaikka tilailla. Takana pitäisi siis olla joku kannantapainen ja käyttöliittymä työasemalle ja nettiin.
Laitetaan vielä sellainen lisämauste, että työasemasoftan pitää toimia ilman verkkoyhteyttä stand alonena koska snagarilla ei ole aina yhteyksiä.
Graafikset käyttöliittymät ja helppokäyttöisyys ovat tietty must koska työntekijöinä on monasti uutta porukkaa.
Millä kielellä, millä IDE:llä ja millaisella ratkaisulla liikkeelle jos halutaan, että työ tehdään tuottavasti eikä millään hirveällä viilauksella vaikka C:llä tai Assyllä :)
Vastaukset 14
Vanhimmat
Delphillä se sujuu!
Löytyy tietokantakomponentit ja työasemassa pyörivänä helppokäyttöiset ja tehokkaat GUI -komnponentit.
Voi tehdä myös webpalveluja, kolmellakin eri tavalla:
1. Delphi -ohjelma itse suoraan web -palvelimena (ei vaadi muita palvelinohjelmistoja lainkaan)
2. CGI -moduleita esim. MS-IIS:n tai Apachen windowsversion kanssa ajettavaksi (ISAPI DLL)
3. Kielenä Objectpascal kuten delphissäkin, mutta käännetään Lazaruksella (=Freepascal IDE), näin saadaan käännettyä binäärejä myös linuxille windowsin lisäksi. Tässä alavaihtoehtoina jälleen joko itsenäinen webpalvelin tai CGI -moduli tällä kertaa linux-apache:n kanssa käytettäväksi.
Delphiohjelma toimii toki itsenäisesti ilman nettiyhteyttäkin, tällöin toki tietokanta ja ohjelma samassa koneessa tai ainakin samassa lähiverkossa.
Snagarilla ei ehkä ole kiinteää nettiyhteyttä mutta jo 384 kbps dna-mobiililaajakaistalla tekee ihmeitä.
Tässä kannattaisi ehkä (jos palvelua on tarkoitus käyttää selaimella mistä tahansa missä on netti) toteuttaa 2-tasoratkaisu, jossa 3G-datan yli työnnetään vain sovelluksen binääriä ja pakattua dataa, ja itse html -koodi selaimelle tarjotaan nopean nettiyhteyden päässä olevalta koneelta muualta (esim. webhotellin koneelta). Näin saadaan nopeuskin kiitettäväksi.
Voi noita webpalveluita javallakin koodata, mutta Delphi hakkaa javan sekä suoritusnopeudessa että kielen monipuolisuudessa mennen tullen.
Myöskään Delphi ei pakota leikkimään pointtereilla kuten C-kieli tekee, joten koodaus on suhteellisen turvallista vaikka et olisikaan huippuosaaja.
Joskus koodailinkin Delphillä, mutta siihen aikaan ei noita nettijutta sillä pahemmin tehty. Mielenkiintoisia juttuja olen nähnyt, mutta tuo oli uutta, että Delphillä tehty softa toimii itsessään palvelimena. Miten noille saa Webbihotelleja? Katselin aiemmin sitä, että ASP.NET:lle saa noita aika hyvin vaikka sekään ei ole hotelleissa yleisin. Delphin malli kuulostaa kuitenkin mielenkiintoiselta. Onko mallina aina sen exen laitt sinne vai voiko homman hoitaa muutenkin?
Tuollainen 384 olisi varmasti riittävä. Itse mielsin tuon siten, että snagarin kapitalistiomistaja voisi istua kotona sohvalla päivittelemässä hintoja ja muuta tietoa tuotteista, asiakkaat katselevat netistä tuotteita ja työntekijällä olisi oma softansa joka hakisi datansa netistä paikalliseen kantaansa etteivät pätkivät yhteydet estäisi tietojen käyttöä.
Eli siis mitä tuo binääri olisi? Olisiko se siis itse tarvittavat tietorakenteet? Menevötkö ne Delphin kanssa jotenkin Web Service-mallisesti vai jotenkin muuten?
"Mielenkiintoisia juttuja olen nähnyt, mutta tuo oli uutta, että Delphillä tehty softa toimii itsessään palvelimena. Miten noille saa Webbihotelleja?"
1. Delphillä tehty softa toimii itsessään palvelimena esim. käyttämällä Indy (INternet Direct) komponentteja ja tekemällä sillä http -palve1in. Tämä ratkaisu toimii parhaiten omassa hallinnassa olevassa koneessa.
Jos kuitenkin tätä mallia halutaan käyttää webhotellin koneessa, niin
a. Vaatii windowsia käyttävän webhotellipalvelimen (linux ei kelpaa tähän)
JA
b. Koska webhotelleissa portti 80 on varattu järjestelmän oletushttp -palvelimelle, niin om aDelphillä tehty webpalvelin täytyy laittaa epästandardiin porttinumeroon (lisäharmina jotkut käyttäjät eivät pääse palveluun esimn. yrityspalomuurin takaa - sama koskee esim. webchat -huoneita, joiden porttinumero yleensä on jotain ihan muuta kuin http -liikenteen oletuksena oleva 80).
2. Delphillä voi tehdä CGI -ohjelman (itseasiassa DLL). Tämäkin vaatii windows -palvelimen, mutta CGIohjelma (siis DLL) ajetaan järjestelmän normaalin web -palvelimen (MS-IIS tai Windows-Apache) alaisuudessa.
3. Jos halutaan ajaa Delphillä tehtyä koodia webhotellin linuxpalvelimella, jossa yleensä Apache, niin CGI:llä tehty linuxin .so on ratkaisu tähän.
Ohjelman voi tässäkin kirjoittaa valmiiksi Delphillä, mutta tässä tapauksessa lopullista kääntämistä webhotellia varten EI voi tehdä delphillä, vaan linuxissa FreePascal Lazarus -yhdistelmällä.
Kääntäjäksi riittäisi pelkkä Freepascalkin, mutta Lazarus tarjoaa varsin Delphimäisen GUI IDE:n.
Lazaruksessa on jopa jonkinlainen debuggerikin, joskin vaativimmissa tapauksissa huomaat, ettei Lazaruksen Debuggeri vedä vertoja Delphin vastaavalle! (varsinkin monisäikeisissä ohjelmissa ongelmat lazaruksen debuggerissa tulevat nopeasti esille).
Olen itse vuonna 2008 koodannut Delphillä suoraan HTTP -palvelimen (käyttää Indyn http server -komponenttia).
ko. palvelin on erään yrityksen intranet -käytössä, eikä sen kanssa ainakaan n. 6kk käytön aikana ole ilmennyt yhtään vakavaa ongelmaa.
Lisäksi, käytännön tarpeissa Javan kieli alkaa ahdistaa pian.
Delphissä kun voi tehdä vaikkapa näin:
procedure Kasittele_Dataa(var RawData; DataLength:Integer);
var
DataAsBytes : Array[0..MaxInt -3] of Byte absolute RawData;
B : Byte;
begin
//
for i := 0 to DataLength-1 do begin
// lataa yksi tavu muuttujaan B:
B := DataAsBytes[i];
end;
end;
Hyötynä se, että nyt proseduuria Kasittele_Dataa voi kutsua millä datatyypillä tahansa, ja tämäntyyppinen kutsu on turvallinen:
Kasittele_Dataa( Jotakin, SizeOf(Jotakin) );
Javassa joutuisi vastaavassa tilanteessa määrittelemään erikseen Kasittele_Dataa -metodin kullekin sellaiselle tietotyypille, jota käyttäen sitä haluttaisiin kutsua.
Delphissä tämä ei ole tarpeen, kuten ylläoleva esimerkki osoittaa.
Toki em. esimerkissä DataLength -parametri ja sen oikea käyttö on tietoturvan kannalta ensiarvoisen tärkeää.
Mutta kun sitä käytetään oikein, vältetään pouskurin ylivuotohaavoittuvuudet, joista C-kieliset ohjelmat ovat surullisen kuuluisia.
..Niin ja mikä ettei myös noiden ulkoisiin hommiin. Onhan meinaan asia niinkin, että kun firmojen introihin tekee softaa, niin palvelimen säätämiseen voi kulua yllättävän paljon aikaa ja vaivaa jos kaikki ei menekään kerralla kohdilleen. Jos softa osaa toimia palvelimena itsekseen, ei tuota vaikkapa Javan tai .NET:n kanssa joskus syntyvää palvelinhässäkkää ole.
Tuommoisen koodinpätkän katsoin VB.NET:lle. Vastaavaa olen joskus käytellyt. En nyt ole varma, onko tässä sama ajatus, mutta tuolla saa myös kiskaistua serialisoitavissa olevat objektit bytemuotoon ilman riskiä muistinvuodoista.
# Public Shared Function Serialize(ByVal Obj As Object) As Byte()
# Dim MS As New MemoryStream
# Dim BF As New BinaryFormatter
# BF.Serialize(MS, Obj)
# Return MS.ToArray
# End Function
VB.NET:llä tuon voisi laittaa myös web serviceksi muutamilla lisäkoodiriveillä jos se olisi tarpeen. Sellaista onkin pitänyt kysyä teiltä Delphin osaajilta joskus, että miten Web Serviceiden tekeminen hoituu Delphillä? Hoitunee tuolla omalla exellään sekin?
Niin ja miten muuten, oletko tehnyt managed koodia Delphillä? Jos olet, niin millaiselta homma vaikuttaa sillä?
Jos joku Rubiinikoodari lukee tätä, niin olisi mielenkiintoista tietää miten sillä kielellä hoidetaan sama homma kuin tuossa samplessa, eli jonkun olion tai vastaavan tietoklöntin muuntaminen bytejonoksi?
> Hyötynä se, että nyt proseduuria
> Kasittele_Dataa voi kutsua millä datatyypillä
> tahansa, ja tämäntyyppinen kutsu on turvallinen:
>
> Kasittele_Dataa( Jotakin, SizeOf(Jotakin) );
>
> Javassa joutuisi vastaavassa tilanteessa
> määrittelemään erikseen Kasittele_Dataa
> -metodin kullekin sellaiselle tietotyypille,
> jota käyttäen
> sitä haluttaisiin kutsua.
heh, siis metodi ottaa vastaan minkä tahansa tietotyypin, muuttaa sen byte-taulukoksi ja "käsittelee"? No onpas edistyksellistä. Joo, ei voi Javalla tehdä noin, mutta se onkin vain olio-perustainen kieli, jossa käsitellään mieluummin olio-instansseja.. tai voihan se olion tietenkin aina serialisoida byte-taulukoksi, jos haluaa.. ;)
Ja jos tosissaan puhutaan, niin ei, Javassa ei tarvitse tehdä omaa metodia jokaiselle halutulle tietotyypille vaan metodimäärittelyssä käytettäisiin tietotyyppien yhteistä isäluokkaa tai rajapintaa ja varsinainen käsittely hoidettaisiin aliluokissa. Perusolio-ohjelmointikikkoja..
Java kieleksi ja Eclipse IDE:ksi. Älä usko panetteluita javan hitaudesta tai muista ongelmista, niitä ei ole ollut enää vuosiin, ja javahan on kuitenkin syystäkin käytetyin teknologia palvelinohjelmistojen rakentamiseen.
Mutta myös PHP voisi riittää kyseiseen tarkoitukseen ihan hyvin, jos ei tuon monimutkaisempaa systeemiä ole tarve tehdä.
...sen uskon koska tiedän, että asia on niin. Epäilevät voivat muuten lukea joskus iD softwaren John Carmacin kommentteja Javasta ja sen nopeudesta. Kehui nykyisiä ympäristöjä siitä, että alkavat olla silloin joku vuosi sitten melkoisen suorituskykyisiä.
Niitä ainoita asioita mitä Javassa on ollut hankalaa, on tuo työasemasoftan graafisen käyttöliittymän tekeminen. Osaatko suositella siihen jotain mallia jossa käyttöliittymää voisi piirtää ilman koodin kirjoittamista? Koodi tietty sitten siihen taakse kun se olisi ok...
Siirrettyjen numeroiden tiedotuspalvelu:
http://www.siirretytnumerot.fi/
sekä vastaava ilmaisnumerossa 0800 0 2202 puhelimitse toimiva palvelu on koodattu javalla.
Palvelu toimii useimmiten suht. nopeasti, MUTTA:
Kun käytät palvelua paljon, niin ennemmin tai myöhemmin kohdallesi osuu tilanne, että painettuasi "Hae" -nappia, kestää useita kymmeniä sekunteja ennen kuin saat vastauksen.
Miksikö?
Päättelenpä, että syy on, ei miään muu kuin Javan ikävä tapa tuhlata muistia ja kun se alkaa olla lähellä loppumista, niin käynnistyy muistinsiivous- eli roskienkeruuajo, ja niin kauan kuin roskienkeruu on kesken, mikään muu ei sitten toimikaan.
Muistin määrän luisääminen ei auta mitään, se tekee toki tuon tilanteen entistä harvinaisemmaksi, mutta kun se tilanne lopulta kuitenkin tulee, niin isommalla muistimäärällä tuo roskienkeruu kestää vastaavasti kauemmin.
Jotain kertonee sekin, että Netbeans IDE (koodattu Javalla) on selvästi hitaampi kuin Delphi7 IDE (koodattu Delphillä).
periaatteessahan tuolla .NET:n puolella on samanlaista gabpahe kollektionia, mutta siellä ei näyttäisi olevan mitään tuollaisia ongelmia, ei lähimainkaan.
Toisaalta en usko tilanteen olevan ihan noin pahan Javallakaan. Olisikohan kyse kuitenkin muuten vain huonosta koodausratkaisusta jossa ei ole kaikki ihan kohdillaan?
Ainakin tuo Delphinetin ero johtunee siitä, että Javalla tehtyjen softien näytönkäsittely vaikuttaa aika hankalalta nopeudenkin puolesta. Palvelinpuolesta se ei taida kertoa mitään?
>...käynnistyy muistinsiivous- eli roskienkeruuajo, ja niin kauan kuin roskienkeruu on kesken, mikään muu ei sitten toimikaan.
Tämä on tarina jonka ei-Java-käyttäjät aina jaksaa kaivaa esille todistaakseen tyhmyytensä.
Roskienkeruu on tehtävä missä tahansa järjestelmässä aina silloin kun ei silmittömästi tuhlata muistia vaan käytetään dynaamista muistinvarausta. Siis joko käsin tai automaattisesti. Javassa se tehdään automaattisesti ja voidaan konfiguroida tarpeen mukaan, esim pause time, niin ettei käyttäjä sitä huomaa.
...monet edes ymmärrä kunnolla mitä se tarkoittaa. Moni mieltää sen samankaltaiseksi asiaksi kuin vaikka W98:n swappailut jossa kone jurnahtaa oikeasti sekuntikausiksi kun muisti loppuu kunnolla.
En ole varma kun en muista, oliko tekemäni ohjelma Javalla vai .NET:n kielillä tehty, mutta kerran on tullut ruokittua tuollaista luuloa asiakkaalle ihan siksi kun en jaksanut selvittää tarkalle kaverille tarkemmin sitä, miksi homma kanitti. Softassa kun yhden näytön avaus kestikin kerran jonkun 4-5 sekuntia eli tahmasi jonkun verran ja asiakas sanoi, että jaahas, muistinsiivous taisi mennä päälle.
Sanoin vain, että "Niin, muistinsiivous on semmoista taustahommaa aina joskus" ja jatkettiin juttuja muista kohdista. Heh heh...
SElitähän, javafani...
miksi siirretytnumerot.fi -palvelussa, vaikka vastaus kyselyyn tulee usein n. sekunnissa, niin satunnaisesti kysely voikin kestää lähemmäs minuuttia?
Itse tulkitsen asiaa niin, että se juurikin johtuu javan typerästä muistinsiivoussysteemistä.
Jos itse olisin koodannut vastaavan palvelun alusta loppuun Delphillä, niin takaan, että se ei todellakaan hidastelisi silloin tällöin jonkun muistinsiivousajon takia.
Väität myös, että moinen siivous olisi pakollinen kaikissa ohjelmointikielissä?
katsopa tätä esimerkkikoodia (Delphi):
var
JokinOlio : TEsimerkkiOlioLuokka;
begin
JokinOlio := TEsimerkkiOlioLuokka.Create;
try
// Tässä käytetään oliota JokinOlio
finally
JokinOlio.Free;
end;
end;
Tietysti voit ajatella, että Delphissä tavallaan roskienkeruu tehdään tuossa JokinOlio.Free -kohdassa. Mutta Miksi muistolohkon vapauttaminen olisi sen hitaampaa kuin sen varaaminenkaan (kohdassa JokinOlio.Create) ?
Delphissä siis jokainen yksittäinen olio vapautetaan erikseen, kun sitä ei enää tarvita. Tuo vapauttaminen tehdään *kokonaisuudessaan* tuon JokinOlio.Free -kutsun aikana, joten ei jää mitään ylimääräistä "siivousta vaativien objektien jonoa" myöhemmin prosessoriaikaa tuhlaamaan.
Valitettavasti javakoodaajat vain tuntuvat kuvittelevam että Javan käyttämä tapa olisi jotenkin "ainoa oikea" tai "välttämätön kaikissa ympäristöissä".
Tämä on silkka valhe, tai jos joku tosissaan tuiollaista väittää, osoittaa aikamoista tietämättömyyttä tietojenkäsittelystä yleisesti, eli moisen väitteen tosissaan esittäjä luulee että javan osaaminen = tietotekniikan osaaminen.
Fiksusi tehty Delphiohjelma ei siis milloinkaan jumiudu minuutiksi roskiensiivousta tekemään, kuten javaohjelmalle saattaa käydä, varsinkin jos tuo javaohjelma on joku webpalvelinsovellus, jossa se palvelee isoa joukkoa netin läpi tulevia, toisistaan riippumattomia palvelupyyntöjä.
Ja Delphi siis sovelutuu mainiosti web -palvelukehitykseen, ja suorituskyky hakkaa javan mennen tullen. Siis niin, että 1 PC hoitaa usean PC:n ryppään hommat, jos tuo 1 PC ajaa hyvin tehtyä delphiohjelmaa, ja tuo pc:den rypäs taas javakoodia, sillä java on yksinkertaisesti hitaampaa, lisäksi yksi delphi -koodirivi saattaa vastata useita rivejä javakoodia, syynä se, että delphin kieli (objectpascal) on ilmaisuvoimaisempaa kuin java.
Javassa siis joutuu käyttämään kaikenlaisia "kiertoteitä" mitä delphikoodaajan ei tarvitse tehdä.
Minä, sinä, tai kukaan muukaan, joka ei ole tuohon siirretytnumerot-härpäkkeeseen tarkemmin tutustunut ei voi sanoa, minkä takia se toimii huonosti. Se nyt vain voi olla ihan perustaltaan päin vittua koodattu, ja silloin ei ole mitään väliä, mitä kieltä on satuttu käyttämään.
Joka tapauksessa Javan roskienkeruualgoritmi ei aiheuta nykypäivänä minkäänlaista jumittelua. Tälle harhaluulolle saattoi olla perusteita javan ensimmäisissä versioissa, joissa roskienkeruu ei aina toiminut hyvin, mutta viimeiseen n. kymmeneen vuoteen sillä ei ole ollut mitään merkitystä.
Ja kyllä, muistin siivous on pakollista kaikissa kielissä, jossa muistia voi ajonaikaisesti varata. C:ssä ja ilmeisesti Delphissä se tehdään käsin, useassa muussa kielessä automaattisesti. Ei manuaalisessa muistinsiivouksessa sinänsä mitään pahaa ole, mutta ainakin C-ohjelmoinnissa se on aikojen saatossa aiheuttanut useita muistivuotobugeja. Javassakin muistia saa kyllä hukattua, mutta se on paljon vaikeampaa.
Yksinkertaisen nakkikioskisoftan noilla määritteillä koodaa muutamassa tunnissa ihan perlii tai pythonii käyttäen.
Tuottavuudesta voidaan olla montaa mieltä, aiheesta on kirjoitettu kirjoja. Vertaa -> Mikä on paras auto ajamiseen?