<?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>Sezai Yılmaz'ın Bilgisayar Dünyası &#187; php</title>
	<atom:link href="http://www.sezaiyilmaz.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sezaiyilmaz.com</link>
	<description>Linux, UNIX, Windows, sistem yönetimi, uygulama ve sistem programı geliştirme tecrübeleriyle ilgili yazıları...</description>
	<lastBuildDate>Mon, 30 Nov 2009 11:10:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>PHP ile PDF Yazdırmak &#8211; FPDF</title>
		<link>http://www.sezaiyilmaz.com/2009/11/30/php-ile-pdf-yazdirmak-fpdf/</link>
		<comments>http://www.sezaiyilmaz.com/2009/11/30/php-ile-pdf-yazdirmak-fpdf/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 21:51:51 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Teknoloji]]></category>
		<category><![CDATA[fpdf]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pdf protection]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[piechart]]></category>

		<guid isPermaLink="false">http://www.sezaiyilmaz.com/?p=462</guid>
		<description><![CDATA[Eşim Meryem&#8217;in yayıncılık işlerine teknolojik destek vermek amacıyla 2009&#8242;un yaz aylarında Online Soru Bankası ve Online Sınav Üreteci uygulamaları geliştirdim. Amaç İngilizce ilköğretim öğretmenlerine diledikleri ünitelerden diledikleri sayıda sorudan oluşan sınavları Online Soru Bankası&#8217;ndaki sorulardan üretmeleri. PHP ile geliştirmiş olduğum uygulamadan üretilen sınavların yazıcı çıktısına müsait olabilmeleri için PDF olarak öğretmenlere sunulması gerekiyordu. Önce hosting [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-464" title="fpdf" src="http://www.sezaiyilmaz.com/wp-content/uploads/2009/11/fpdf.gif" alt="fpdf" width="104" height="71" />Eşim Meryem&#8217;in yayıncılık işlerine teknolojik destek vermek amacıyla 2009&#8242;un yaz aylarında Online Soru Bankası ve Online Sınav Üreteci uygulamaları geliştirdim. Amaç İngilizce ilköğretim öğretmenlerine diledikleri ünitelerden diledikleri sayıda sorudan oluşan sınavları Online Soru Bankası&#8217;ndaki sorulardan üretmeleri. PHP ile geliştirmiş olduğum uygulamadan üretilen sınavların yazıcı çıktısına müsait olabilmeleri için PDF olarak öğretmenlere sunulması gerekiyordu.<span id="more-462"></span></p>
<p>Önce hosting firmasının sunucusundaki PHP yorumlayıcısında PDF eklentisinin olmadığını öğrendim. Bu nedenle hosting firması değiştirmem gerekeceğini düşünmeye başladım. Ancak biraz daha araştırınca sadece PHP ile geliştirilmiş ve herhangi bir C PDF kütüphanesi ihtiyacı duymadan PDF formatında çıktı üretebilen bir PHP projesi ile tanıştım: <a title="FPDF" href="http://www.fpdf.org" target="_blank">FPDF</a>.</p>
<p>FPDF basit yazabilen bir PHP sınıfından ibaret bir proje. Bu sınıfı genişleterek kendi projenize uygun PDF çıktısı üretecek yeni bir sınıf yazarak kullanmanız gerekiyor. Böylece PDF dökümanının dinamik bir şekilde yazılması sürecinin tamamına (mesela yeni sayfaya geçilmesinde yapılacak işlemlere) müdahale edebiliyorsunuz.</p>
<pre><code><span>&lt;?php
</span></code>
<pre><code><span>require(</span><span>'fpdf.php'</span><span>);
</span></code></pre>
<p><code><span>class </span>PDF <span>extends </span>FPDF<br />
{<br />
</code></p>
<pre><code><span>function </span>Header<span>()
{
    </span><span>// her yeni sayfanın üst kısmına yazılacak
 </span>   $<span>this-&gt;</span>SetFont<span>(</span><span>'Arial'</span><span>,</span><span>'B'</span><span>,</span>16<span>);
    </span>$<span>this-&gt;</span>SetTextColor<span>(</span>255<span>,</span>192<span>,</span>203<span>);
    </span>$<span>this-&gt;</span></code><code>MultiCell<span>(</span>0<span>,</span>5<span>,"sample header text"</span><span>,</span>0<span>,</span><span>'L'</span><span>);</span></code><code><span>
}
}

</span></code>
<pre><code>$pdf<span>=new </span>PDF<span>();
</span>$pdf<span>-&gt;</span>AddPage<span>();
</span>$pdf<span>-&gt;</span>SetFont<span>(</span><span>'Arial'</span><span>,</span><span>''</span><span>,</span>12<span>);
</span>$txt<span>=</span><span>"FPDF is a PHP class which allows to generate PDF files with pure PHP, that is to say "</span><span>.
    </span><span>"without using the PDFlib library. F from FPDF stands for Free: you may use it for any "</span><span>.
    </span><span>"kind of usage and modify it to suit your needs.\n\n"</span><span>;
for(</span>$i<span>=</span>0<span>;</span>$i<span>&lt;</span>25<span>;</span>$i<span>++)
    </span>$pdf<span>-&gt;</span>MultiCell<span>(</span>0<span>,</span>5<span>,</span>iconv('utf-8', 'iso-8859-9', $txt)<span>,</span>0<span>,</span><span>'J'</span><span>);
</span>$pdf<span>-&gt;</span>Output<span>();
</span></code></pre>
<p><code>?&gt;<br />
</code></pre>
</pre>
<p>Türkçe True Type fontları da FPDF&#8217;in kullanabileceği formata dönüştürerek sorunsuz Türkçe karakter yazdırmanız mümkün oluyor. Üretilen PDF&#8217;lere bu fontlar da gömülüyor ve her PDF gösterebilen ortamda sorunsuz bir şekilde Türkçe karakterleri gösterebiliyor. Tek dezavantajı UTF-8&#8242;den anlamıyor. Türkçe yazdırmanız gereken herşeyi iso-8859-9 formatında yazdırmanız gerekiyor. Normalde UTF-8 kodlaması kullandığım için bu durum benim için büyük bir problem olarak karşıma çıktı. Ancak iconv() işlevi yardımıma koştu. Veritabanından okuttuğum tüm UTF-8 içeriğini iconv() ile iso-8859-9&#8242;a dönüştürerek FPDF yardımı ile PDF&#8217;e yazdırdım.</p>
<p>Basit PDF yazdırma dışında ihtiyacım olan gelişmiş özellikler için ise yine <a title="www.fpdf.org" href="http://www.fpdf.org/en/script/" target="_blank">www.fpdf.org</a>&#8216;daki scriptler yardımıma koştu. Her birisinin ayrı ayrı yetenekleri olan onlarca script FPDF&#8217;in özelliklerini ve yeteneklerini genişletmektedir. Örneğin çapraz yazı yazmak için Rotation script&#8217;i kullanılabilir. Benim amacım çapraz silik yazı yazarak watermark oluşturmak olduğu için Watermark script&#8217;i işimi gördü. Bunun yanında PieChart türünde bazı grafikler çizme ihtiyacım olduğu için Sector script&#8217;ini de kullandım. Öğretmenlerin sadece çıktı alabilmeleri için PDF Security de uygulama ihtiyacım vardı. Bu nedenle Protection script&#8217;ini de projeye dahil ettim.</p>
<p>Üretilen sınav sayfasında her bir sorunun resmi/resimleri ile beraber cevap şıkları da dahil olarak ne kadar yer kaplayacağı önceden bilinemiyor. Bu nedenle oluşturduğum PDF üreteci sınıfın geçici bir instance&#8217;ı ile PDF sayfası hazırlıyor ve artan boşluğu hesaplıyorum. Böylece yeni yazılacak olan sorunun ne kadar yer kaplayacağını önceden hesaplamış oluyorum. Buna göre de sayfa yapısında sorular arasında eşit miktara boşluk bırakarak soruların dengeli ve düzenli bir şekilde yerleştirilmesini sağlıyorum. Bu hesaplama bana iki kez PDF oluşturma maliyeti getiriyor. Ancak bu durum bu güne kadar bir performans sorununa neden olmadı.</p>
<p>FPDF&#8217;in PDF yazma performansı oldukça yüksek. 5 sayfalık bir PDF&#8217;i günümüz için orta güçte olan bir bilgisayarda 0.5 saniyede yazabilmekte. PDF security uygulandığında ise aynı PDF yaklaşık 7 saniyede üretilebilmekte.</p>
<p>FPDF&#8217;in oldukça iyi bir dökümantasyonu var. İngilizce sıkıntısı yaşayanlar için dökümantasyonun Türkçe tercümesi Çağlar Ülküderner tarafından yapılmış.</p>
<p>FPDF&#8217;i iş başında görmek ve ürettiği sonucu yakından incelemek için sınav üretme demo&#8217;sunu <a title="www.successtosbs.com" href="http://www.successtosbs.com" target="_blank">http://www.successtosbs.com</a>&#8216;dan gerçekleştirebilirsiniz. Öğretmen Girişi sayfasından Demo Girişi bağına tıklamanız demo kullanıcısı ile oturum açmanız için yeterlidir.</p>
<p>PHP&#8217;den PDF üretme ihtiyacı olanlara FPDF&#8217;i şiddetle öneririm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2009/11/30/php-ile-pdf-yazdirmak-fpdf/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Türkçe Karakter Sorunlarımız</title>
		<link>http://www.sezaiyilmaz.com/2008/07/28/turkce-karakter-sorunlarimiz/</link>
		<comments>http://www.sezaiyilmaz.com/2008/07/28/turkce-karakter-sorunlarimiz/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 20:08:42 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Teknoloji]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[karakter]]></category>
		<category><![CDATA[libc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[sorunlar]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tr_TR]]></category>
		<category><![CDATA[turkce]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[utf]]></category>

		<guid isPermaLink="false">http://sezaiyilmaz.com/?p=94</guid>
		<description><![CDATA[Türkçe&#8217;mize özgü özel karakterlerimiz (ö, ü, ç, ş, ğ, ı, Ö, Ü, Ç, Ş, Ğ, İ), bilgisayarın hayatımıza girdiği ilk günden itibaren sorun oluşturmuştur. Bilgisayar&#8217;ın gelişimine ve standartların oluşumuna ilk başta katkı vermemiş olan ülkeler de bizlerle benzer kaderi paylaşmıştır. Türkçe karakter sorunlarımız saklama, gösterim, sıralama, büyük &#8211; küçük harf dönüşümü gibi kategorilere ayrılabilir. UTF [...]]]></description>
			<content:encoded><![CDATA[<p>Türkçe&#8217;mize özgü özel karakterlerimiz (<strong>ö, ü, ç, ş, ğ, ı, Ö, Ü, Ç, Ş, Ğ, İ</strong>), bilgisayarın hayatımıza girdiği ilk günden itibaren sorun oluşturmuştur. Bilgisayar&#8217;ın gelişimine ve standartların oluşumuna ilk başta katkı vermemiş olan ülkeler de bizlerle benzer kaderi paylaşmıştır.</p>
<p>Türkçe karakter sorunlarımız saklama, gösterim, sıralama, büyük &#8211; küçük harf dönüşümü gibi kategorilere ayrılabilir. UTF serisi kodlama standartları ile beraber saklama ve gösterim sorunları büyük ölçüde çözülmüştür ve sistemler arası uyumlu hale gelmiştir. UTF standardının yardımı ile eskisi kadar çok Türkçe karakter sorunu ile karşılaşmaz olduk.</p>
<p>Ancak <strong>ı</strong> ve <strong>İ</strong> harflerimiz ile ilgili öyle bir sorunumuz var ki, ne yazık ki çözülmesi ile ilgili umudumu kaybetmiş durumdayım. İngiliz <strong>i</strong> harfinin büyük hali <strong>I</strong> olmaktayken, Türkçe <strong>i</strong> harfi&#8217;nin büyük hali ise <strong>İ</strong> olmaktadır. Ancak her iki <strong>i</strong> harfinin de her kodlama standardındaki sayısal değeri aynıdır. Aslında karakteristik olarak benzer karakterler olsalar da bu özellikleri nedeni ile birbirinden oldukça ayrı karakterlerdir.<span id="more-94"></span></p>
<p>Kullandığımız alfabenin Latin ailesinden geliyor olması nedeni ile ne yazık ki tüm yabancı isimler orijinal hali ile yazılarak kullanılmaktadır. Örneğin <strong>Linux</strong> ismi, <strong>Linüks</strong> değil de <strong>Linux</strong> olarak yazılmaktadır. Bu metni Türkçe olarak büyütürsek <strong>LİNUX</strong>, İngilizce olarak büyütürsek <strong>LINUX</strong> olarak yazılmaktadır. Ancak orijinalini yazma eğilimimiz olduğu için <strong>LINUX</strong> olanını kullanırız. Bu durum tüm kuralları alt üst etmektedir. Bu, bizim dilimizde bir metnin bir bütün olarak Türkçe olması söz konusu olamayacağı anlamına gelmektedir. Örneğin bu cümle Türkçe olarak yazıldı, ama içindeki <strong>Linux</strong> özel ismi Türkçe değildir ve büyük hali de <strong>LINUX</strong>&#8216;tur.</p>
<p>Bu durum nedeni ile özellikle ana dili Türkçe olmayan geliştiriciler tarafından geliştirilmiş olan (tüm yabancı menşeyli yazılımlar bu kategoridedir) yazılımlarda Türkçe karakter sorunu bulunmaktadır.</p>
<p>Örneğin; PostgreSQL&#8217;in Türkçe sıralama ve harf küçültüp büyütme yapabilmesi için dil seçimi ile ilgili tüm çevre değişkenlerinin tr_TR olarak kurulu olması ihtiyacı bulunmakta. Ancak aynı PostgreSQL&#8217;in sunucu süreçleri İngilizce dili olarak kurulmuş olan çevre değişkenli bir ortamdan başlatılmaktadır. SQL cümleciklerinin özel kelimelerinin tamamı standart tanım gereği İngiliz dili ile ifade edilen kelimeler (INSERT, INTO, INDEX, &#8230;) olması ve küçük büyük harf ayrımı yapılmaması gerektiği belirtilmiş durumda. PostgreSQL küçük büyük harf ayrımını yapmamak için hepsini küçük harfe dönüştürerek bir yapıda tutmakta ve kullanıcının girdiği SQL cümleciklerinin SQL özel kelimelerini de küçülterek bunlarla karşılaştırmakta. Ancak kendi içinde tuttuğu yapı insert, into, index iken kullanıcının girdisi ınsert, ınto, ındex&#8217;e dönüştürülmekte. Bu nedenle büyük harflerle yazılmış SQL sorguları işletilememekteydi. Yıllar önce bu sorunu fark edip PostgreSQL geliştiricileri ile paylaştım. Yerel ayarlardan etkilenen bir küçültme işevi olan tolower()&#8217;ı kullanmamalarını, özellikle İngilizce küçültme yapan ayrı bir işlev kullanmalarını <a href="http://archives.postgresql.org/pgsql-bugs/2001-02/msg00135.php">rica ettim</a>. Beni kırmayıp, sorunu güzelce anlayıp 3-4 günde çözüm getirdiler ve bir sonraki sürümde bu yamanın dahil olacağını ilettiler.</p>
<p>Aynı sorun PHP&#8217;de de var. Tamamiyle İngilizce harflerden oluşabilen PHP fonksiyon isimleri ne yazık ki aynı hataya düşülerek yerel dil duyarlı bir işlevle küçültülmeye çalışılmaktadır. Sonuç PostgreSQL ile aynı olmaktadır. PHP geliştiricilerine de <a href="http://bugs.php.net/bug.php?id=35583">hata raporu</a> ilettim. Ancak bu durumu 2003 yılından beri biliyoruz deyip gene çözüm sağlamamayı yeğlediler. Ben her defasında hazırlamış olduğum <a href="http://www.sezaiyilmaz.com/static_content/zend_operators.c.diff">bu yamayı</a> kullanarak yeniden PHP derlemek zorunda kalıyorum.</p>
<p>Aynı sorun ne yazık ki Java&#8217;da da var. Ingilizce olması gereken ifadeler Türkçe yerel dil ayarlı ortamda bambaşka bir hal almakta. Özellikle içinde <strong>i</strong> ya da <strong>I</strong> harfleri bulunuyorsa. Karşılaştırmalar çalışmamakta, Bean&#8217;lerin setter veya getter methodları bulunamamakta.</p>
<p>Önceleri UNIX&#8217;in libc kütüphanesini tasarlayanları suçladım. Yerel duyarlı tolower() / toupper() işlevini geliştiren zihniyet, sadece İngilizce olabilecek olan ifadelerin küçük büyük harf ayrımı yapılmaksızın her yerel dil ayarı altında karşılaştırılabilmeleri için tolower_english() ve toupper_english() sürümlerini hazırlamaz mı hiç? Ancak işin ayrıntılarına inince bu da çözüm sağlamıyor. Lütfen okumaya devam ediniz.</p>
<p>Bu savaşı devam ettirdik ve Türkçe bilmeyen geliştiricileri yola getirdik diyelim. Bu sefer de hem Türkçe hem İngilizce olabilecek olan veri türleri ile ilgili sorunlarımız var. Örneğin bir kullanıcı doğrulama sürecinde ad ve soyad bilgilerini kullandığımızı düşünelim. Küçük ve büyük harf ayrımı da yapmadığımızı düşünelim.</p>
<p>ismail -&gt; İSMAİL (Türkçe bir isim olan İsmail&#8217;in doğal dilinde büyütülmesi)<br />
michael -&gt; MICHAEL (Yabancı bir isim olan Michael&#8217;in doğal dilinde büyütülmesi)</p>
<p>Uygulamanızı kullanan hem Türk hem de yabancı kullanıcılar olduğunu düşünün. Türk olan kullanıcı ismail, İsmail, İSMAİL gibi verileri girecektir. Ancak yabancı olan kullanıcı Michael, MICHAEL olarak girecektir. Buna göre siz hangi dilde küçültme veya büyütme yaparak karşılaştırmaya sokacaksınız? Ülkemizin köklü bankalarından <a href="http://www.isbank.com.tr">İş Bankası</a> bu sorunu i ve ı&#8217;yı aynı harf kategorisine koyarak çözmüş. &#8220;sezai, SEZAİ, sezaı, SEZAI&#8221; bu girdilerin hepsi de Türkçe olan Sezai ismini doğrulamaktadır. Benzer şekilde &#8220;michael, MİCHAEL, MICHAEL, mıchael&#8221; girdilerinin hepsi de yabancı olan Michael ismini doğrulamaktadır. Bu yaklaşım sistemi çalışır duruma getiriyor, günü kurtarıyor olsa da kesinlike doğru çözüm değildir. Yanlış ifadeler doğru gibi kabul edilmektedir.</p>
<p>Ben bu <strong>ı</strong> ve <strong>İ</strong> sorunundan bıkmış durumdayım. Ama ne yazık ki çözüm yolu yok. Türkçe <strong>i</strong> harfini kodlama standardında İngiliz <strong>i</strong> harfinden ayrı tutsak bu sefer şekil olarak aynı oldukları için karışacaklar. Sırf bu sorunu çözmek için alfabemizi de değiştiremeyeceğimize göre bu sorunla yaşamaya devam edeceğiz. Yanlış da olsa İş Bankası&#8217;nın uyguladığı yöntem, sistemi çalışır tutan tek yöntem gibi göründüğü için ben olsam hiç beğenmesem de aynı yöntemi uygulardım.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/07/28/turkce-karakter-sorunlarimiz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

