Geri Dön   Forum Ti > Programlama Dilleri ve İnternet > Web Geliştirme Dilleri
Üye Ol Üye Listesi Takvim Forumları Okundu İşaretle

Web Geliştirme Dilleri İnternet sitesi geliştirme için kullanılan araçlar ve programlama dilleri... ASP & ASP.NET & PHP & CSS & HTML & SQL & Java Script

Cevap
 
Konu Araçları
Eski 06.06.2007   #1 (permalink)
 
Katılma Tarihi: Şub 2006
Nereden: Bursa/es-es
Yaş: 23
Mesajlar: 1,780
Varsayılan Php de Dosya Dizin Hizmetleri...

Butun bilgisayar programcilari yeri geldiginde dosyalarla ugrasmak zorunda kalir.Bu bazen gecici verileri dosyalarda saklama isteginden , uygulamanin setup bilgilerini saklamaya kadar genis bir yelpazede yer alir.



"Dosya" aslinda hardisk,floopy,cdrom gibi medyalarda saklanan sirali bytelardan baska bir sey degildir."Dizin" ise ozel bir dosya tipidir ve icinde diger dosyalarin ve dizinlerin isimleri saklanabilir.



Linux ve Windows



Unix tabanli isletim sistemleri(Linux gibi) dosyalara ulasmak icin tanimlanan "yol"larda,"/" isaretini kullanirken windows isletim sistemleri "\" ters slash tabir edilen isareti kullanmaktadir.



Unix icin dosya yolu ornegi,



/home/serkan/www/turkphp



Windows icin dosya yolu ornegi,



C:\belgelerim\www\turkphp\serkan



Bu olayin yazdigimiz kodlarda problem yaratacagini dusunebiliriz.Ancak windows uzerinde calisan PHP bu tip durumlarda kodlari otomatik olarak cevirerek kendi kullanabilcegi hale getirmektedir.Mesela ,



$fp = fopen ("/data/data.txt","r");



seklinde yazilan bir kod windows altinda da sorunsuz caliscaktir.Cok spesifik olmayan durumlar icin bu kural gecerlidir ve basinizi pek agritmaz.Yazinin ilerleyen kisimlarinda bir kac aciklama bu konu icin yapilacaktir.



Dosyalarla Calismak



Tipik olarak dosyalarla calisirken asagidaki adimlar izlenir.





Calismak istediginiz dosyayi yolu ile belirterek acin.

Dosyayi okuyun , dosyaya yazin vb...

Dosyayi kapatin.


fopen ()



Ilk gorecegimiz dosya fonksiyonu fopen (),dosyalari acmak icin kullanilir.Alabileegi 3 tane argument vardir :





dosyaadi

mode

use_include_path (opsiyonel olarak kullanabilirsiniz)


Dosyalari acmak icin kullanilan bu fonksiyon ayni zamanda dosyalarin acilip acilamayacagini (yani izinleriniz tamam,dosya yerinde mi? gibi) kontrol icinde kullanilabilir.



Ornek vermek istersek,



$fp = fopen ("./data.txt","r");
if (!$fp) die ("Dosya Acilamiyor");



veya alternetif olarak tek satirda yazmak istersek,



if (!($fp = fopen ("./data.txt","r"))) die ("Dosya Acilamiyor");



Burada lutfen kafaniz karismasin.$fp degiskenine dosyanin yolunu veya fopen fonksiyonu kullanmamizin sonucundaki degeri esitlemiyoruz.Eger boyle yapmak isteseydik "==" kulllanirdik.Dikkat ederseniz burada bir test islemi gerceklesiyor.Yani aslinda biz belkide daha sonra kullanacagimiz bir dosyanin yerinde olup olmadigina bakiyoruz.Onun icin fopen fonksiyonu kullanarak dosyayi acmak istiyoruz.Donen degere gore if yapisi ile test islemini gerceklestiriyoruz.



Bu komut kullanilarak yapilan yukaridaki gibi testlerde uzak host'lardaki dosyalarda kontrol edilebilir.Ornek vermek istersek,



if (!($fp = fopen("http://www.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);



if (!($fp = fopen("ftp://ftp.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);



uzak host 'taki dosya "yanlizca okunabilir" olarak acilabilir.



Eger daha once Unix tabanli bir isletim sistemi kulllandyisaniz bundan sonra yazacaklarimiza zaten asinasinizdir.Biz yine de bilmeyen insanlar icin bir tekrar yapmak istiyoruz.Cogu zaman gordugunuz ../data.txt veya ./data.txt gibi ifadeler ne anlama geliyor veya bu noktalar neden koyuluyor gibi?



./data.txt : scriptimiz ile ayni klasorde yer alan data.txt isimli dosya.
../data.txt : scriptimizin yer aldigi klasorun bir ustundeki klasorde data.txt isimli dosya.
../../../data.txt : scriptimizin yer aldigi klasorden uc level yukaridaki klasorde data.txt isimli dosya.



Olayi anladiniz herhalde daha fazla ornek vermeye gerek duymuyorum.



Simdi de dosyalari acarken kullandigimiz "mode" argumentine bakalim.



r: Dosyayi yanliz okunabilir olarak ac.Kursor dosyanin basinda yer alir.
r+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.
w: Dosyayi yanliz yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Daha onceden var olan hersey yok olur.Eger boyle bir dosya yoksa PHP yaratmaya calisir.
w+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Eger boyle bir dosya yoksa PHP yaratmak icin tessebuste bulunur.Dosya icinde daha onceden var olan hersey yok olur.
a : Yanlizca dosyanin sonuna veri eklemek icin dosya acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.
a+ : Dosyanin sonuna veri eklemek ve dosya okunmak icin acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.



Mode argumenti ayni zamanda "b" degerini de almaktadir.Bu deger verildiginde dosya "binary" modunda islenir.Windows icin kullanislidir.Linux icin bu degerin bir anlami yoktur.



"include_path" argumenti eger buyuk bir site uzerinde calisiyorsaniz ve "inc" dosyalari belirli bir klasor uzerindeyse php.ini dosyasinda "include_path" yolunu belirterek dosya acma islemlerinde bir kolaylik saglayabilirsiniz.ornek vermek istersek,



php.ini dosyasinda "include_path" olarak /home/apache/inc verdiyseniz ve,



fopen ("data.txt","r",1);



yadiginiz zaman once data.txt dosyasi scriptin bulundugu klasorde aranacak eger bulunamaz ise /home/apache/inc klasorune bakilacaktir.



fclose



Dosya ile calismayi bitirdiginizde ,dosyanin kapatilmasi gereklidir.Bu islemi fclose () komutu ile yapabilirsiniz.Script calismayi bitirdiginde otomaik olarak butun acik dosyalar PHP tarafindan kapatilir.Size tavsiyemiz dosya ile calismayi bitirdiginiz anda bu komutu kullanarak dosyayi kaptmaniz.anck bu sekilde ayni scripti kullanan diger kullanicilar hizli bir sekilde servis alabilir.



fclose ($fp);



seklinde kullanilir.



Dosyalardan okumak ve dosyalara yazmak



Smdiye kadar dosya acma ve kapama islemlerini gorduk.Artik onlarin icinden verileri okuyabilir ve yazabiliriz.Ilk olarak cok basit iki komutu gorecegiz.Cogu islemde bu iki komut isinizi gorecektir.



fread ()






Bu komut dosyadan string karakterleri okumak icin kullanilir.Alabilcegi iki argument vardir.Ilki dosyanin ne oldugu,ikincisi integer yani sayisal olarak "length"(uzunluk) degeri.Ornek vermek gerekirse,



$fp = fopen ("data.txt","r") ile dosyayi basarili sekilde actigimizi varsayalim.



$data = fread($fp,10);



burada $data degiskeni icine,actigim "data.txt" dosyasindan ilk 10 byte veriyi okuyup atamis oldum.



Bu konu ile ilgili bilmeniz gereken bir kac onemli nokta bulunmaktadir.





Ilk 10 byte veriyi okuduk ve ayni islemi tekrar etmek istedik.Artik kursor ilk 10 byte'in bittigi yerdedir ve biz artik 10-20 bytelari arasindaki veriyi okuyabiliriz.

Eger dosya 10 byte'tan kucukse PHP dosyanin basindan sonuna kadar okur ve degeri dondurur,bir problem olmaz.


fwrite ()



Bu komut dosyaya veri yazmak icin kullanilir.Iki argument bu komutun kullanilmasi icin gereklidir .Birincisi dosyanin ne oldugu,ikincisi ise dosyanin icine ne yazilacagi. Eger islem basarili olursa degisken icin ,kac byte veri yazilmissa onun sayisal degeri doner,basarisiz olursa "-1".Ornek verecek olursak,



$fp = fopen ("data.txt","w") ile dosyayi basarili sekilde actigimizi varsayalim.



fwrite ($fp,"ABCDSerKanCeyLAnI");



Bu komut "data.txt" dosyasinin basina "ABCDSerKanCeyLAnI" karekterlerini yazar.Daha onceden dosya icerisinde yazilmis tum veriler tamamen silinir.Yanlizca elinizde bu karaketerlerin yazili oldugu bir dosya kalir.Tekrar ediyoruz kursor bu karekter dizisinin sonuna gidip bekler.Bu komutu kullanirken aklinizda olsun, bilgisyara normal olarak klavyeden yaziliyor gibi karekterler yazilir ve kursor yazdiginiz yazi grubunun sonuna gidip bekler.



Eger ozel bir uzunluk belirtmek isteseydik,bunu ucuncu argument olarak komuta su sekilde ekleyebilirdik,
fwrite ($fp,"ABCDSerKanCeyLAnI",4);



Bu komutla verdigimiz string ifadenin(ki bu "ABCDSerKanCeyLAnI" dir.) ilk 4 byte'i (ki bu "ABCD" dir.) $fp degiskeni ile belirttigimiz dosya icerisine yazilacaktir.Eger belirtilen uzunluk byte'i yazilacak ifadeden buyukse ifade'nin hepsi yazilir,bir problem olmaz.



Artik bu kadar konusma yeterli uygulama yapmanin zamani geldi.






Basit Bir Hit Sayaci



<?php
//hit_sayac1.php



$sayac_dosyasi = "./sayac.dat";



if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");



$sayac = (int) fread($fp,20);



fclose ($fp)



$sayac++;



echo "Ziyaret Sayisi : $sayac";



$fp = fopen ($sayac_dosyasi,"w");



fwrite ($fp,$sayac);



fclose ($fp);



?>



Ne zaman sayfayi refresh yapsaniz sayfanin uzerindeki sayacin bir arttigini gorursunuz.



Not : Bu kucuk programda "sayac.dat" isimli dosyanin zaten klasorun icinde oldugu kabul edilmektedir.Eger boyle bir dosya bulunamaz ise program hata verecektir.Bu nedenle Unix/Linux kullanicilari "touch" komutunu kullanarak dizin icinde bir dosya yaratbilirler.



bash 2.0.4>touch sayac.dat



veya bir text dosyasi acip "save as" ile bos olarak kaydedin.Kaydederken de "sayac.dat" ismini verin isiniz gorulur.



Program nasil calisiyor?



Ilk once "sayac.dat" dosyamiz scriptin bulundugu klasor icinde bulundu ve "yanlizca okunabilir" olarak acildi.



$sayac_dosyasi = "./sayac.dat";



if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");






ikinci satirda "if" komutuyla dosyanin acilmasi sirasinda bir problem oldu mu diye test yapiyoruz.Eger islem basarili olarak gerceklesirse parantezin disina "dogru" olarak cikacaktir.Ama dikkat ederseniz bir unlem isaretimiz var.Bu unlem isareti o "dogru" ifadasini "yanlis" a cevirecek ve boylece program bir alt taki satiri okuyacaktir.Her turlu problemde script "die" komutuyla , "echo" ile verigimiz ifadeyi ekrana basarak sonlanacaktir.






Boylece yazi dizimizin ilk bolumunu bitirdik.Bundan sonraki bolumde ayrintili olarak "Dosya ve dizin Islemleri" konusuna devam edecegiz.




PHP Ile Istemci-Server Iliskisinde "Israrci" Olmak - BOLUM 1


PHP4 Oturum Yonetimi



PHP kendi icinde cok gelismis bir "oturum yonetim sistemi" ile beraber gelir.Bu nedenle cok fazla detayla ugrasmaya gerek kalmaz.



Bilinmesi gereken en onemli konu "session identifier" denilen (Genel olarak bilinen adiyla SID) ozel bir degiskenin, her istemciyi spesifik edebilmek icin referans numarasi verilmek suretiyle atanmasidir.



Bu verilen referans numarasi bir nevi elektrik faturasi numarasi gibidir.Siz nasil Elektrik sirketine gidip te faturanizi gosterdiginizde onlar uzerindeki numaradan sizinle ilgili her bilgiye ulasabiliyorsa veya her seferinde adinizi soyadinizi soylemek zorunda kalmiyorsaniz ayni sekilde PHP de istemcileri bu numara ile tanir ve yonetir...



Eger oturumu baslatirsaniz server tarafindan otomatik olarak SID atanir.Herhangi bir degiskeni "oturum degiskeni" olarak kayit ettiginiz anda server uzerinde cookie benzeri bir dosya acilir.(Bu dosyanin adi genelde SID'nin degeri ile aynidir).Istemci tarafindaki bilgisayar ne zaman bu veriye ulasmak isterse, yapmasi gereken tek sey istekle beraber SID numarasini da beraber gondermektir.Bu gonderme islemi hidden html kontrolleri,cokkie'ler,sorgu dizisi vb., yani herhangi bir yontemle olabilir.Eger istegi yapan istemci SID'yi beraberinde gonderiyorsa kendisi icin ayrilan bu dosyadan kayit edilen "oturum degiskenleri" okunarak istemcinin istedigi gibi bunlari kullanmasi saglanir.



Eger istemcide cookie destegi aciksa bu deger istemci makinede cookie olarak bile saklanabilir.Eger bu ozelligi kullanamak istemiyorsaniz/veya kullanamiyorsaniz en basit yol bu SID degerini yapilan butun isteklerle beraber gondermektir.



PHP4 ile oturum yonetimi cok basit hale getirilmistir.Bir cok durum icin su cumle gecerilidir:



"Ben X,Y, ve Z degiskenlerinin tum istemci-server iliskisinde israrla kalici olmasini istiyorum."



Volila iste hepsi bu )



Birakin PHP4 bundan sonraki kirli isleri kendisi ele alsin.Tek bilmeniz gereken (Bir programci olarak)bir degiskenin nasil oturum degiskeni olarak kayit edilecegini ogrenmektir.Bu durumda belirttiginiz degisken "israrla" oturum boyunca saklanacaktir.



Peki bu durumdaki bir "oturum degiskenine" nasil erisilecektir?






PHP4 ile bir degiskeni "oturum degiskeni" seklinde kayit etmek session_register () fonksiyonu ile saglanmaktadir.



Degiskeninin ismi Dolar isaretleri OLMADAN verilmelidir.Bu durumda verilen degisken ve sakladigi deger butun oturum boyunca saklanacaktir.Eger tanimli/gecerli bir oturum yok ise o anda otomatik olarak bir tane yaratilacaktir.



Bir ornek vermek istersek, $var1 ve $var2 degiskenlerini israrci/kalici yapmak istiyoruz.Bu durumda PHP scriptimizi yazmaya su sekilde baslayabiliriz :



<?php
session_register ("var1") ;
session_register ("var2") ;
?>



Onemli Bir Konu :Bu gibi durumlarda eger bir degiskeni "oturum degiskeni" olarak kayit etmek istiyorsaniz bunu scriptin en basinda yapin.Boylece herhangi bir HTTP istegi hazirlanip gonderilmeden butun oturum degiskenlerini mukkemel bir sekilde kayit etmis olacaksiniz.Bu sizin ,cogu zaman gordugumuz "Error: HTTP headers already sent" hatasindan kurtaracaktir.Aklinizda bulunsun )



Bir kere o degiskeni oturum degiskeni olarak kayit ettikten sonra o degiskenin sakladigi degere ulasmak inanilmaz derecede kolaylasir.Diger global degiskenlere ulasirken kullandiginiz yollari ayni sekilde bu tip oturum degiskenlerinde de kullanabilirsiniz.Diger her tur degiskene ulasirken kullandiginiz yol ve yontemler bunlar icin de gecerlidir.Diger degiskenlerden tek farki bu sekilde kayit ettigimiz oturum degiskenlerinin oturum acik kaldigi surece erisilebilir olmalaridir.



Bir ornek yaparak konuya devam edelim.



1.Text editorunuzu acin ve asagidaki kodlari yazin.



<?php
session_register ("izlenme1say");
session_register ("izlenme2say");
session_register ("izlenme3say");
session_register ("izlenme4say");
?>



/* Yanlizca oturumla ilgili bolumu temiz bir sekilde scriptin ayri bir bolumune bu sekilde yazdim.
*/



<?php
//sayfa_sayac.php



if (!$izlenme1say) $izlenme1say =0;
if (!$izlenme2say) $izlenme2say =0;
if (!$izlenme3say) $izlenme3say =0;
if (!$izlenme4say) $izlenme4say =0;



/* Scriptin bundan sonraki kismi cok yogun bir sekilde gorulen ve browserimizin uzerinde tasinan oturum numarasinin nasil gerceklestigini gostermektedir.Onemle incelemenizi rica ederim...PHP oturum bilgilerinize erismek icin bu SID'ye kesinlkle ihtiyac duyar.Biz yarattigimiz hyperlinkleri bu sekilde SID'yi icerecek sekilde hazirlayarak ona bu bilgiyi de saglamis oluyoruz.
*/



echo "<HTML><HEAD><TITLE>Web Sayfasi icin Erisim Sayaci</TITLE></HEAD><BODY>";



if ($hangisayfa) {
echo "Su anda $hangisayfa numarali sayfadasiniz.<BR><BR>n";
$GLOBALS["izlenme${hangisayfa}say"]++;



}



for ($i=1; $i <= 4; $i++) {



if ($hangisayfa == $i) {
echo "<A HREF="$PHP_SELF?".SID."&hangisayfa=$i">Sayfa $i</A>";
} else {
echo "<A HREF="$PHP_SELF?".SID."&hangisayfa=$i">Sayfa $i</A>";
}
echo ",bu sayfayi toplam ".$GLOBALS["izlenme${i}say"]." kere goruntulediniz.<BR>n";
}
echo "nn<BR><BR>nn";
echo "</BODY></HTML>";



?>



2.Bu dosyayi "oturumyonetimi1.php" olarak bilgisayariniza kayit edin.



3.Browser yardimiyla sayfayi goruntuleyin.



Ornek Programlar



http://www.turk-php.com/ornekler/oturumyonetimi1.php






http://www.turk-php.com/ornekler/oturumyonetimi1.phps



(Lutfen programin kaynak kodlarini buradan izleyiniz.Bazi HTML kodlari otomatik olarak calismaktadir.Bu nedenle biz yazmis olsak dahi sayfa icinde duz yazi seklinde degilde islenmis halde gorunuyor.Buna ornek olarak ve taglarini verebiliriz...)



Not : Browseri kapatip tekrar acin. Sayfaya tekrar baglanin butun verilerin ayni sekilde yerinde durdugunu goreceksiniz



Program Nasil Calisiyor



Programa session_register komutu ile 4 tane degiskenimi oturum degiskeni olacak sekilde kayit ederek basliyorum.
Daha iyi anlamaniz icin boyle ilk kisimda <?php ve ?> taglari arasina yazdim.



<?php
session_register ("izlenme1say");
session_register ("izlenme2say");
session_register ("izlenme3say");
session_register ("izlenme4say");
?>



Ondan sonra ana blokun yapimina basladim.Eger herhangi bir sayfa daha once goruntulenmemis ise "0" degeri almasini sagliyorum.(Bunu yarparken ayni zamanda degiskenlerimin "sayi" tipinde veri icerecegini PHP'ye fisildamis oluyorum )



<?php
//sayfa_sayac.php



if (!$izlenme1say) $izlenme1say =0;
if (!$izlenme2say) $izlenme2say =0;
if (!$izlenme3say) $izlenme3say =0;
if (!$izlenme4say) $izlenme4say =0;



Programin ucuncu bolumunde kullanicin o anda hangi sayfada bulundugu bilgisi verilmektedir.Ayni zamanda o sayfayi goruntuledigi icin o sayfaya ait degiskenin degeri 1 arttirilmaktadir.($hangisayfa degiskeni biz sayfayi goruntulereken donguden alip programa "url" icinde gonderiyoruz.Simdiye kadar hic tanimlamadigimiz halde programin isleyisini gozonune alirsaniz olayin mantigini anlarsiniz.Yani zaten bu degisken bir degere sahip degilse programin nasil isleyecegine bakin...)



if ($hangisayfa) {
echo "Su anda $hangisayfa numarali sayfadasiniz.<BR><BR>n";
$GLOBALS["izlenme${hangisayfa}say"]++;



}






Programin dorduncu bolumunde "for" dongusu kullanilarak sayfalarin adi ve linkleri ekrana yaziliyor.Gordugunuz gibi bulundugumuz sayfanin linkini de "koyu" yapmayi unutmadik...



kaynak:turk-php.com
staticiation Şuanda Forumda Değil   Alıntı yaparak cevapla
Cevap


Şu Anda Konuyu İnceleyen Aktif Kullanıcılar: 1 (0 üye ve 1 misafir)
 
Konu Araçları


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Dosya zipleme, zipli dosya açma...(Sıkıştırılmış Arşiv dosya/klasör) nefretnet Yeni Başlayanlara Bilgisayar, İnternet ve Forum Yardımı 4 13.03.2008 00:55
OsmanLı Software HOSTING - DOMAIN ve SHELL Hizmetleri federal Web Tasarım 0 07.08.2007 16:14
DOSYA SIKIŞTIRMA ve DOSYA KURTARMA PROGRAMLARI Myst3rious A-B-C-D-E 0 02.08.2007 22:37
Dizin Seçtirmek...vb staticiation Programlama & Geliştiriciler için 0 09.06.2007 19:02
Yapı Kredi Bankası Müsteri Hizmetleri: rohanlesgo Geyik 2 25.03.2007 18:52


Şu anki forum saati: 23:04.


cnt hizmet sağlayan firma
ForumTi.com'un yapımı ve yayınlanması CNT'ye aittir.
Sitedeki içerikleri foruma ücretsiz şekilde üye olabilen ziyaretçiler oluşturur. Bu içeriklerin sorumluluğu yazana aittir.
Eğer yasak ve aykırı içerik tespit edilirse site yöneticilerine bu konular bildirilir ve kaldırılır. Site yönetimi haberdar edildiğinde sonuç alınamaz ise servis sağlayıcı CNT'ye bildiride bulunabilirsiniz.
vBulletin® v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Search Engine Friendly URLs by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265