Jännä koodi!

Pakko saanoo tästä. Olen tässä muutaman päivän vasta harjotellut php:tä ja harjottelin tuossa tietokantaan kirjottelua. tein seuraavan laisen koodin.

Tarkotus oli niin ku että se kirjottaa nuo $kirjota ja $kirjota2 tuonne tietokanta.txt tiedostoon ja joka toiselle kierroksella vaihtaa riviä.



Tulos oli että kone meni hetkessä jumiin ja tietokanta.txt koko kasvoi vilahuksessa n. 700Mt:uun.
6911
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

while($k = 10) tarkoittaa samaa kuin while(true), eli looppi ei lopu koskaan.

Jos pikkusen viilaa niin tuo kohta menee ehkä sujuvammin:

while($k == 10)

Muutenkin olisi vähän petraamista, mutta tuossa nyt aluksi.

Äänestä

Toisinsanoen teet ikuisen loopin joka kirjoittaa tietoja ikuisuuden tai php.inissä määrätyn maksimiajan joka tais olla oletuksena 30sek. Harjoittelivaiheessa tuo kannattaa laittaa 2-5sek näin ei tuu turhaan valtavia tiedostoja jne...

*while($k = 10){*

Asetat tuossa k muuttujalle arvon, näinollen tuo silmukka pääty ikinä.

= merkillä asetetaan muuttujalle arvo.
== yhtäsuuri.

Silmukoissa ei yleensä kannata käyttää == koska silmukka toteutuu vain jos molemmat on samoja. Toki tuotakin tarttee joskus.

$i = 0;
while ($i

Äänestä
  • Juu kiitti tuosta jakojäännös jutusta, en mainannut ymmärtää sitä millään. Sain toimiin kuten halusinkin , vaihdon tuon while n for silmukkaan, lopputolos näyttää tältä.




    Noin yksinkertanen se oliki ja mä ähertäny kolmatta tuntia tota :) Mut nyt ainaki osaan ton tehä.

    Äänestä

  • vasta opetten kirjoitti:

    Juu kiitti tuosta jakojäännös jutusta, en mainannut ymmärtää sitä millään. Sain toimiin kuten halusinkin , vaihdon tuon while n for silmukkaan, lopputolos näyttää tältä.




    Noin yksinkertanen se oliki ja mä ähertäny kolmatta tuntia tota :) Mut nyt ainaki osaan ton tehä.

    Tuossa esimerkissä on else turha. else; ei tee sitten yhtikäs mitään. Elsettä käytetään vain silloin kun tarvetta on, siis halutaan tehdä jotain jos if/elseif lause ei toteudukkaan.

    Äänestä

  • Objectpascal parempi ! (Delphi / Kylix / FreePascal)

    Tosiaankin! Onneksi olkoon. Putosit yhteen niistä ansoista, joita C ja C -kielet ovat täynnä varsinkin aloitteleville ohjelmoijille.

    C-kielessä:

    = (Sijoitus)
    == (Yhtäsuuruusvertailu)


    Objectpascalissa:

    := (Sijoitus)
    = (Yhtäsuuruusvertailu)

    Eikä erot lopu tähän:

    C-kielessä rakenne if (a=5) on laillinen, mutta ei tee sitä, mitä aloittelija luulisi, vaan on sama asia kuin:

    a = 5; if (TRUE) ...

    Delphissä taas tuskin kukaan edes yrittää kirjoittaa:

    if a := 5 then ...

    mutta jos yrittää, Delphi antaa tuollaisesta käännösaikaisen virheen.

    mutta jos joku välttämättä haluaa kirjoittaa C -tyylistä sekavaa koodia Delphillä, onhan sekin mahdollista (mutta EI suositeltavaa):

    function SetInt(var X:Integer; Value:Integer):Boolean;

    begin
    X := Value;
    Result := X 0;
    end;

    ja sitten...

    if SetInt(a,5) then ...
    joka siis käytännössä tekee saman kuin tuo C -esimerkki eli asettaa a:lle arvon 5 ja IF -lause on aina tosi.

    Vastaväittäjät usein perustelevat C/C :n käyttöä sillä, ettei pascalilla muka voi tehdä jotain. Ehkä jollain 1950 -luvulta peräisin olevalla standardipascalilla ei voikaan, mutta eihän sellaista kieltä kukaan ole varmaan vuosikymmeniin käyttänytkään !

    Sensijaan Objectpascalilla voi tehdä kaiken sen, minkä C:llä tai C :llakin, mutta paljon helpommin.

    Ja Delphistä ja Kylixistä löytyy myös asm end; -lohko, johon voi suoraan kirjoittaa assembleria jos siihen on erityinen tarve. Assemblerkieliset osuudet kannattaa laittaa omiin unitteihinsa, koska ne ovat siirrettävyyden kannalta ongelmallisia. Näin koodia toiseen systeemiin siirrettäessä ei tarvitse koko koodia käydä läpi, vaan nuo kone/käyttöjärjestelmäriippuvaiset unitit.

    Ainoa asia, mitä Objectpascalissa ei ole, ovat templatet. Onneksi ne eivät ole kovin keskeinen asia ohjelmoinnissa, vaikka onkin totta, että esim. TStringList ja TList -luokissa varmasti on toistettu hyvin samantapaista koodia. Mutta luokkien perinnällä on kuitenkin mahdollista välttää turhaa toistoa.

    Objectpascalista löytyy myös bittioperaattoreita:

    and, or, xor, not, shl, shr, joita voi siis käyttää vaikkapa longword (32-bittinen etumerkitön kokonaisluku) tyyppisten muuttujien kanssa.

    Ei kannata myöskään unohtaa valmista tukea joukko-operaatioille, esim:

    type
    TCharSet = set of Char;

    var
    Kirjaimet : TCharSet = 'A' .. 'Z';

    Vokaalit : TCharSet = 'A', 'E', 'I', 'O', 'U', 'Y', 'Ä', 'Ö';

    Konsonantit : TCharSet = Kirjaimet - Vokaalit;

    Kirjain : Char;

    begin
    Kirjain := UpCase('o'); // antaa arvon 'O'

    if Kirjain in Vokaalit then ShowMessage(Kirjain ' on vokaali.');

    if Kirjain in Konsonantit then ShowMessage(Kirjain ' on konsonantti.');

    end;

    tai vaikkapa:

    RuotsVokaalit := Vokaalit ['Å'];

    Noita C/C -ansoja on muuten paljon lisääkin.

    Pahin on luultavasti se, jonka takia maailma on täynnä tietoturvaltaan surkeita ohjelmistoja:

    Laitan esimerkin Delphillä, mutta se on 1 yhteen samanlainen kuin C -versio:

    procedure VaaranPaikka;
    var
    Buffer : Array[0..1023] of AnsiChar;
    BufPtr : PChar;

    begin
    // Buffer on 1 binäärikilotavu ( 1 KiB ) puskuri
    BufPtr := Buffer;

    // Käytä puskuria tässä ...
    // voit käyttää osoitinmuuttujaa BufPtr

    end;

    Tuo on vaarallinen tapa koodata.

    Tietenkin ensisijaisesti pitää koodata niin, ettei puskurin ylivuotoja pääse koskaan syntymäänkään (kielestä tiippumatta).

    Mutta ylläoleva runko on kuin ajaisi autoa ilman turvavyötä. Tottakai pitää ajaa niin, ettei tule kolaria, mutta pahimman varalta se turvavyö on silti hyvä olla olemassa.

    em. koodirungossa on se vaara, että puskurin ylivuoto on samalla pinon ylivuoto. Ja pinossa on funktion paluuosoite. Eli jos puskurin ylivuoto ylikirjoittaa pinon paluuosoitteen, niin funktio "palaa" paikkaan, josta sitä ei ikinä edes kutsuttu. Krakkerit usein tuon avulla järjestävät asiat niin, että tuo ylivuotodata on vihamielistä konekielikoodia, ja lisäksi paluuosoite ylikirjoitetaan osoittamaan juuri tuon vihamielisen koodin alkuun (tai hyppykäskyyn sinne).

    Siksi kannattaa käyttää "turvavyöllistä" versiota:

    procedure TurvavyollinenVersio;
    var
    BufferSt : String;
    BufPtr : PChar;

    begin
    SetLength(BufferSt, 1024);
    // BufferSt on 1 binäärikilotavu ( 1 KiB ) puskuri
    BufPtr := PChar(BufferSt);

    // Käytä puskuria tässä ...
    // voit käyttää osoitinmuuttujaa BufPtr

    end;

    jälkimmäisessä esimerkissä puskurin ylivuoto EI OLE samalla pinon ylivuoto, vaan kekomuistin ylivuoto. Esinnäkin: tuo johtaa todennäköisemmin "Access violation" -ilmoitukseen, jolloin jo se paljastaa, että koodissa on puskurin ylivuoto. Toisekseen, koska pino on nyt turvassa, paluuosoite pysyy oikeana, ja vaikka ylivuotodata olisi vihamielistä konekielikoodia, hyökkääjältä puuttuu nyt keino saada se käynnistymään.

    Ylivuoto on tässäkin tapauksessa ohjelmointivirhe, mutta nyt se ei enää anna hyökkääjälle mahdollisuutta oman konekielikoodin suoritukseen.

    Oikein käytettynä siis Delphi on C/C -koodia turvallisempaa. Toki ylivuodot kannattaa pyrkiä ehkäisemään jo ennalta, sillä eihän tuo "Access violation" -ilmoitus kaunista katseltavaa ole, vaikka ei tässä olekaan vakava tietoturvariski kuten 1. esimerkki.

    Delphin merkkijonot voivat sisältää myös ASCII 0 -merkin (siis binäärisen nollan) ja voivat olla max. 2 gigatavun mittaisia (toki käytännössä RAM -muistin määrä rajoittaa, mutta heittovaihtotiedostolla voi jatkaa, jos ei ole kiire).

    Osaava voi myös rakentaa keinotekoisen Delphi stringin, joka onkin muistikartoitettu tiedosto.

    Tällaisessa tapauksessa Reference Count:iksi laitetaan -1, tämä on erikoisarvo, joka käskee Delphin sisäänrakennettua String -tyypin hallintajärjestelmää kohtelemaan ko. Stringiä "Read only" -tyyppisenä. Eli jos tuollaista muokkaa, Delphi tekee siitä automaattisesti kopion ennen muokkausta.

    Äänestä

  • Mika0800 kirjoitti:

    Objectpascal parempi ! (Delphi / Kylix / FreePascal)

    Tosiaankin! Onneksi olkoon. Putosit yhteen niistä ansoista, joita C ja C -kielet ovat täynnä varsinkin aloitteleville ohjelmoijille.

    C-kielessä:

    = (Sijoitus)
    == (Yhtäsuuruusvertailu)


    Objectpascalissa:

    := (Sijoitus)
    = (Yhtäsuuruusvertailu)

    Eikä erot lopu tähän:

    C-kielessä rakenne if (a=5) on laillinen, mutta ei tee sitä, mitä aloittelija luulisi, vaan on sama asia kuin:

    a = 5; if (TRUE) ...

    Delphissä taas tuskin kukaan edes yrittää kirjoittaa:

    if a := 5 then ...

    mutta jos yrittää, Delphi antaa tuollaisesta käännösaikaisen virheen.

    mutta jos joku välttämättä haluaa kirjoittaa C -tyylistä sekavaa koodia Delphillä, onhan sekin mahdollista (mutta EI suositeltavaa):

    function SetInt(var X:Integer; Value:Integer):Boolean;

    begin
    X := Value;
    Result := X 0;
    end;

    ja sitten...

    if SetInt(a,5) then ...
    joka siis käytännössä tekee saman kuin tuo C -esimerkki eli asettaa a:lle arvon 5 ja IF -lause on aina tosi.

    Vastaväittäjät usein perustelevat C/C :n käyttöä sillä, ettei pascalilla muka voi tehdä jotain. Ehkä jollain 1950 -luvulta peräisin olevalla standardipascalilla ei voikaan, mutta eihän sellaista kieltä kukaan ole varmaan vuosikymmeniin käyttänytkään !

    Sensijaan Objectpascalilla voi tehdä kaiken sen, minkä C:llä tai C :llakin, mutta paljon helpommin.

    Ja Delphistä ja Kylixistä löytyy myös asm end; -lohko, johon voi suoraan kirjoittaa assembleria jos siihen on erityinen tarve. Assemblerkieliset osuudet kannattaa laittaa omiin unitteihinsa, koska ne ovat siirrettävyyden kannalta ongelmallisia. Näin koodia toiseen systeemiin siirrettäessä ei tarvitse koko koodia käydä läpi, vaan nuo kone/käyttöjärjestelmäriippuvaiset unitit.

    Ainoa asia, mitä Objectpascalissa ei ole, ovat templatet. Onneksi ne eivät ole kovin keskeinen asia ohjelmoinnissa, vaikka onkin totta, että esim. TStringList ja TList -luokissa varmasti on toistettu hyvin samantapaista koodia. Mutta luokkien perinnällä on kuitenkin mahdollista välttää turhaa toistoa.

    Objectpascalista löytyy myös bittioperaattoreita:

    and, or, xor, not, shl, shr, joita voi siis käyttää vaikkapa longword (32-bittinen etumerkitön kokonaisluku) tyyppisten muuttujien kanssa.

    Ei kannata myöskään unohtaa valmista tukea joukko-operaatioille, esim:

    type
    TCharSet = set of Char;

    var
    Kirjaimet : TCharSet = 'A' .. 'Z';

    Vokaalit : TCharSet = 'A', 'E', 'I', 'O', 'U', 'Y', 'Ä', 'Ö';

    Konsonantit : TCharSet = Kirjaimet - Vokaalit;

    Kirjain : Char;

    begin
    Kirjain := UpCase('o'); // antaa arvon 'O'

    if Kirjain in Vokaalit then ShowMessage(Kirjain ' on vokaali.');

    if Kirjain in Konsonantit then ShowMessage(Kirjain ' on konsonantti.');

    end;

    tai vaikkapa:

    RuotsVokaalit := Vokaalit ['Å'];

    Noita C/C -ansoja on muuten paljon lisääkin.

    Pahin on luultavasti se, jonka takia maailma on täynnä tietoturvaltaan surkeita ohjelmistoja:

    Laitan esimerkin Delphillä, mutta se on 1 yhteen samanlainen kuin C -versio:

    procedure VaaranPaikka;
    var
    Buffer : Array[0..1023] of AnsiChar;
    BufPtr : PChar;

    begin
    // Buffer on 1 binäärikilotavu ( 1 KiB ) puskuri
    BufPtr := Buffer;

    // Käytä puskuria tässä ...
    // voit käyttää osoitinmuuttujaa BufPtr

    end;

    Tuo on vaarallinen tapa koodata.

    Tietenkin ensisijaisesti pitää koodata niin, ettei puskurin ylivuotoja pääse koskaan syntymäänkään (kielestä tiippumatta).

    Mutta ylläoleva runko on kuin ajaisi autoa ilman turvavyötä. Tottakai pitää ajaa niin, ettei tule kolaria, mutta pahimman varalta se turvavyö on silti hyvä olla olemassa.

    em. koodirungossa on se vaara, että puskurin ylivuoto on samalla pinon ylivuoto. Ja pinossa on funktion paluuosoite. Eli jos puskurin ylivuoto ylikirjoittaa pinon paluuosoitteen, niin funktio "palaa" paikkaan, josta sitä ei ikinä edes kutsuttu. Krakkerit usein tuon avulla järjestävät asiat niin, että tuo ylivuotodata on vihamielistä konekielikoodia, ja lisäksi paluuosoite ylikirjoitetaan osoittamaan juuri tuon vihamielisen koodin alkuun (tai hyppykäskyyn sinne).

    Siksi kannattaa käyttää "turvavyöllistä" versiota:

    procedure TurvavyollinenVersio;
    var
    BufferSt : String;
    BufPtr : PChar;

    begin
    SetLength(BufferSt, 1024);
    // BufferSt on 1 binäärikilotavu ( 1 KiB ) puskuri
    BufPtr := PChar(BufferSt);

    // Käytä puskuria tässä ...
    // voit käyttää osoitinmuuttujaa BufPtr

    end;

    jälkimmäisessä esimerkissä puskurin ylivuoto EI OLE samalla pinon ylivuoto, vaan kekomuistin ylivuoto. Esinnäkin: tuo johtaa todennäköisemmin "Access violation" -ilmoitukseen, jolloin jo se paljastaa, että koodissa on puskurin ylivuoto. Toisekseen, koska pino on nyt turvassa, paluuosoite pysyy oikeana, ja vaikka ylivuotodata olisi vihamielistä konekielikoodia, hyökkääjältä puuttuu nyt keino saada se käynnistymään.

    Ylivuoto on tässäkin tapauksessa ohjelmointivirhe, mutta nyt se ei enää anna hyökkääjälle mahdollisuutta oman konekielikoodin suoritukseen.

    Oikein käytettynä siis Delphi on C/C -koodia turvallisempaa. Toki ylivuodot kannattaa pyrkiä ehkäisemään jo ennalta, sillä eihän tuo "Access violation" -ilmoitus kaunista katseltavaa ole, vaikka ei tässä olekaan vakava tietoturvariski kuten 1. esimerkki.

    Delphin merkkijonot voivat sisältää myös ASCII 0 -merkin (siis binäärisen nollan) ja voivat olla max. 2 gigatavun mittaisia (toki käytännössä RAM -muistin määrä rajoittaa, mutta heittovaihtotiedostolla voi jatkaa, jos ei ole kiire).

    Osaava voi myös rakentaa keinotekoisen Delphi stringin, joka onkin muistikartoitettu tiedosto.

    Tällaisessa tapauksessa Reference Count:iksi laitetaan -1, tämä on erikoisarvo, joka käskee Delphin sisäänrakennettua String -tyypin hallintajärjestelmää kohtelemaan ko. Stringiä "Read only" -tyyppisenä. Eli jos tuollaista muokkaa, Delphi tekee siitä automaattisesti kopion ennen muokkausta.

    "Oikein käytettynä siis Delphi on C/C -koodia turvallisempaa."

    Millä vitulla mahdat perustella tuon väitteen? Yhtälailla C/C koodi on oikein käytettynä turvallisempaa kuin Delphi.

    Amatöörit koodaa Delphillä.

    Äänestä

Kommentoi aloitusta


vasta opetten kirjoitti:

Pakko saanoo tästä. Olen tässä muutaman päivän vasta harjotellut php:tä ja harjottelin tuossa tietokantaan kirjottelua. tein seuraavan laisen koodin.

Tarkotus oli niin ku että se kirjottaa nuo $kirjota ja $kirjota2 tuonne tietokanta.txt tiedostoon ja joka toiselle kierroksella vaihtaa riviä.



Tulos oli että kone meni hetkessä jumiin ja tietokanta.txt koko kasvoi vilahuksessa n. 700Mt:uun.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu