<?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; Geliştirme</title>
	<atom:link href="http://www.sezaiyilmaz.com/category/gelistirme/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>Juniper SSL-VPN Appliance&#8217;ı SMS Tabanlı OTP İle Güçlendirdik</title>
		<link>http://www.sezaiyilmaz.com/2008/11/09/juniper-ssl-vpn-appliance-sms-tabanli-otp-ile-guclendirdik/</link>
		<comments>http://www.sezaiyilmaz.com/2008/11/09/juniper-ssl-vpn-appliance-sms-tabanli-otp-ile-guclendirdik/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 22:55:34 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Güvenlik]]></category>
		<category><![CDATA[Sistem Yönetimi]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[axis2]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JNDI]]></category>
		<category><![CDATA[juniper networks]]></category>
		<category><![CDATA[LDAP]]></category>
		<category><![CDATA[one time password]]></category>
		<category><![CDATA[OTP]]></category>
		<category><![CDATA[pro-g]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[ssl-vpn]]></category>
		<category><![CDATA[tek kullanımlık şifre]]></category>

		<guid isPermaLink="false">http://www.sezaiyilmaz.com/?p=421</guid>
		<description><![CDATA[Pro-G&#8217;de bir iş fırsatı karşımıza çıktı. Konu, Juniper SSL-VPN Appliance&#8217;ı iki aşamalı kullanıcı doğrulama yeteneğini geliştirdiğimiz özel bir yazılımla cep telefonuna SMS ile gelecek olan OTP (One Time Password / Tek Kullanımlık Şifre) ile güçlendirmek. Java ile geliştirdiğimiz özel uygulama sayesinde Juniper SSL-VPN kutusu kullanan kurumlar artık SMS tabanlı OTP ile SSL-VPN bağlantısını gerçekleştirebilecekler. İşin [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-422 alignleft" title="logo_juniper_thumb" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/11/logo_juniper_thumb.gif" alt="" width="62" height="65" />Pro-G&#8217;de bir iş fırsatı karşımıza çıktı. Konu, Juniper SSL-VPN Appliance&#8217;ı iki aşamalı kullanıcı doğrulama yeteneğini geliştirdiğimiz özel bir yazılımla cep telefonuna SMS ile gelecek olan OTP (One Time Password / Tek Kullanımlık Şifre) ile güçlendirmek. Java ile geliştirdiğimiz özel uygulama sayesinde Juniper SSL-VPN kutusu kullanan kurumlar artık SMS tabanlı OTP ile SSL-VPN bağlantısını gerçekleştirebilecekler.<span id="more-421"></span></p>
<p>İşin teknik ayrıntılarına inecek olursak ilk aşama oturum açma kısmı tamamen kurumun LDAP / Active Directory sunucusuna ait. İkinci aşamada geliştirdiğimiz yazılım devreye giriyor.</p>
<p>İlk aşama başarılı oturum açma bilgisi alınır alınmaz bir OTP üretiliyor ve SMS ile ilk aşama oturumu açmış olan kullanıcının cep telefonuna gönderiliyor. Kullanıcı ikinci aşamada şifre olarak SMS ile gelen OTP&#8217;yi kullanıyor. Yazılımın içinde gömülü olarak çalışan radius sunucusu Juniper SSL-VPN kutusuna ikinci aşama oturum hizmeti veriyor.</p>
<p>Geliştirdiğimiz bu yazılımda radius server işleri için TinyRadius projesini kullandık. SMS gönderimi için ise kurumun sağladığı Web Servislerini AXIS2 projesinin kütüphaneleri yardımıyla kullandık. LDAP sorgulama hizmetleri için JNDI (Java Naming and Directory Interface) kullandık.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/11/09/juniper-ssl-vpn-appliance-sms-tabanli-otp-ile-guclendirdik/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Görsel Şölen Araçları</title>
		<link>http://www.sezaiyilmaz.com/2008/09/07/javada-gorsel-solen-araclari/</link>
		<comments>http://www.sezaiyilmaz.com/2008/09/07/javada-gorsel-solen-araclari/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 23:25:40 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JCalendar]]></category>
		<category><![CDATA[jformdesigner]]></category>
		<category><![CDATA[jgoodies]]></category>
		<category><![CDATA[JOutlookBar]]></category>
		<category><![CDATA[laf]]></category>
		<category><![CDATA[look and feel]]></category>
		<category><![CDATA[profesyonel görünümlü java uygulamaları]]></category>
		<category><![CDATA[swing]]></category>
		<category><![CDATA[swing widgets]]></category>

		<guid isPermaLink="false">http://www.sezaiyilmaz.com/?p=364</guid>
		<description><![CDATA[Bu yazımda Java’da Kullanıcı Arabirimi Tasarımı Püf Noktaları başlıklı yazımda bahsetmiş olduğum profesyonel görünümlü SWING uygulamalarını elde edebilmek için ücretsiz olarak kullanabileceğiniz kütüphanelerden (ing. library) bahsetmek istiyorum. Sizlere tanıtacağım ve şahsen kullanmış olduğum SWING kütüphanelerinin oldukça görsel ve işlevsel olduklarını düşünüyorum. Sırayla bunlara değinelim: JGoodies JGoodies görsel olarak profesyonel SWING uygulamaları geliştirmeniz için Form Layout, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-361" title="java_logo" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/java_logo.png" alt="" width="90" height="90" />Bu yazımda <a title="Java’da Kullanıcı Arabirimi Tasarımı Püf Noktaları için Kalıcı Bağlantı" rel="bookmark" href="../2008/08/25/javada-kullanici-arabirimi-tasarimi-puf-noktalari/">Java’da Kullanıcı Arabirimi Tasarımı Püf Noktaları</a> başlıklı yazımda bahsetmiş olduğum profesyonel görünümlü SWING uygulamalarını elde edebilmek için ücretsiz olarak kullanabileceğiniz kütüphanelerden (ing. library) bahsetmek istiyorum. Sizlere tanıtacağım ve şahsen kullanmış olduğum SWING kütüphanelerinin oldukça görsel ve işlevsel olduklarını düşünüyorum. Sırayla bunlara değinelim:<span id="more-364"></span></p>
<p><strong>JGoodies</strong></p>
<p>JGoodies görsel olarak profesyonel SWING uygulamaları geliştirmeniz için Form Layout, UIF Lite, Looks gibi kütüphaneler sağlamaktadır. Form Layout standart java layoutlarından farklı olarak özellikle bilgi giriş ekranı tasarlamak istediğinizde kullanabileceğiniz oldukça güçlü bir layout manager&#8217;dır. Yatayda ve düşeyde hizalı SWING görselleri kullanmanızı sağlar. UIF Lite aralarında görünmez tutamaçlı Split Pane, Inner Frame, Title, Titled Separator gibi görsellerin bulunduğu ve tasarladığınız arayüzün sade olmasına radımcı olan bazı SWING görselleri sağlar. Looks kütüphanesi ise fontların, SWING görsellerinin, renklerin bir uyum ve ahenk içerisinde olması için bazı Look and Feel&#8217;ler sağlar. JGoodies&#8217;in sitesini incelediğinizde SWING ile profesyonel görünümlü ve doğal hissiyatlı uygulamaların geliştirilmesi için ufkumu nasıl açtığını rahatlıka göreceksiniz.</p>
<p><a href="http://www.jgoodies.com" target="_blank">JGoodies</a><br />
<a href="http://www.jgoodies.com/articles/first%20aid%20for%20swing-75min.pdf" target="_self">First Aids for SWING UIs</a><br />
<a href="http://www.jgoodies.com/articles/efficient%20swing%20design.pdf" target="_blank">Efficient SWING Design</a><br />
<a href="http://www.jgoodies.com/downloads/libraries.html" target="_blank">JGoodies Libraries</a><br />
<a href="http://www.jgoodies.com/downloads/index.html" target="_blank">JGoodies Applications</a></p>
<p><strong>L2FProd Common Components</strong></p>
<p>L2FProd profesyonel görünüme bir adım daha yaklaşabilmeniz için görsel SWING bileşenleri sağlamaktadır. Bu bileşenlerden bazılarını tanırsak; Windows XP explorer pencerelerinin sol tarafındaki gibi bir görünümde link şeklinde düğmeler sağlamak ve açılır kapanır gruplama yapabilmek için JTaskPane, JTaskPaneGroup, JLinkButton görselleri; MS-Outlook&#8217;un sol tarafındaki gibi kayarak açılan paneller üzerindeki düğmeleri sağlayan JOutlookBar; Firefox gibi uygulamalarda benzerlerini görebildiğimiz JButtonBar; JTipOfTheDay penceresi ve daha birçok görsel bileşen sağlar.</p>
<p><a href="http://www.l2fprod.com/common/" target="_blank">L2FProd Common Components</a></p>
<p><strong>HelpGUI</strong></p>
<p>HelpGUI SWING uygulamalarınız için HTML tabanlı yardım belgelerini sunmanız için kullanılan görsel bir araç. Şekil olarak Windows&#8217;un help penceresine oldukça benzemekte. Tüm yardım içeriğini .jar dosyası içine gömebilirsiniz.</p>
<p><a href="http://helpgui.sourceforge.net" target="_blank">HelpGUI</a></p>
<p><strong>JCalendar</strong></p>
<p>Standart Java SWING bileşenleri tarih ve saat seçmenizi sağlayacak bir bileşen içermemekte. JCalendar oldukça başarılı bir tarih &#8211; saat seçme aracı sağlamaktadır.</p>
<p><a href="http://www.toedter.com/en/jcalendar/" target="_blank">JCalendar</a></p>
<p>Bu bileşenlerin oldukça faydasını gördüm. Sizlerin de işine yarayacaklarını düşünüyorum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/09/07/javada-gorsel-solen-araclari/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Kullanıcı Arabirimi Tasarımı Püf Noktaları</title>
		<link>http://www.sezaiyilmaz.com/2008/08/25/javada-kullanici-arabirimi-tasarimi-puf-noktalari/</link>
		<comments>http://www.sezaiyilmaz.com/2008/08/25/javada-kullanici-arabirimi-tasarimi-puf-noktalari/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 11:09:49 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[grafiksel kullanıcı arabirimi]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kullanıcı dostu arayüz geliştirmek]]></category>
		<category><![CDATA[laf]]></category>
		<category><![CDATA[login screen]]></category>
		<category><![CDATA[look and feel]]></category>
		<category><![CDATA[model view controller]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[oturum açma ekranı]]></category>
		<category><![CDATA[progress bar]]></category>
		<category><![CDATA[responsive]]></category>
		<category><![CDATA[rich client]]></category>
		<category><![CDATA[swing]]></category>
		<category><![CDATA[user friendly user interface]]></category>

		<guid isPermaLink="false">http://www.sezaiyilmaz.com/?p=358</guid>
		<description><![CDATA[Bu yazıda java (SWING) ile kullanıcı dostu rich client arabirim tasarımının püf noktalarından bahsedeceğim. Bahsedeceğim konu başlıkları dilden bağımsız olarak tüm arayüz tasarımları için de uyarlanabilirler. Burada bahsedeceğim terimlerde Türkçe&#8217;leri genel geçer bir kabul görmediğinden dolayı doğrudan İngilizce isimleri kullanıyor olacağım. Arayüz Responsive olmalı Grafiksel Kullanıcı Arabirimi (ing. Graphical User Interface) hızlı olmalı, kullanıcı komutlarına [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-361" title="java_logo" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/java_logo.png" alt="" width="72" height="72" />Bu yazıda java (SWING) ile kullanıcı dostu rich client arabirim tasarımının püf noktalarından bahsedeceğim. Bahsedeceğim konu başlıkları dilden bağımsız olarak tüm arayüz tasarımları için de uyarlanabilirler. Burada bahsedeceğim terimlerde Türkçe&#8217;leri genel geçer bir kabul görmediğinden dolayı doğrudan İngilizce isimleri kullanıyor olacağım.<span id="more-358"></span></p>
<h4>Arayüz Responsive olmalı</h4>
<p>Grafiksel Kullanıcı Arabirimi (ing. Graphical User Interface) hızlı olmalı, kullanıcı komutlarına hızlı yanıt vermeli, donup kalmamalıdır. Arayüz multi-threaded bir biçimde geliştirilmelidir. Bir işlem 200 ms&#8217;den uzun sürecekse mutlaka bir progress bar gösterilerek kullanıcıya işlem yapıldığı ve beklemesi gerektiği hissettirilmelidir. İşlem tamamlanana değin arayüzdeki kontrollere dokunması engellenmeli ve fare göstergesi kum saatine dönüştürülmelidir. Bu esnada arka planda kalan ve asıl iş yapan thread görevine devam etmelidir. MVC (Model View Controller) bağlamında arka planda asıl iş yapan thread (model &amp; controller) progress bar&#8217;a (view) sürekli olarak ilerleme bilgisi göndermelidir. Eğer ilerleme durumu belirsiz ise (ing. non-deterministic progress), en azından kaçıncı adımı veya işlemekte olduğu veriyi durum bilgisi olarak progress bar&#8217;a veya üzerindeki label&#8217;lara aktarmalıdır. Bu şekilde kullanıcı uygulamanın donmadığı ve işlem yaptığı konusunda ikna olacaktır. Uzun sürme ihtimali olan her türlü işlemde bu kurallara uyulmalıdır.</p>
<p>Önerilen kodlama şekli ise uzun sürme ihtimali olan her işlem başlangıcında ayrı bir thread ile progress dialog instance&#8217;ı hazırlanması (progress bar içeren bir dialog), otomatik olarak 200 ms sonra belirmesidir. 200 ms&#8217;den daha kısa sürede işlem sonuçlanırsa da progress dialog&#8217;un zamanlayıcısının durdurularak iptal edilmesi ve belirmesinin önüne geçilmesidir.</p>
<p>Bir uygulamanın arayüzünü oluşturan tüm görsel bileşenler (kullanıcının karşısına daha sonra çıkacak olan paneller, sonradan açılacak olan pencereler, &#8230;) uygulama açılışında mutlaka yaratılmalı (ing. instantiate), yerleşimi yapılmalıdır, ancak gösterilmemelidir. JVM&#8217;in ilk kez instance&#8217;ı hazırlanacak olan görsel bir nesneyi hazırlaması oldukça maaliyetli ve uzun sürmektedir. Kullanıcıyı sonradan bekletmektense uygulama açılışında splash screen gösterilirken bir progress bar ile görsel bileşenlerin yüklendiği ve cache&#8217;lendiğine dair bilgi verilmesi ve arka planda bu işlemlerin yapılması daha uygundur. Bu yöntemle geliştirilmiş Java Uygulaması çok daha responsive olacak ve çalışma hızı olarak o platformdaki doğal bir uygulamaya yakınmış gibi hissedilecektir.</p>
<p>JList, JComboBox, JTable mümkünse FixedCellWidth ve FixedCellHeight değerleri önceden hesaplanarak verilmeli ve çizim sırasında yeniden hesaplamanın önüne geçilmesi gerekmektedir. Bu şekilde en az 10 kat daha hızlı JList, JComboBox ve JTable&#8217;a sahip olacak ve çok daha fazla veriyi bu bileşenlerle gösterebileceksiniz.</p>
<p>Bir JList, JComboBox, JTable içindeki JColumn&#8217;larda kullanılan Renderer&#8217;lar her tür için ortak bir instance olmalı. Bu tür görsel bileşenlerin önünde yer alacak olan diğer pencereler, pencerenin yerinin değiştirilmesi, yeniden boyutlandırılması, scrollbar aracılığı ile kaydırılması nedeni ile tekrar tekrar Renderer&#8217;a çizim için başvurulmakta ve her defasında renderer çizim süreci içinde en ufak bir &#8220;new&#8221; çağrısı bulunması durumunda uygulamanın bellek kullanımı zamanla artacak, garbage collector bu hıza yetişemeyecek ve bir süre sonra uygulama cevap veremez hale gelecektir. Bu nedenle Renderer çizim sürecinde kesinlikle &#8220;new&#8221; çağrısı yer almamalı, tüm instance hazırlıkları Renderer&#8217;ın constructor&#8217;unda halledilmelidir. Renderer çizim sürecinde sadece çizilecek olan görselin modelinde yer alan değerlere göre parametrik değişimler yapılarak önceden instance&#8217;ı hazırlanmış bileşenler (metinler, simgeler, kenar çizgileri, zemin renkleri) kullanılmalıdır.</p>
<p>Arayüz&#8217;ün hızlı cevap vermesi için yukarıdaki kurallara uygun bir şekilde öncelikli olarak bir splash screen gösterilmeli, splash screen&#8217;in uygun bir yerinde bir progress bar ve ilerleme açıklamaları içeren bir label gösterilerek arayüzün gösterilme aşamasına kadar yapılan tüm hazırlıklardan kullanıcı bilgilendirilmelidir. Böylece kullanıcı uygulamanın çok hızlı açılmakta olduğunu düşünecektir.</p>
<h4>Fazla çizgilerden kaçınılmalı</h4>
<p>Görsel nesneleri daha kolay erişilebilir ve anlaşılır kılmak için gruplarız. Ancak standart gruplama görsellerimiz genelde gereksiz çizgileri yanlarında getirirler. Bu çizgiler kullanıcının gözünü yormaktadır. Fazla çizgilerden kaçınmak arayüzü daha sade, göz yormayan ve anlaşılır yapacaktır. Aradaki farkı görmek için ekran görüntülerine bakınız.</p>
<h4>Kenar boşluklarından korkmayın</h4>
<p>Pencere ve Dialog&#8217;larda kenar boşlukları eklemekten çekinmeyin. Pencere ve Dialog&#8217;ların kenarlarına çok yakın olan görsel nesneler kullanıcının gözünü yorar. Geniş kenar boşlukları için çok yer kaplar, görsel nesneler için yer kalmaz gibi düşünülse de oldukça farklı ve rahat bir görüntü sunar. Aradaki farkı görmek için ekran görüntülerine bakınız.</p>
<h4>İşletim sisteminin görünüme uyun</h4>
<p>İşletim sisteminin görünümüne uyarak kullanıcının işletim sistemi üzerinde kullanmış olduğu diğer programların renk ahengi, hissiyat, yazı tipi gibi  alıştığı look and feel&#8217;i kullanıcıya sağlayın. Böylece kullanıcı uygulamanıza daha kolay alışacaktır.</p>
<p>Yazı tipi taban çizgisini koruyun. Standart java look and feel&#8217;ı olarak gelen Metal LAF&#8217;ta ComboBox&#8217;lar oldukça yüksek, Button&#8217;lar oldukça alçak, Label&#8217;lar alabildiğine alçak şekilde hazırlanmış. Bu görsellerin yatay kenar çizgileri birbirini tutmamakta, eğri büğrü bir görüntü sunmaktadır.</p>
<h4>Düşey hizalama önemli</h4>
<p>Görsel nesneleri göze hoş görünmesi için düşey olarak hizalamak gerekir. Arayüzdeki her nesne kendi telinden çalarcasına rasgele yerleştirilmiş gibi görünürse zamanla göz yorgunluğuna neden olacaktır.</p>
<table border="0" cellpadding="5">
<tbody>
<tr>
<td><a href="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/personelformu1.png"><img class="size-thumbnail wp-image-359 alignnone" title="personelformu1" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/personelformu1-150x150.png" alt="" width="150" height="150" /></a></td>
<td><strong>Olumsuz Yönler:</strong></p>
<ul>
<li>Label yazı tipleri kalın yazı ile yazılmış, işletim sistemi doğal görüntüsüne uygun değil</li>
<li>Renk ahengi işletim sistemi doğal renk ahenginde değil</li>
<li>JEditBox, JLabel, JComboBox, JButton türlerinin yükseklikleri farklı</li>
<li>Kenar boşluğu bırakılmamış, düğmeler kenarlara yapışık olmuş</li>
<li>Çok fazla çizgi var</li>
<li>Düşeyde hizalı değil</li>
</ul>
</td>
</tr>
<tr>
<td><a href="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/personelformu2.png"><img class="alignnone size-thumbnail wp-image-360" title="personelformu2" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/08/personelformu2-150x150.png" alt="" width="150" height="150" /></a></td>
<td><strong>Olumlu Yönler:</strong></p>
<ul>
<li>Her tür görsel için işletim sistemi standartlarına uygun font seçimi yapılmış</li>
<li>Renk ahengi işletim sistemi ile uyumlu</li>
<li>Görsellerin yükseklikleri aynı</li>
<li>Kenar boşlukları bırakılmış.</li>
<li>Titled Border yerine sade gruplama kullanılmış, fazladan rahatsız edici çizgi yok</li>
<li>Düşey hizalama düzgün</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h4>Oturum açma ekranı tasarımı</h4>
<p>Uygulamaya oturum açma ekranı (ing. login screen) olarak arka planda uygulamanın ana penceresi, önde oturum açma penceresi uygun değildir. Bu stil, henüz oturum açılmamışken uygulamanın yapabilecekleri ile ilgili yabancı kişilere fikir verir. Güvenlik açısından da sakıncalı, görsel olarak da erişilemeyecek görsellerin boş yere gösteriliyor olması da uygun değildir. Bu stilin yerine uygulama çalıştırılır çalıştırılmaz uygulama ana penceresini (ing. main window) göstermek yerine sadece oturum açma ekranı gösterilmesi daha uygundur. Hatta uygulamanın ana penceresinde card layout kullanılarak oturum açma ekranının ana pencere ile aynı boyutta, ayrı bir panel olarak, güzel bir tasarım ile desteklenmesi çok daha profesyonel bir görünüm katacaktır.</p>
<h4>Kısa yol tuşları, bağlam menüsü, araç çubuğu, standart menü kullanımı</h4>
<p>Kullanıcıya uygulamanızı kullanması için ne kadar çok alternatif yol sunarsanız, uygulamanız o kadar kullanıcı dostu olacaktır. Kullanıcı var, fare ile çok oynar; kullanıcı var, sadece menülerle çalışır; kullanıcı var, sadece klavyeyi kullanır. Hepsine hitap edebilmek, hepsi için de kullanıcı dostu olmak anlamına gelirken, sadece bir veya ikisine dikkat etmeniz durumunda kullanıcıların bir bölümü için uygulamanızın kullanıcı dostu olmaması anlamına gelecektir.</p>
<h4>Animasyonlar</h4>
<p>Bir animasyonun süresi bellidir. Genelde animasyon yapmak istendiğinde animasyonun kaç adımda tamamlanacağı veya ne kadar sürede bir yeni bir karenin çiziminin yapılacağı önceden hesaplanır. Sonra da hesaplanmış olan bu süre kadar uyuma ve tekrar uyanıldığında yeni karenin çiziminin gerçekleştirilmesi işlemi yapılmaktadır. Bu yaklaşım oldukça güvenilir ve iyi gibi görünmektedir. Ancak donanımdan donanıma karelerin çizilme süresi ve animasyonun tamamlanma süresi değişmektedir. Çünkü her karenin çizilmesinin de bir maliyeti vardır ve zaman kaybı olarak yansımaktadır. Bu nedenle animasyon yapılırken mutlaka gerçek zaman da hesaba katılmalı, gerekirse bazı kareler atlanarak zamanı gelenlerin çizilmesi sağlanmalıdır.</p>
<p>Bu kurallara uyduğunuz sürece uygulamanız profesyonel ve doğal görünecektir. Kötü nam salmış olan çirkin görünüşlü Java uygulaması izlenimi vermeyecek, doğal görünümde olacak, sanki o platformda çalışan doğal bir uygulama gibi hızlı çalışacaktır. Bu yazıda bahsetmiş olduğum bu kurallara uymanızda yardımcı olacak Look and Feel&#8217;lardan, Layout&#8217;lardan, Standart SWING görselleri dışında ilave SWING görsellerinden ayrı bir yazıda bahsedeceğim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/08/25/javada-kullanici-arabirimi-tasarimi-puf-noktalari/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Statik Kaynak Kod Analizi</title>
		<link>http://www.sezaiyilmaz.com/2008/07/30/statik-kaynak-kod-analizi/</link>
		<comments>http://www.sezaiyilmaz.com/2008/07/30/statik-kaynak-kod-analizi/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 21:06:42 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Güvenlik]]></category>
		<category><![CDATA[Teknoloji]]></category>
		<category><![CDATA[analiz]]></category>
		<category><![CDATA[analysis]]></category>
		<category><![CDATA[findbugs]]></category>
		<category><![CDATA[fortify]]></category>
		<category><![CDATA[kaynak kod]]></category>
		<category><![CDATA[kaynak kod analizi]]></category>
		<category><![CDATA[race condition]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[source code analysis]]></category>
		<category><![CDATA[static]]></category>
		<category><![CDATA[thread]]></category>
		<category><![CDATA[wikipedia]]></category>

		<guid isPermaLink="false">http://sezaiyilmaz.com/?p=85</guid>
		<description><![CDATA[Yazılım geliştirilirken her zaman en önemli unsur yazılımın yapması gereken işi bir an önce yapmasını sağlamak olmuştur. Sağlam, dirençli, dayanıklı, güvenilir ve güvenli yazılımlar geliştirmek ikinci plana atılmaktadır. Bu şekilde yazılım bir an önce faal duruma geçer ve maaliyetini bir an önce sahibine kazandırmaya başlar. Günümüzde geliştirilmekte olan yazılımların büyük çoğunluğu çevrimiçi çalışmaktadır. Her ne [...]]]></description>
			<content:encoded><![CDATA[<p>Yazılım geliştirilirken her zaman en önemli unsur yazılımın yapması gereken işi bir an önce yapmasını sağlamak olmuştur. Sağlam, dirençli, dayanıklı, güvenilir ve güvenli yazılımlar geliştirmek ikinci plana atılmaktadır. Bu şekilde yazılım bir an önce faal duruma geçer ve maaliyetini bir an önce sahibine kazandırmaya başlar.</p>
<p>Günümüzde geliştirilmekte olan yazılımların büyük çoğunluğu çevrimiçi çalışmaktadır. Her ne kadar güvenlik duvarı, saldırı tespit sistemi, saldırı önleme sistemi, uygulama katmanı güvenlik duvarı gibi birçok güvenlik önlemi alsak da, çevrimiçi çalışan yazılımımıza erişmek için açık kapılar bırakmak zorundayız. Bu nedenle yazılımın kendi kendini koruması günümüzdeki olmazsa olmaz ihtiyaçlardandır. Aksi taktirde yazılımımız yapması gereken işi tam olarak yaparken, diğer yandan hiç yapmaması gereken işleri de yapabilir duruma gelebilmektedir. Bu nedenle yazılımların güvenlik ön planda tutularak geliştirilmesi önem kazanmaktadır.<span id="more-85"></span></p>
<p>Bir yazılımın güvenli olup olmadığı birkaç yöntemle test edilebilir. Bilindik numaralar ile çalışma anında kandırılmaya çalışılabilir (penetrasyon testi). Bu yöntem ile bir miktar güvenlik açığı tespit edilerek çözülebilir. Ancak tüm güvenlik açıklarının bu yolla tespit edilmesi mümkün değildir. Peki ya kolayca yeniden oluşturulamayan bir durumla karşılaşıldığında ne olacak? Samanlıkta iğne arar gibi ne olduğunu tam olarak algılayamadığımız sorunun kaynağını aramaya çalışırız. Bu aşamada statik kaynak kod analiz yöntemi kullanılmaktadır.</p>
<p>Statik kaynak kod analizi gözle kod üzerinden geçerek yapılabilir. Ancak bu çok uzun ve zahmetli bir süreç. İşin içinde insan faktörü de olacağı için zamanla yorulan göz ve beyin bir miktar hatayı kaçırmaya başlayacaktır. Statik kaynak kod analizi ile verinin izlediği yol boyunca ne tür kontrollerden geçirildiği, güvenlik açısından sakıncalı bulunan işlevlerin kullanılıp kullanılmadığı, threadler arası race condition gibi durumların söz konusu olup olmadığı, &#8230; gibi birçok açıdan incelenebilmektedir.</p>
<p>Statik kaynak kod analizi yapan araçlar bulunmaktadır. Örneğin açık kaynak kodlu ve özgür bir yazılım olan <a href="http://findbugs.sourceforge.net/">findbugs</a> Java uygulamalarındaki olası hatalı durumları tespit etmekte kullanılmaktadır. Doğrudan java bytecode düzeyinde çalışmaktadır. Güzel sonuçlar üretmekle beraber, yanlış bulguları da oldukça fazladır. Statik Kaynak Kod Analizi teknolojisinin oldukça başlarında yer alan bir araç diyebiliriz.</p>
<p>Statik Kaynak Kod Analizi konusunda birçok özgür ve ticari yazılım olan araç var. Hepsinden tek tek bahsetmem mümkün değil. Ancak <a href="http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis">WikiPedia</a>&#8216;dan oldukça kapsamlı bir liste alınabiliyor. Benim burada bahsetmek istediğim araç, en iyi ve doğru sonuçları üreten, en yakın rakibinden bile 6 &#8211; 12 ay kadar önde giden, yoğun kullanılan programlama dillerinin hemen hemen hepsini de destekleyen, statik kaynak kod analizi sektörünün lideri <a href="http://www.fortify.com">Fortify</a>&#8216;dır.</p>
<p>Fortify ile ilk tanıştığımda kendi geliştirdiğim koddaki bulgularını, önerilerini görünce kendisine hayran oldum. Beni çok şaşırttı ve etkiledi. Statik kaynak kod analizi için kullanmış olduğum uygulamalar arasında en az hatalı ve en kapsamlı sonuç üreten araç Fortify Source Code Analyzer&#8217;dır (Fortify SCA). Tespit edilen hata örneklerle beraber ayrıntılı bir şekilde açıklanmakta, oldukça ayrıntılı bir çözümleme yöntemi de tarif edilmektedir. AuditWorkbench ile kodun sorunlu satırları üzerinde hızlı ve kolay gezinme imkanı sağlamaktadır. Kaynak kodu güvenlik, sağlamlık, kod kalitesi gibi değişik açılardan incelemektedir. Oldukça ayrıntılı geliştirici raporu sunabilmektedir. Developer lisansı ile alındığında Fortify Manager adındaki ürün de Fortify tarafından sağlanmaktadır. Fortify Manager ile projelerinizin trendlerini izleyebilir, hangi projelerinizde ne tür hatalar tespit edilmiş, hangi geliştiriciniz ne tür hatalar yapmış gibi yönetim kadrosunun karar almasını kolaylaştıracak raporları kolayca sunabilmektedir. Gecelik build&#8217;lara ant entegrasyonu sayesinde müdahil olarak düzenli olarak projelerinizin Fortify ile taranması sağlanabilmektedir. Fortify SCA Java, tüm .NET dilleri, ASP.NET, Classic ASP, VB script, VB6, PHP, C, C++, Javascript, PL/SQL, T-SQL, COBOL, XML ve PROPERTIES dosyası olan yapılandırma dosyalarını inceleyebilmektedir. Hem de lisansının aldığı andan itibaren tüm bu dillerdeki kaynak kodlar Windows, Linux, Solaris, AIX, HP-UX platformlarında statik kaynak kod analizine tabi tutulabilmektedir.</p>
<p style="text-align: center;"><a href="http://www.sezaiyilmaz.com/wp-content/uploads/2008/07/fortify_auditworkbench.png"><img class="size-medium wp-image-146 alignnone" title="fortify_auditworkbench" src="http://www.sezaiyilmaz.com/wp-content/uploads/2008/07/fortify_auditworkbench-300x187.png" alt="" width="300" height="187" /></a></p>
<p>Fortify&#8217;ın Türkiye&#8217;deki temsilcisi <a href="http://www.pro-g.com.tr">Pro-G</a>&#8216;dir. Fortify SCA aracı kullanılarak, dış kaynak kullanarak geliştirtmiş olduğunuz yazılımların teslimatındaki kabul testleri kriteri olarak veya kendi öz yazılımlarınızın kullanıma geçmeden önce kaynak kod analizini yaptırmak isterseniz Türkiye&#8217;de Pro-G ile görüşmeniz gerekecek. Yoğun bir şekilde yazılım geliştiriyorsanız Fortify&#8217;a sahip olmak maddi açıdan daha uygun olabilir. Fortify&#8217;a sahip olmak için yine Pro-G ile görüşebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/07/30/statik-kaynak-kod-analizi/feed/</wfw:commentRss>
		<slash:comments>0</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>
		<item>
		<title>Windows&#8217;ta UNIX Gibi Geliştirmenin Sorunları &#8211; mingw</title>
		<link>http://www.sezaiyilmaz.com/2008/07/18/windowsta-unix-gibi-gelistirmenin-sorunlari-mingw/</link>
		<comments>http://www.sezaiyilmaz.com/2008/07/18/windowsta-unix-gibi-gelistirmenin-sorunlari-mingw/#comments</comments>
		<pubDate>Fri, 18 Jul 2008 18:23:02 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[mingw]]></category>
		<category><![CDATA[printf]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[scanf]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://sezaiyilmaz.com/?p=13</guid>
		<description><![CDATA[Önceki yazımda bahsetmiş olduğum şifreleme yazılımını Windows&#8217;ta derledikten sonra çalışma zamanında karşılaştığım bazı problemler ve çözümlerinden bahsetmek istiyorum. Belki sizlerin de işine yarar. Karşılaşmış olduğum bu sorunları; Windows&#8217;ta 64 bit tamsayı gösterimi sorunları, Dosyaların olduğundan kısa okunup kısa yazılması ve Qt ile klasör seçiminin UNIX gibi görünmesi gibi 3 başlık altında toplayabiliriz. Windows&#8217;ta 64 bit [...]]]></description>
			<content:encoded><![CDATA[<p>Önceki yazımda bahsetmiş olduğum şifreleme yazılımını Windows&#8217;ta derledikten sonra çalışma zamanında karşılaştığım bazı problemler ve çözümlerinden bahsetmek istiyorum. Belki sizlerin de işine yarar.</p>
<p>Karşılaşmış olduğum bu sorunları; Windows&#8217;ta 64 bit tamsayı gösterimi sorunları, Dosyaların olduğundan kısa okunup kısa yazılması ve Qt ile klasör seçiminin UNIX gibi görünmesi gibi 3 başlık altında toplayabiliriz.<span id="more-13"></span></p>
<ul>
<li><strong>Windows&#8217;ta 64 bit tamsayı gösterimi sorunları.</strong><br />
Şifreleme yazılımında 64 bit olması gereken sayısal bir değeri standart olması (c89) için &#8220;<strong>long long</strong>&#8221; türünde tanımlamış ve kullanmıştım. Bu değerin görüntülenmesi için snprintf&#8217;e format string&#8217;i olarak &#8220;<strong>%lld</strong>&#8221; vermiştim. Linux&#8217;te gayet güzel çalışıyordu. Windows&#8217;ta da sorunsuz derlendi. Ancak çalışma anına gelince değer 2 milyarın üzerine çıktıktan bir süre sonra negatife dönüştü.</p>
<p>Yaptığım araştırmalar sonucunda &#8220;<strong>long long</strong>&#8221; türü 64 bit olarak c89 standardında tariflenmiş. Bu standarda Microsoft da uymuş. Ama bu &#8220;<strong>long long</strong>&#8220;un bir &#8220;<strong>*printf</strong>&#8221; ve &#8220;<strong>*scanf</strong>&#8221; işlevlerinde kullanılabilecek bir format string&#8217;i standarda bağlanmamış. Microsoft da kendisi &#8220;<strong>%I64d</strong>&#8221; biçiminde bir format kullanmış. c99 standarı yayınlandığında &#8220;<strong>%lld</strong>&#8221; format string&#8217;i &#8220;<strong>long long</strong>&#8221; türü için format string&#8217;i olduğu kabul edilmiş. Buna herkes uyarken Microsoft eskiye dönük uyumlu olmayı ve nasıl olsa bu işi yapan bir format string&#8217;im var mantığı ile &#8220;<strong>%I64d</strong>&#8221; format string&#8217;ini kullanmaya devam ederek yeni standarda uymamış.</p>
<p>Özet olarak Windows&#8217;taki &#8220;<strong>*printf</strong>&#8221; ve &#8220;<strong>*scanf</strong>&#8221; işlevlerinde 64 bit bitlik &#8220;<strong>long long</strong>&#8221; türünü kullanmak istediğinizde format string&#8217;ine dikkat etmek gerekir.</li>
<li><strong>Dosyaların olduğundan kısa okunup kısa yazılması.</strong><br />
Linux&#8217;te geliştirmiş olduğum uygulamalarda dosyaları hep &#8220;<strong>open()</strong>&#8221; işlevi ile açarım. Windows&#8217;ta da aynı &#8220;<strong>open()</strong>&#8221; işlevini kullandığımda dosyalar aynı şekilde açılıyor. Ancak &#8220;<strong>read()</strong>&#8221; ve &#8220;<strong>write()</strong>&#8221; işlevlerinde bazı dosyalarda hata alınıyor. Sorunun sadece binary dosyalarla ilgili olduğunu keşfedince, Windows ortamındaki &#8220;<strong>open()</strong>&#8221; işlevinin &#8220;<strong>O_BINARY</strong>&#8221; bayrağının kurulu olması zorunluluğu olduğunu, bu bayrağın kurulmazsa binary dosyalarda sorun çıkartacağı belirtilmiş. &#8220;<strong>O_BINARY</strong>&#8221; bayrağını kurarak &#8220;<strong>open()</strong>&#8221; işlevi ile dosya açtığımda &#8220;<strong>read()</strong>&#8221; ve &#8220;<strong>write()</strong>&#8221; işlevleri aynı Linux&#8217;teki gibi davrandılar. Windows&#8217;ta &#8220;<strong>open()</strong>&#8221; sırasında &#8220;<strong>O_BINARY</strong>&#8221; bayrağını kurmayı unutmamak gerek.</li>
<li><strong>Qt ile klasör seçiminin UNIX gibi görünmesi.</strong><br />
Qt ile klasör seçim penceresini açtıktan sonra döndürdüğü değer kullanıcının seçtiği klasörün tam yoludur (ing. absolute path). Ancak tüm klasör ayıraçları &#8220;<strong>\</strong>&#8221; yerine sanki UNIX sistemiymiş gibi &#8220;<strong>/</strong>&#8221; şeklindeydi. Buna parametrik bir çözüm bulamadım ve tüm &#8220;<strong>/</strong>&#8220;ları &#8220;<strong>\</strong>&#8220;a dönüştürerek kullandım.</li>
</ul>
<p>Buna benzer başka sorunlarla karşılaştıkça yazmaya çalışacağım. Dikkatli olmak gerek. Windows ortamı standart dışı bir ortam. Microsoft&#8217;un standartlara uymak yerine kendi kafasına göre değişik uygulamaları var. Bir gün sizin de karşınıza çıkabilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/07/18/windowsta-unix-gibi-gelistirmenin-sorunlari-mingw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UNIX&#8217;çi Birisi İçin Windows&#8217;ta Uygulama Geliştirme</title>
		<link>http://www.sezaiyilmaz.com/2008/07/12/unixci-birisi-icin-windowsta-uygulama-gelistirme/</link>
		<comments>http://www.sezaiyilmaz.com/2008/07/12/unixci-birisi-icin-windowsta-uygulama-gelistirme/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 12:34:05 +0000</pubDate>
		<dc:creator>Sezai YILMAZ</dc:creator>
				<category><![CDATA[Geliştirme]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[AES]]></category>
		<category><![CDATA[mingw]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://sezaiyilmaz.com/?p=6</guid>
		<description><![CDATA[Geçenlerde Pro-G olarak bir iş aldık. AES-256-CBC algoritması ile simetrik şifreleme ve şifrelenmişi geri açma yazılımı. Müşteri PGP ve asimetrik şifreleme ile bu işi yaptıklarında bir DVD boyundaki verinin donanımdan donanıma fark etmekle birlikte 10-24 saat arasında sürdüğünden şikayet ediyordu. Bu uzun sürecin iş süreçlerini yavaşlattığından yakınıyordu. OpenSSL ile yaptığımız teorik testlerde 1 DVD boyutundaki [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://sezaiyilmaz.com/wp-content/uploads/2008/07/encrypter.png"><img class="size-thumbnail wp-image-7 alignleft" title="Encrypter" src="http://sezaiyilmaz.com/wp-content/uploads/2008/07/encrypter-150x150.png" alt="" width="150" height="150" /></a></p>
<p>Geçenlerde <a href="http://www.pro-g.com.tr/">Pro-G</a> olarak bir iş aldık. AES-256-CBC algoritması ile simetrik şifreleme ve şifrelenmişi geri açma yazılımı.</p>
<p>Müşteri PGP ve asimetrik şifreleme ile bu işi yaptıklarında bir DVD boyundaki verinin donanımdan donanıma fark etmekle birlikte 10-24 saat arasında sürdüğünden şikayet ediyordu. Bu uzun sürecin iş süreçlerini yavaşlattığından yakınıyordu.</p>
<p>OpenSSL ile yaptığımız teorik testlerde 1 DVD boyutundaki veri AES-256-CBC ile yaklaşık olarak 7-20 dakika arasında değişen bir sürede şifreleniyor veya şifrelenmiş veri açılabiliyordu. Bu sürede kullanılan donanım, ortalama dosya büyüklükleri gibi etkenler önemli rol oynuyordu.<span id="more-6"></span></p>
<p>İşi resmi olarak aldıktan sonra kendisine verilen bir klasörü belirtilen türde dosyalar için tarayan ve hedef klasöre aynı hiyerarşide şifrelenmişini veya şifreli ise açılmışını oluşturabilecek, openssl&#8217;in crypto kütüphanesini kullanan özel bir kütüphane geliştirdim. Tabii ki Linux ortamında. <img src='http://www.sezaiyilmaz.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hazırladığım test çalıştırılabilirleri ile yaptığım testlerde sürelerin aynen openssl&#8217;in komut satırından kullandığımda elde ettiğim süreler ile örtüştüğünü teyid ettim.</p>
<p>Sıra geldi müşterinin kullanabileceği görsellere. Kendim ezelden beri UNIX adamı olduğum için Windows ortamındaki geliştirme araçları ve teknolojileri bana oldukça uzak gelmekte. Bu nedenle platform bağımsız (ing. cross-platform) derlenerek, ilgili hedef sistemde doğal olarak (ing. native) çalışabilecek, ancak ana geliştirme ortamının Linux olacağı bir çözüme ihtiyacım vardı.</p>
<p>GTK ve Qt arasında gidip geldim. Qt ve python ile geliştiren <a href="http://www.ly.com.tr/">Likya</a>&#8216;lı arkadaşlarım olması nedeni ile Qt&#8217;de daha hızlı başlangıç yapabileceğime ve C++&#8217;ın avantajlarından yararlanabileceğime karar vererek Qt&#8217;yi kurcalamaya başladım. Hız artırmak için Likya&#8217;lı Mustafa kardeşimden randevu aldım. Kendisi de beni kırmayıp qt-designer ile GUI oluşturulduktan sonra nasıl C++&#8217;a çevrilir, nasıl bir proje haline getirilir konusunda 2-3 saatlik bir vaktini bana harcadı. Kendisine çok teşekkür ederim.</p>
<p>Zaman içinde proje tamamiyle GUI olarak kullanılabilir duruma gelince sıra geldi Windows ortamında derlemeye. Windows sanal makinama mingw, g++, Qt kurulumu gerçekleştirdim. Linux&#8217;te geliştirmiş olduğum GUI programım aynı Linux&#8217;teki gibi başarıyla derlendi ve çalıştı. Hem de aynı Linux&#8217;teki gibi &#8220;make&#8221; ile. Tabii ki Windows&#8217;a özgü bazı davranış bozuklukları ve API değişiklikleri oldu. Onları da zaman içinde yaşadıkça çözdüm. Her birisi ayrı bir gönderi konusu olabilir. Vakit bulabilirsem onlardan da bahsederim.</p>
<p>Ancak benim vurgulamak istediğim UNIX&#8217;ci birisi içim Windows ortamında uygulama geliştirmek oldukça zor. Eliniz kolunuz bağlı kalıyor. Bu nedenle UNIX benzeri bir ortamın cygwin, mingw gibi araçlarla MS-Windows ortamında da sağlanıyor olması, GTK ve Qt gibi platformlar arası taşınmış görsel kütüphanelerin bulunuyor olması benim gibi UNIX adamlarının Windows üstünde de işlevsel olmasına oldukça yüksek katkısı oluyor.</p>
<p>Özet olarak şifreleme yazılımı Windows üstünde çalışıyor olmasına rağmen vi, make, g++, openssl ve Qt kullanılarak geliştirilmiş oldu. En güzel yanı da aynı yazılımı aynı görsellik ve işlevsellik ile Linux, Mac OSX, Solaris, AIX gibi sürümlerini de doğal olarak sağlayabiliyor olmak.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sezaiyilmaz.com/2008/07/12/unixci-birisi-icin-windowsta-uygulama-gelistirme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

