<?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>Bilgisayar Kavramları &#187; Uncategorized</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Birliktelik Kurallarının Pay Ölçümleri (Interest Measures for Association Rules)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/09/09/birliktelik-kurallarinin-pay-olcumleri-interest-measures-for-association-rules/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/09/09/birliktelik-kurallarinin-pay-olcumleri-interest-measures-for-association-rules/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 07:20:27 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/09/09/birliktelik-kurallarinin-pay-olcumleri-interest-measures-for-association-rules/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Yapay zeka çalışmalarında kullanılan araçlardan birisi de, veri ve veri kümeleri arasındaki birliktelik kurallarının (munasebet kurallarının, association rule) belirlenmesidir. Özellikle büyük veri tabanı (very large database, VLDB) çalışmalarından çıkan, münasebetlerin tespiti problemi için çeşitli yöntemler ortaya atılmıştır. Yöntemlerin detayına geçmeden önce problemi daha iyi tanıyabilmek için bir örnek verelim. Örneğin [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Yapay zeka çalışmalarında kullanılan araçlardan birisi de, veri ve veri kümeleri arasındaki birliktelik kurallarının (munasebet kurallarının, association rule) belirlenmesidir. Özellikle büyük veri tabanı (very large database, VLDB) çalışmalarından çıkan, münasebetlerin tespiti problemi için çeşitli yöntemler ortaya atılmıştır. Yöntemlerin detayına geçmeden önce problemi daha iyi tanıyabilmek için bir örnek verelim.
</p>
<p>Örneğin bir süper markette çay ve çay kaşığı satın alan müşterilerin çoğu, şeker de satın alıyorsa, bu durum bir kampanya oluşturmak için yeterli bilgiyi sağlayabilir. Ürünlerin satışı arasındaki münasebetin bulunmasında kullanılan bu yöntemler, örneğin bir bilgisayar ağındaki saldırıların tespiti için veya biyobilgi (bioinformatics) çalışmalarında veya web sayaflarının münasebetinin belirlenmesinde kullanılabilir.
</p>
<p>Birlikteliğin çıkarılmasında kullanılan algoritmalardan bazıları aşağıdaki şekilde sıralanabilir:
</p>
<ul>
<li>Apriori algoritması , bilinen en iyi algoritmalardan birisidir. <a href="http://www.bilgisayarkavramlari.com/2008/11/13/sig-oncelikli-arama-breadth-first-search/">Sığ öncelikli arama (breadth first search)</a> yaklaşımını kullanır. Ayrıca kendisine münhasır bir aday üretim fonksiyonu bulunmaktadır ki, arama miktarını oldukça azaltmaktadır.
</li>
<li>Eclat Algoritması, arama kümelerinin kesişimlerinden istifade ederek <a href="http://www.bilgisayarkavramlari.com/2008/11/13/derin-oncelikli-arama-depth-first-search/">derin öncelikli arama (depth first search)</a> yolunu takip eder.
</li>
<li>Frequent Pattern Algoritması ( Sık Örüntü Algoritması), apriori algoritmasına alternatif olarak, sık veri tekrarı olması durumunda önerilmiştir. Kendisine münhasır bir fp-tree ( sıklıkların tutulduğu bir ağaç yapısı) kullanmaktadır ve parçala fethet (divide and conquere) yaklaşımını takip eder.
</li>
</ul>
<p><strong>Münasebet Yöntemlerinde kullanılan ölçümler<br />
</strong></p>
<p>Yukarıda sayılan ve sayılamayan algoritmaların sonucu olarak çıkan, veriler arasındaki münasebetlerin, dorğu bir şekilde karşılaştırılabilemesi için çeşitli ölçü yöntemleri geliştirilmiştir.
</p>
<p>Bu yöntemler aşağıdaki şekilde sıralanabilir:
</p>
<p><strong>Kapsam (Coverage)<br />
</strong></p>
<p>Bazı kaynaklarda mukaddem destek veya önden gelen destek (antecedent support) olarak da geçmektedir. X-&gt;Y şeklindeki bir kuralın nekadar sıklıkta, veri tabanı üzerinde uygulabilir olduğunu ölçmektedir
</p>
<p>Basitçe verilen X değerinin desteğine veya olasılık değerine eşittir
</p>
<p>Coverage(X-&gt;Y) = supp (X) = P(X)
</p>
<p>Olarak hesaplabilir. Diğer hesaplama yöntemlerine temel teşkil etmektedir.
</p>
<p><strong>All-Confidence (Tam İtimat),</strong> eleman kümesi (itemset) Z&#8217;den üretilebilen bütün kuralların en az bir itimat desteğinin tam-itimat(Z)&#8217;de bulunması durumudur.
</p>
<p>Bu ölçü yöntemi için aşağıdaki formül kullanılabilir
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/090911_0720_Birliktelik1.png" alt=""/>
	</p>
<p>Yukarıdaki formülde bulunan max(support(z elemof Z)) değeri, Z içindeki en yüksek desteğe sahip olan elemana işaret etmektedir. Supp(Z) değeri ise bir önceki ölçüm birimi olan ve yukarda anlatılan kapsam hesaplamasıdır.
</p>
<p><strong>Collective Strength (Müşterek Kuvvet</strong>), ölçümü için aşağıdaki formül kullanılabilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/090911_0720_Birliktelik2.png" alt=""/>
	</p>
<p>Yukarıdaki formülde geçen v(Z) gösterimi, ihlal değerini (violation) verirken, E[] gösterimi ise beklendik değeri (expected value) belirtmektedir.
</p>
<p>Müşterek kuvvet değeri, sıfır ile sonsuz arasındaki bir pozitif değeri taşıyabilir. Bu değerin 0 olması, elemanlar arasında negatif <a href="http://www.bilgisayarkavramlari.com/2008/12/29/kovaryans-ve-korelasyon-covariance-correlation/">ilişki bulunmasına (correlation)</a> ve sonsuz ise pozitif ilişki bulunmasına işaret eder. Müşterek kuvvet değerinin bir ölçü olarak kullanıldığı yerlerde, şayet veri kümesindeki değerlerin, orta ve düşük ihtimallerinin Z kümesinde yer almayan ve gözlemlenen değerlerinin, beklenen değerlerini (expected values) ihlal etmesi halinin, sayıca yüksek olması durumunda, müşterek kuvvet değeri 1&#8242;e yakın çıkmaktadır.
</p>
<p><strong>Conviction (Kanaat)<br />
</strong></p>
<p>Aşağıdaki şekilde hesaplanabilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/090911_0720_Birliktelik3.png" alt=""/>
	</p>
<p>Kanaat, değeri itimat ölçümüne alternatif olarak geliştirilmiştir. Kanaat değeri hesaplanırken, X elemanlarının, Y elemanı olmaksızın görülme olasılıkları hesaplanır; şayet X ve Y görülme frekansları bağlı ise, X&#8217;in Y&#8217;den bağımsız olarak görülme olasılığı hesaplanır.
</p>
<p>Bu anlamda, kanaat değeri ilgi değerine (lift, aşağıda anlatılacaktır), benzemektedir. Ancak ilgi değeri, yönlü bir ölçüm olup ardışık bilgileri değerlendirmede kullanılamaz.
</p>
<p>Leverage (Manivela, Kaldıraç)
</p>
<p>Manivela yöntemi, X ve Y&#8217;nin birlikte bulunmaları arasındaki farkı ölçmektedir ve X ve Y değerlerinn istatistiksel olarak bağı olması halini hesaplamaktadır.
</p>
<p>Manivela(X<span style="font-family:Wingdings">à</span>Y) = P(X ve Y )  &#8211; (P(X)P(Y))
</p>
<p>Olarak hesaplanabilir.
</p>
<p>Daha kolay anlaşılabilmesi için, bir satış verisi üzerinde X ve Y ürünlerinin beraber satılmasının X ve Y&#8217;nin ayrı ayrı satılmasından ne kadar fazla olduğunu bulmak olarak düşünebiliriz.
</p>
<p><strong>İlgi (interest)<br />
</strong></p>
<p>Bazı kaynaklarda kaldırmak anlamında da (lift) kullanılmakta olup X ve Y&#8217;nin istatistiksel olarak bağımsız olması halinde, ne kadar birlikte geçtiklerini bulmaktadır.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/090911_0720_Birliktelik4.png" alt=""/>
	</p>
<p>Dikkat edilirse, yukarıdaki formül, bir önceki manivela değerinin hesabına benzemektedir. Tek farkı, manivela ölçümünde fark alınırken burada bölme işlemi kullanılmasıdır. Yani ilgi değeri oransal bir sonuç çıkarır.</p>

<p class="sayac_bilgi">146 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/09/09/birliktelik-kurallarinin-pay-olcumleri-interest-measures-for-association-rules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atlamalı Liste (Skip List)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/07/03/atlamali-liste-skip-list/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/07/03/atlamali-liste-skip-list/#comments</comments>
		<pubDate>Sun, 03 Jul 2011 19:07:20 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/07/03/atlamali-liste-skip-list/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde, özellikle veri yapısı (data structures) konusunda kullanılan bir yöntemdir. Basitçe bir bağlı listeye (linked list) erişimi hızlandırmak amacıyla, listenin üzerinde bir fihrist (index) oluşturmayı hedefler. Örnek olarak kullanacağımız sayılar aşağıdaki şekilde verilmiş olsun : 2,7,15,37,43,98,123,155 Bu sayıları tutan ve hızlı bir şekilde arama yapan veri yapısını geliştirmek istiyoruz. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bilgisayar bilimlerinde, özellikle veri yapısı (data structures) konusunda kullanılan bir yöntemdir. Basitçe bir <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listeye (linked list)</a> erişimi hızlandırmak amacıyla, listenin üzerinde bir fihrist (index) oluşturmayı hedefler.
</p>
<p>Örnek olarak kullanacağımız sayılar aşağıdaki şekilde verilmiş olsun :
</p>
<p>2,7,15,37,43,98,123,155
</p>
<p>Bu sayıları tutan ve hızlı bir şekilde arama yapan veri yapısını geliştirmek istiyoruz. Örneğin bu sayıları bir dizi üzerinde tutabiliriz. Dizi üzerinde tutulması halinde <a href="http://www.bilgisayarkavramlari.com/2009/12/21/ikili-arama-algoritmasi-binary-search-algorithm/">ikili arama algoritması (binary search</a>) kullanılarak ardışık erişime göre (sequential access) daha hızlı erişim sağlanabilir.
</p>
<div>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width:37px"/>
<col style="width:28px"/>
<col style="width:38px"/>
<col style="width:29px"/>
<col style="width:29px"/>
<col style="width:29px"/>
<col style="width:38px"/>
<col style="width:38px"/></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  solid 0.5pt; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>2</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>7</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>15</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>37</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>43</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>98</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>123</p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid 0.5pt; border-left:  none; border-bottom:  solid 0.5pt; border-right:  solid 0.5pt">
<p>155</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>
 </p>
<p>Ancak yukarıdaki şekilde bir dizinin (array) kullanılması halinde, silme işlemleri problem oluşturmaktadır. Örneğin 7 sayısını diziden sildiğimiz zaman bütün dizinin kaydırılması gerekebilir.
</p>
<p>Alternatif olarak bir bağlı liste üzerinde veriler tutulabilir. Örneğin aşağıdaki şekilde bir bağlı listemiz bulunsun:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList1.png" alt=""/>
	</p>
<p>Yukarıdaki şekilde verilmiş olan sıralı bir listeyi ele alalım. Bu liste üzerinde arama yapmak için klasik olarak <a href="http://www.bilgisayarkavramlari.com/2008/11/09/dogrusal-arama-linear-search/">ardışık arama (linear search)</a> kullanılabilir.  Bu durumda da listenin sonudaki elemana erişmek için bütün listenin dolaşılması gerekecektir. Erişim zamanı uzamaktadır.
</p>
<p>Diğer bir alternatif ise sayılardan bir kısmını bir ağaç şeklinde listeye kolay erişim için tutmak olabilir. Ağaç kullanımı bağlı listeye göre avantajlı olmakla birlikte, silme işleminin karmaşıklığı yüksektir. (detaylı bilgi için örneğin <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-arama-agaci-binary-search-tree/">ikili arama ağacı başlıklı konuyu</a> okuyabilirsiniz).
</p>
<p>Çözüm olarak atlamalı listeyi (skip list) inceleyelim. Öncelikle bilmemiz gerekir ki bu liste yapısı tesadüfi özelliktedir. Yani hangi sayıların daha üst seviyede bulunacağı tesadüfen belirlenir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList2.png" alt=""/>
	</p>
<p>Yukarıdaki şekilde, ikinci bir bağlı liste oluşturulmuştur. Oluşturlan ikinci bağlı liste, orjinal listenin elemanlarından bazılarını içermekte olup, bazı elemanları atlamaktadır.
</p>
<p>Aslında yukarıdaki listenin tam olarak yorumlanmasını ikili düğümler olarak yapmak gerekir. Diğer bir deyişle bütün düğümlerden tek <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> çıkıp sıradaki düğümü işaret ederken, bazı düğümlerden çift gösterici çıkmaktadır. Örneğin 37 değerini taşıyan düğümden çıkan bir gösterici 43 düğümünü gösterirken diğeri 123 düğümünü göstermektedir.
</p>
<p>Yapıyı daha iyi anlayabilmek bir sayının aranmasını adım adım inceleyelim. Örneğin 43 sayısını, yukarıdaki liste yapısını kullanarak aradığımızı düşünelim.
</p>
<p>Öncelikle yukarıdaki listede bir seyyar (iterator) çıkarak listedeki sayıları dolaşmaya başlar. Seyyar yapımızda çift <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">gösterici (pointer)</a> tutuyoruz ve göstericilerden birisi arkadan geliyor. Bunun sebebi aranan değerin hangi aralıkta olduğunu bulmak. Diğer bir deyişle bağlı liste tek yönlü olduğu ve aradığımız değerden büyük bir değer bulduğumuzda geri döenemediğimiz için son geldiğimiz düğüme bir gösterici bırakıyoruz.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList3.png" alt=""/>
	</p>
<p>Öncelikle üst seviyedeki liste üzerinde arama işlemine başlıyoruz. Aranan sayı 43 ve şu anda seyyar değerimiz 7&#8242;yi göstermekte, sonraki düğüme ilerliyoruz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList4.png" alt=""/>
	</p>
<p>Aranan değer 43 ve şu anda bakılan değer 37, aradığımız değer hala daha büyük.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList5.png" alt=""/>
	</p>
<p>İki göstericimiz de ilerletiliyor ve bu aşamada duruyoruz. Sebebi aradığımız değerden daha büyük bir değer bulmuş olmamız (123 &gt; 43). Dolayısıyla aradığımız sayının hangi aralıklta olduğunu biliyoruz ve listedeki bir alt seviyeye geçiyoruz.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList6.png" alt=""/>
	</p>
<p>Seyyar göstericisinin, 37 düğümündeki alt seviyeden devam etmesi sonucunda, sıradaki ilk düğüm olan 43 bulunur ve aradığımız değere ulaşmış oluruz.
</p>
<p>Yukarıdaki atlamalı liste yapısını bir adım daha ilerleterek bir seviye daha yükseltebiliriz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/070311_1906_AtlamalList7.png" alt=""/>
	</p>
<p>Örneğin yukarıdaki temsili resimde, 37 düğümü 3 sevilelidir (3 gösterici çıkmaktadır). Bu durumda arama işlemi önce buradan başlayacak (örneğin 43&#8242;ü aradığımızı düşünelim) ardından 37&#8242;nin sonraki değeri NULL olduğu için alt seviyeye geçilecek (çünkü 43, 37&#8242;den büyüktür). Ardından ikinci seviyeye iniliecek ve 37&#8242;nin sonraki değerine bakılacak, Bu değer 123 olduğu için ve 43 sayısı 37 ile 123 arasında olduğu için yine bir alt seviyeye inilecek ve sonunda 43 değeri bulunacaktır.
</p>
<p>Düğümlerin neye göre seçildiğine gelince. Öncelikle en alt seviyedeki düğümlerden bazıları rast gele olarak seçilir ve bir üst seviyeye çıkarılır (2. Seviye). Sonra 2. seviyede bulunan düğümlerden bazıları rast gele olarak seçilip bir üst seviyeye çıkarılır. Ve bu işlem istenilen seviye kadar devam eder.</p>

<p class="sayac_bilgi">195 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/07/03/atlamali-liste-skip-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mahalanobis Mesafesi (Mahalanobis distance)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/06/23/mahalanobis-mesafesi-mahalanobis-distance/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/06/23/mahalanobis-mesafesi-mahalanobis-distance/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 09:00:48 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/06/23/mahalanobis-mesafesi-mahalanobis-distance/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Başta istatistik olmak üzere, aralarında bilgisayar bilimlerinin de bulunduğu pek çok alanda kullanılan bir mesafe ölçüm sistemidir. Diğer ölçüm sistemlerinden en belirgin farkı, mesafe ayırımını elipsel bir düzlem üzerinde yapmasıdır. Basit bir elipsi ele alırsak: Elipsin x eksenindeki genişliği, y eksenindeki boyuna göre daha kısadır. Bu durumda elips üzerinde dağılmış [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Başta istatistik olmak üzere, aralarında bilgisayar bilimlerinin de bulunduğu pek çok alanda kullanılan bir mesafe ölçüm sistemidir. Diğer ölçüm sistemlerinden en belirgin farkı, mesafe ayırımını elipsel bir düzlem üzerinde yapmasıdır. Basit bir elipsi ele alırsak:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis11.png" alt=""/>
	</p>
<p>Elipsin x eksenindeki genişliği, y eksenindeki boyuna göre daha kısadır. Bu durumda elips üzerinde dağılmış olan noktaların da aralarındaki mesafe göreceli olarak daha farklı değerlendirilmelidir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis21.png" alt=""/>
	</p>
<p>Örneğin yukarıdaki şekilde verilen a ve b uzaklıkları arasındaki <a href="http://www.bilgisayarkavramlari.com/2007/11/24/oklit-mesafesi-euclidean-distance-euclidean-metric/">öklit mesafesi (euclidean distance)</a> aynı olmasına karşılık mahalanobis mesafesi farklı olmaktadır. Bunun sebebi elipsin boyu ve eni arasındaki boyut farkıdır.
</p>
<p>Buradaki en ve boy farkını iki stokastik sürecin <a href="http://www.bilgisayarkavramlari.com/2008/12/29/kovaryans-ve-korelasyon-covariance-correlation/">kovaryansı (covariance)</a> olarak düşünmek de mümkündür. Örneğin bir şirketteki çalışanların maaşları ve yaşları iki boyutlu uzayda gösterilmek istensin. Bu durumda yaşlar arasındaki mesafe ile (örneğin 5 yaş fark olması durumu) maaşlar arasındaki fark (örneğin 500 lira fark olması durumu) aynı cinsten değildir. Örnekte görüldüğü üzere, maaşlar çok daha yüksek değerlerle mesafe belirtmektedir.
</p>
<p>Mahalanobis, bu mesafe farkını çok değişkenli bir vektör için, aşağıdaki şekilde tanımlar:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis31.png" alt=""/>şeklinde verilen n adet değişkenden oluşan bir vektörün ortalama değerleri (mean) için <img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis41.png" alt=""/>gösterimi kullanılıyor olsun. Ayrıca <a href="http://www.bilgisayarkavramlari.com/2008/12/29/kovaryans-matrisi-covariance-matrix/">kovaryans matrisi olakara (covariance matrix)</a> S gösterimi kullanılıyor olsun. Bu durumda mahalanobis mesafesi aşağıdaki şekilde hesaplanır:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis51.png" alt=""/>
	</p>
<p>Buna göre mahalanobis mesafesi, değer vektörü ile ortalamaların farkının, kovaryans matrisinin tersi ve yine değer vektörü ile ortalamaların farkının tersyüzünün (transpose) çarpımlarının karekökü olarak hesaplanır. Bu durum ise aşağıdaki formül ile özetlenebilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis6.png" alt=""/>
	</p>
<p>Yukarıdaki formülü iki örnek için hesaplayacak olursak (örneğin yukarıdaki elips çiziminde bulunan iki değeri düşünelim):
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis7.png" alt=""/>
	</p>
<p>Ayrıca kovaryans matrisinin köşegen matrisi olması halinde(diagonal matrix), formül aşağıdaki şekilde sadeleştirilebilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis8.png" alt=""/>
	</p>
<p>
 </p>
<p>Ayrıca mahalanobis mesafesinin, diğer mesafeler ile benzerliğinin anlaşılması açısından, aşağıdaki şekil açıklayıcı olacaktır:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/062311_0900_Mahalanobis9.png" alt=""/>
	</p>
<p>
 </p>

<p class="sayac_bilgi">265 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/06/23/mahalanobis-mesafesi-mahalanobis-distance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programların Çalışma Süresi</title>
		<link>http://www.bilgisayarkavramlari.com/2011/02/02/programlarin-calisma-suresi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/02/02/programlarin-calisma-suresi/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 09:13:49 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/02/02/programlarin-calisma-suresi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, bilgisayarda yazılan bir kodun, derlendikten sonra bilgisayarda çalışması için geçen zamanın nasıl hesaplandığını açıklamaktır. Bu yazıyı okumadan önce, aşağıdaki yazıların okunması faydalı olacaktır: İşlemci Zamanlama (CPU Scheduling) İşlemci Zamanları (CPU Timing) İşlemci Meşguliyeti (CPU Utilization) Çok sayıda kod yazıyor ve bu kodları bilgisayarımızda çalıştırıyoruz. Bir programın çalışma [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, bilgisayarda yazılan bir kodun, derlendikten sonra bilgisayarda çalışması için geçen zamanın nasıl hesaplandığını açıklamaktır.
</p>
<p>Bu yazıyı okumadan önce, aşağıdaki yazıların okunması faydalı olacaktır:
</p>
<ul>
<li><a href="http://www.bilgisayarkavramlari.com/2008/11/19/islemci-zamanlama-cpu-scheduling/">İşlemci Zamanlama (CPU Scheduling)</a>
		</li>
<li><a href="http://www.bilgisayarkavramlari.com/2010/03/20/islemci-zamanlari-cpu-timing/">İşlemci Zamanları (CPU Timing)</a>
		</li>
<li><a href="http://www.bilgisayarkavramlari.com/2009/04/19/cpu-utilization-mib-mesguliyeti/">İşlemci Meşguliyeti (CPU Utilization)</a>
		</li>
</ul>
<p>Çok sayıda kod yazıyor ve bu kodları bilgisayarımızda çalıştırıyoruz. Bir programın çalışma süresini bulabilmek için, hemen her dilde bulunan zaman fonksiyonları kullanılabilir. Örneğin aşağıdaki yazıda C dili ile bir programın çalışma süresinin hesaplanması anlatılmıştır:
</p>
<ul>
<li><a href="http://www.bilgisayarkavramlari.com/2009/01/01/c-ile-zaman-islemleri/">C ile Zaman işlemleri</a>
		</li>
</ul>
<p>Acaba bütün bunların yanında, programı çalıştırmadan, bilgisayarın donanım bilgilerine ve programın koduna bakarak, programın çalışma süresini kesin olarak bilebilir miyiz?
</p>
<p>Bu sorunun cevabı ne yazık ki hayırdır. Yani bir programın, bırakın çalışma süresini, bitip bitmeyeceğini bile kesin olarak bilemeyiz. (bkz. <a href="http://www.bilgisayarkavramlari.com/2008/11/12/durma-problemi-halting-problem/">Durma Problemi (Halting Problem))</a>
	</p>
<p>Ancak soruyu, <strong>TAHMİN</strong> şeklinde değiştirirsek bazı şeyler söylenebilir.
</p>
<p>Özellikle yüksek miktardaki işlem gerektiren ve uzun süre çalışacak olan kodlarda, (örneğin veri güvenliği ve şifreleme için kullanılan saldırı programları) için çalışma süresi hesaplamasında <a href="http://www.bilgisayarkavramlari.com/2007/12/03/parcala-fethet-yontemi-divide-and-conquer/">parçala fethet (divide and conquere)</a> yaklaşımı sıklıkla kullanılmaktadır. Bu konuyu basitleştirmek için, bir örnek üzerinden açıklamaya çalışalım.
</p>
<p>Örneğin bin kere dönecek bir döngü bulunsun. Bu döngünün, elimizdeki donanımla, toplam çalışma süresini hesaplamak için, örneğin 10 kere dönüşünü ölçüyoruz ve basitçe bu sürenin 100 misli vakit alacağını söylüyoruz ve elbette bunun tahmini bir süre olduğunu mutlaka ekliyoruz <span style="font-family:Wingdings">J</span>
	</p>
<p>Şayet elimizde hiç çalışma örneği yoksa bu durumda biraz daha hesaplama yapmamız gerekiyor.
</p>
<p>Öncelikle yüksek seviye programlama dillerini (C, C++, JAVA veya C# gibi dilleri) kullanarak bu hesaplamayı yapma şansımız ne yazık ki bulunmuyor. Mümkünse doğrudan <a href="http://www.bilgisayarkavramlari.com/2009/10/12/makine-dilleri-machine-langauge/">makine diline inerek makine dilindeki komutlara (instructions)</a> bakıyoruz. Ancak yeterli bilginiz varsa, yüksek seviye dillerden makine diline geçişi hesaplayan bir formül (örneğin kullandığımız her fonksiyonun makine dili karşılığını biliyorsak (örneğin printf fonksiyonunun karşılığını)) bu durumda tahmin işlemi yapılabilir.
</p>
<p>Makine dilini elde ettikten sonra (ki aslında bütün <a href="http://www.bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derleyicilerin(compiler)</a> işi, verilen kodu makine diline çevirmektir, dolayısıyla programımızın makine dili karşılığını bilmiyorsak basitçe derlememiz yeterlidir <span style="font-family:Wingdings">J</span>), basitçe işlemcinin (CPU) her saat tikinde (clock tick) bir işlem yapacağını söyleyebiliriz.
</p>
<p>Bu işlem, işlemcinin (CPU) tasarımına göre değişmekle birlikte, genelde 4 adımdan oluşur <a href="http://www.bilgisayarkavramlari.com/2008/11/24/borulama-pipelining/">(Fetch, decode, execute , store işlemleri</a>). Bu işlemlerin elbette çalışma sırasında <a href="http://www.bilgisayarkavramlari.com/2008/11/24/borulama-pipelining/">borulama (pipelining)</a> gibi iyileştirmelerle hızlandırılması mümkündür. Ancak işlemci tasarımcıları genelde birim zamanda ne kadar işlem (instruction) çalıştırılacağını bildirirler.
</p>
<p>Örneğin günümüzde de kurumsal bir firma olarak faaliyetlerine devam eden MIPS (ki şu anda ismi değişmiştir) 1980&#8242;li yıllarda ilk ismini duyururken, Million Instructions Per Second (saniyede milyon işlem) olarak duyurmuştur. Bunun anlamı, bir saniyede bir milyon işlemin (insturction) yapıldığıdır.
</p>
<p>Örneğin 1999 yılında piyasaya sürülen Intel Pentium II işlemcinin 500Mhz. İle çalışırken saniyede 1.354 MIPS işlem gücü olduğu duyurulmuştur. Bunun anlamı, yaklaşık bir buçuk milyon işlemin (instruction) saniyede yapılabildiğidir.
</p>
<p>Dolayısıyla, şayet elimizdeki işlemcinin, işlem gücünü biliyorsak ve çalıştıracağımız kodun toplamda ne kadar işlem (instruction) çalıştıracağını biliyorsak (ki bunun için basit bir derleme yeterli olacaktır) ve işletim sisteminin, bu kaynağın ne kadarını bize ayıracağını biliyorsak süreyi hesaplayabiliriz.
</p>
<p>Burada, birden fazla işlemi aynı anda çalıştırmak için, işlemci kaynaklarını paylaştıran işletim sistemlerinin (operating systems) kaynak ayırımı da önemli bir rol oynamaktadır. </p>

<p class="sayac_bilgi">330 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/02/02/programlarin-calisma-suresi/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sonlu Eleman Yöntemi (SEY)</title>
		<link>http://www.bilgisayarkavramlari.com/2011/02/01/sonlu-eleman-yontemi-sey/</link>
		<comments>http://www.bilgisayarkavramlari.com/2011/02/01/sonlu-eleman-yontemi-sey/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 12:03:08 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2011/02/01/sonlu-eleman-yontemi-sey/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Literatürde sonlu eleman yöntemi (finite elemant method) veya sonlu eleman tahlili (finite element analysis) olarak geçen konudur. Bu çalışmanın amacı, herhangi bir problemi sonlu sayıda elemana indirgemek ve bu elemanların çözülmesi sonucunda istenen neticeye ulaşmaktır. Örneğin Lego parçalarından bir ev yapılması sonlu eleman yönteminin kullanılmasıdır. Daha kullanışlı bir örnek olarak [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Literatürde sonlu eleman yöntemi (finite elemant method) veya sonlu eleman tahlili (finite element analysis) olarak geçen konudur.
</p>
<p>Bu çalışmanın amacı, herhangi bir problemi sonlu sayıda elemana indirgemek ve bu elemanların çözülmesi sonucunda istenen neticeye ulaşmaktır.
</p>
<p>Örneğin Lego parçalarından bir ev yapılması sonlu eleman yönteminin kullanılmasıdır.
</p>
<p>Daha kullanışlı bir örnek olarak bir integral hesaplanmasını ele alabiliriz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/020111_1203_SonluEleman1.png" alt=""/>
	</p>
<p>Örneğin yukarıdaki şekilde görüldüğü gibi, bir eğrinin integralini almak için eğrinin altında kalan alan hesaplanmalıdır. Şayet bu alanı sonlu sayıda dikdörtgene indirgeyebilirsek bu dikdörtgenlerin alanlarını hesaplayıp toplayarak, yaklaşık alanı hesaplayabiliriz.
</p>
<p>Burada dikkat edilecek iki önemli husus:
</p>
<ol>
<li>Sonlu eleman tahlilinde, sonlu sayıda işlem yapılmalıdır
</li>
<li>Sonlu eleman tahlili, kesin netice vermek zorunda değildir. Yakın sonuçlar, kabul edilebilir.
</li>
</ol>
<p>SEY (Sonlu eleman yöntemini) aşağıdaki adımlara indirgemek mümkündür:
</p>
<ol>
<li>Problemi veya tahlil edilen yapıyı alt parçalara böl
</li>
<li>Her elemanın ayrı ayrı özelliklerini ve davranışlarını belirle
</li>
<li>Her parçanın birbirine bağlantısını ve büyük sistemi nasıl oluşturduğunu belirle
</li>
<li>Her parça için sistemi çöz
</li>
<li>Beklenen sonuçları bütün sisteme genelleyerek bütün sistem için çözümü elde et.
</li>
</ol>
<p>Diğer bir deyişle sistemi önce parçalara bölüp, her parçanın nasıl çalıştığını ve parçalar arasındaki ilişkileri tanımlıyoruz. Ardından parçaların bu tanımında yer alan denklemleri çözerek sistemi çözüyoruz.
</p>
<p><strong>SEY (Sonlu Eleman Yönteminin) kullanım alanları<br />
</strong></p>
<p>SEY uygulamalarının tamamını birer simülasyon olarak düşünmek mümkündür. Uygulamalarda, gerçekte ulaşılması zor veya imkansız olan ortam testlerinin öne çıktığı görülmektedir.
</p>
<p>Örneğin bir arabanın çarpması halinde, arabanın nasıl bir şekle geleceği veya kaza anında yolcu güvenliğinin denenmesi için bir arabadaki bütün parçaların tahlil edilmesi ve birer denkleme dönüştürülmesi sonucunda kaza yapılmadan, kazanın neticeleri incelenebilir.
</p>
<p>Benzer şekilde uzay çalışmalarında, tıbbi uygulamalarda veya afet yönetimi gibi tecrübe edilmesi imkansız veya zor ortamların hesaplanarak sonuçlarının kestirilmesi için SEY kullanılmaktadır.
</p>
<p><strong>Elemanların sınıflandırılması<br />
</strong></p>
<p>SEY çalışmaları sırasında bazı tecrübeler elde edilmiş ve bu tecrübeler sonucunda kalıplaşmış bazı yöntemler geliştirilmiştir. Sonu elemanların sınıflandırılması ve her sınıf için ayrı çözümleme yöntemlerinin geliştirilmesi mümkündür. Bu eleman sınıfları ve çözüm yöntemleri ayrı başlıklar altında anlatılacak ve buradan bağlantı verilecektir. </p>

<p class="sayac_bilgi">67 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2011/02/01/sonlu-eleman-yontemi-sey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prolog ile Fonksiyon ve Liste yönetimi</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/28/prolog-ile-fonksiyon-ve-liste-yonetimi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/28/prolog-ile-fonksiyon-ve-liste-yonetimi/#comments</comments>
		<pubDate>Tue, 28 Dec 2010 14:33:20 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/28/prolog-ile-fonksiyon-ve-liste-yonetimi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, prolog, programlama dilini kullanarak basit fonksiyon tanımlarını ve listelerin yönetimini açıklamaktır. Fonksiyon ve Haber Kavramları Prolog dilinde, yazılan her satır bir haber (predicate) olarak düşünülebilir. Örneğin haftanın birinci günü Pazartesidir bilgisi, prolog açısından bir haberdir. Bunu aşağıdaki şekilde prologda kodlayabiliriz: gun(1,&#8217;Pazartesi&#8217;). Ardından sorgulamak için, bağlanmamış bir değişken [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, prolog, programlama dilini kullanarak basit fonksiyon tanımlarını ve listelerin yönetimini açıklamaktır.
</p>
<p><strong>Fonksiyon ve Haber Kavramları<br />
</strong></p>
<p>Prolog dilinde, yazılan her satır bir haber (predicate) olarak düşünülebilir.
</p>
<p>Örneğin haftanın birinci günü Pazartesidir bilgisi, prolog açısından bir haberdir. Bunu aşağıdaki şekilde prologda kodlayabiliriz:
</p>
<p>gun(1,&#8217;Pazartesi&#8217;).
</p>
<p>Ardından sorgulamak için, bağlanmamış bir değişken (unbounded variable) kullanılabilir. Prolog dilinde büyük harfle başlayan kelimeler, değişken ifade eder.
</p>
<p>gun(1,X).
</p>
<p>Sorgusunun sonucu aşağıdaki şekildedir:
</p>
<p>?- gun(1,X).
</p>
<p>X = &#8216;Pazartesi&#8217;.
</p>
<p>Burada bağlı olmayan değişkene, gun haberi için bütün sonuçlar döndürülür.
</p>
<p>Haberlerin koşullara bağlanması da mümkündür.
</p>
<p>Örneğin maaş bilgisini bir haber olarak Prolog dilinde girelim:
</p>
<p>maas(ali,100).
</p>
<p>Bu girdiye göre ali&#8217;nin maaşı 100 liradır. Ve sorguladığımızda:
</p>
<p>?- maas(ali,X).
</p>
<p>X = 100.
</p>
<p>Sonucunu alırız. Benzer şekilde aynı maaşı alan Veli isimli bir kişi daha olsun :
</p>
<p>maas(&#8216;ali&#8217;,100).
</p>
<p>maas(&#8216;veli&#8217;,100).
</p>
<p>Şimdi sorgulamayı tersine çevirelim ve 100 lira maaş alanları soralım:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122810_1433_PrologileFo1.png" alt=""/>
	</p>
<p>Yukarıdaki örnekte, 100 lira maaş alan iki kişi bulunmuştur. Özellikle, ilk X=ali sonucundan sonra ekranda görülen ; (noktalı virgül) işaretine dikkat ediniz. Aslında prolog tek sonuç gösterir (bu sonuçta ilk bilgisi girilen ali&#8217;dir) ancak kullanıcı ; işaretine basarak sonraki sonuçları da görebilir.
</p>
<p>Şimdi kayıtlı kişilerin maaşlarına zam yapan bir fonksiyonu yazmaya çalışalım ve kişilerin maaşlarını örneğin %10 oranında arttıralım.
</p>
<p>maas(&#8216;ali&#8217;,100).
</p>
<p>maas(&#8216;veli&#8217;,100).
</p>
<p>zam(X,Z):-
</p>
<p> maas(X,Y),
</p>
<p> Z is Y * 1.1.
</p>
<p>Yukarıdaki yeni kodumuzda, zam isimli bir fonksiyon tanımlanmış ve X değişkeniyle aldığı kişinin, zamlı maaşını Z değişkenine döndürmesi tasarlanmıştır.
</p>
<p>Kodumuz, basitçe X kişisinin maaşını sorgulayıp Y değişkenine atıyor ve ardından Y değişkeninin değerini 1.1 ile çarparak Z değişkenine döndürüyor.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122810_1433_PrologileFo2.png" alt=""/>
	</p>
<p>Şayet herkesin zamlı maaşını görmek istersek, aşağıdaki şekilde fonksiyonun iki parametresini de bağlanmadan bırakabiliriz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122810_1433_PrologileFo3.png" alt=""/>
	</p>
<p><strong>Döngüler<br />
</strong></p>
<p>Prolog dilinde her ne kadar döngü bulunsa da, yapısal olarak özyineli bir dil (recursive) özelliği bulunduğundan dolayı, döngülerin kullanılması çok uygun değildir.
</p>
<p>Prolog dilinde, sürekli işler basitçe aşağıdaki örnekte anlatıldığı üzere bir fonksiyonun kendi kendisini çağırması şeklinde olur:
</p>
<p>fac(A,B) :-
</p>
<p>      A &gt; 0,
</p>
<p>      C is A &#8211; 1,
</p>
<p>      fac(C,D),
</p>
<p>      B is A * D.
</p>
<p>Yukarıdaki kodda, faktöriyel hesaplanması için A&gt;0 koşulu ile başlanarak her seferinde A*fac(A,B-1) değeri hesaplanmaktadır.
</p>
<p><strong>Listeler<br />
</strong></p>
<p>Listeler veri yapısı olarak dizilere benzer şekilde, ardışık olarak verileri tutmaktadır. Dizilerden farklı olarak, listelere erişim ardışık (sequential) olabilmektedir. Yani bir dizinin ilk elemanına erişmek mümkündür ama örneğin 5. Elemanına doğrudan erişmek mümkün değildir. Listeleri, veri yapılarında bulunan <a href="http://www.bilgisayarkavramlari.com/2007/05/03/linked-list-linkli-liste-veya-bagli-liste/">bağlı listeler (linked list)</a> şeklinde düşünmek daha doğrudur.
</p>
<p>Prolog dilinde listeler üzerine yapılan iki temel işlem vardır:
</p>
<ul>
<li>Listeleri parçalamak
</li>
<li>Listeleri veya elamanları birleştirerek liste oluşturmak
</li>
</ul>
<p>Bu işlemleri sırasıyla anlatmaya çalışalım:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122810_1433_PrologileFo4.png" alt=""/>
	</p>
<p>Yukarıdaki çalışma örneğinde,  alfabenin ilk 5 elemanından oluşan bir liste, | sembolü ile bölünmüş bir listenin içerisine atanıyor. Bunun anlamı, X değeri, listenin ilk elemanını (Buradaki eleman ibaresi önemlidir, listenin ilk elemanı bir elemandır, liste değildir) ve listenin geri kalan elemanlarını ise Y değerinin aldığıdır.
</p>
<p>Yukarıdaki bu işlem, Prolog dilindeki en temel parçalama işlemidir.
</p>
<p>Listelerin birleştirilmesinde kullanılan en temel fonksiyon ise append&#8217;dir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122810_1433_PrologileFo5.png" alt=""/>
	</p>
<p>Yukarıdaki örnekte görüldüğü üzere iki liste birleştirilerek X değişkeni içerisinde gösterilmiştir. </p>

<p class="sayac_bilgi">215 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/28/prolog-ile-fonksiyon-ve-liste-yonetimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mükemmel Sayılar (Perfect Numbers)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/26/mukemmel-sayilar-perfect-numbers/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/26/mukemmel-sayilar-perfect-numbers/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 03:20:16 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/26/mukemmel-sayilar-perfect-numbers/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Matematikte, sayı teorisinde (number theory), pozitif bir sayının kendinden küçük ve kendisini tam bölen sayıların toplamı şayet sayının kendisine eşitse bu sayıya mükemmel sayı ismi verilir. Literatürde, bu tanıma uyan en küçük sayı 6 olarak geçer. Benim kişisel görüşüm aslında bu tanıma uyan en küçük mükemmel sayının 1 olduğu yönündedir. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Matematikte, sayı teorisinde (number theory), pozitif bir sayının kendinden küçük ve kendisini tam bölen sayıların toplamı şayet sayının kendisine eşitse bu sayıya mükemmel sayı ismi verilir.
</p>
<p>Literatürde, bu tanıma uyan en küçük sayı 6 olarak geçer. Benim kişisel görüşüm aslında bu tanıma uyan en küçük mükemmel sayının 1 olduğu yönündedir. Örnek olarak 6&#8242;yı ele alacak olursak, 6&#8242;nın kendinden küçük kalansız bölenleri 1,2,3&#8242;tür. Bu sayıların toplamı yine 6 yapar.
</p>
<p>Mükemmel sayı olma özelliğini taşıyan diğer bir sayı da 28&#8242;dir. Yukarıdaki tanıma göre, 28 sayısını kalansız bölen ve kendinden küçük pozitif tam sayılar aşağıdaki şekilde yazılabilir:
</p>
<p>1+2+4+7+14 = 28
</p>
<p>Ibn El Hayzem tarafından (tam ismi Abû ʿAlî al-Ḥasan ibn al-Ḥasan ibn al-Haytham&#8217;dir) milattan sonra 1000 yılında bütün çift mükemmel sayıların aşağıdaki formülü sağladığı ortaya konmuştur:
</p>
<p>2<sup><em>p</em>−1</sup>(2<em><sup>p</sup></em>−1),  2<sup><em>p</em>−1</sup> olmak şartıyla
</p>
<p>Örneğin p = 3 için
</p>
<p>2<sup><em>3</em>−1</sup>(2<em><sup>3</sup></em>−1) denklemi yazılabilir ve bu denklemin açılımı aşağıdaki şekildedir:
</p>
<p>2<em><sup>2</sup></em> (2<em><sup>3</sup></em>−1) = 4 (7) = 28. (bu sayının mükemmel sayı olduğunu yukarıda göstermiştik).</p>

<p class="sayac_bilgi">161 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/26/mukemmel-sayilar-perfect-numbers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Powerpoint ile Sunum</title>
		<link>http://www.bilgisayarkavramlari.com/2010/12/20/powerpoint-ile-sunum/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/12/20/powerpoint-ile-sunum/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 13:59:26 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/12/20/powerpoint-ile-sunum/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, MS Power point 2010 programına hızlı bir başlangıç yapmak ve basit bir sunum hazırlayacak bilgiyi sunmaktır. Program, ilk kez açıldığında, aşağıdaki şekilde boş bir sunum ile başlar: Bu ekranda, üst tarafta duran araç çubuklarının dışında, ekranın en solunda slayt sıralayıcısı ismi verilen ve sunumda bulunan slaytları gösteren [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, MS Power point 2010 programına hızlı bir başlangıç yapmak ve basit bir sunum hazırlayacak bilgiyi sunmaktır.
</p>
<p>Program, ilk kez açıldığında, aşağıdaki şekilde boş bir sunum ile başlar:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi1.png" alt=""/>
	</p>
<p>Bu ekranda, üst tarafta duran araç çubuklarının dışında, ekranın en solunda slayt sıralayıcısı ismi verilen ve sunumda bulunan slaytları gösteren araç çubuğu bulunur. Yine ekranın en altında, sunumda görülmeyen ancak konuşmacının kendisi için tutabileceği notlar bulunur.
</p>
<p>Sunum hazırlamaya, sunum için bir tema seçilerek başlanması tavsiye edilmektedir. Her ne kadar sunumun içeriği oluşturulduktan sonra tema değiştirilebilse de, tecrübi olarak sonradan yapılan değişikliklerin, sunumda bazı problemlere sebep olduğu bilinmektedir.
</p>
<p>Sunuma bir tema vermek için Tasarım sekmesine tıklanır:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi2.png" alt=""/>
	</p>
<p>Tasarım sekmesinde, orta alanda yer alan hazır tasarımlardan birisi seçilebilir veya bu ekran, sağ alt köşede bulunan ve yukarıdaki şekilde daire içerisine alınmış olan düğmeye basılarak genişletilebilir.
</p>
<p>Örnek olarak, dalga biçimi isimli sunumu seçelim:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi3.png" alt=""/>
	</p>
<p>Tasarımın seçilmesinin ardında, ilgili tasarımın arka planı ve yazı tipi değişiklikleri sunuma uygulanmaktadır. Her sunum tasarımının farklı özellikleri bulunmaktadır.
</p>
<p>Ardından sunumumuza bir başlık ekleyerek başlayalım. Powerpoint, sunumun ilk slaytını başlık olarak tasarlar ve buna uygun bir slayt yapısı ekler. Bu yapıyı ekleme sırasında biz de seçebiliriz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi4.png" alt=""/>
	</p>
<p>Slayt eklemek için, giriş sekmesi altında bulunan yeni düğmesine basılarak açılan menüden, istenilen bir slayt yapısı seçilebilir. Klasik olarak klavyede bulunan ctrl+m tuş kombinasyonuna basılması halinde eklenecek olan slayt yapısı, listede bulunan, &#8220;Başlık ve İçerik&#8221; isimli yapıdır.
</p>
<p>Slayt eklendikten sonra slayt içerisinde yapısal bazı düzenlemeler yapmak mümkündür. Örneğin slayt içerisine yazı yazılabilir veya yazılan yazılar değiştirilebilir.
</p>
<p>Girilen yazı tarandıktan sonra, taralı alan üzerinde sağ tuşa basılarak açılan menüden &#8220;Yazı Tipi&#8221; seçilerek font ile ilgili ayarlar yapılabilir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi5.png" alt=""/>
	</p>
<p>Burada yapılacak ayarlar olan<a href="http://www.bilgisayarkavramlari.com/2010/10/06/ms-word-2010-kullanimi-i-2/">, &#8220;Yazı Tipi&#8221;, &#8220;Paragraf&#8221;, &#8220;Madde İşaretleri&#8221; ve &#8220;Numaralandırma&#8221; seçenekleri, daha önce MS Word konusunda anlatıldığı</a> için bir kere daha burada anlatılmayacaktır.
</p>
<p>Powerpoint sunumu içerisine ayrıca şekil eklenmesi de mümkündür. <a href="http://www.bilgisayarkavramlari.com/2010/10/27/ms-word-programinda-cizim/">Bunun için Powerpointte bulunan çizim araç çubuğu kullanılabilir.</a>
	</p>
<p>Örneğin, sunumdaki aktif slayt içerisine bir gülen yüz resmi eklemek isteyelim.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi6.png" alt=""/>
	</p>
<p>Giriş sekmesi altında bulunan şekiller listesi açıldıktan sonra, istenilen şekil seçilerek slayt üzerine yerleştirilebilir.
</p>
<p><strong>Power Point Programı ile Animasyonlar<br />
</strong></p>
<p>Powerpoint sunum programında ayrıca öğelere hareket eklemek mümkündür. Powperpointte bu öğeleri ikiye ayırmak gerekir. Birincisi bir slayttan diğerine geçiş sırasında uygulanacak olan animasyondur. İkincisi ise slayt içerisindeki nesnelere eklenecek olan animasyondur.
</p>
<p>Öncelikle slaytlar arsındaki geçiş animasyonuna bakalım.
</p>
<p>Herhangi bir slayt seçili iken, geçişler sekmesine tıklanırsa, aşağıdaki şekilde çeşitli slayt geçiş animasyonları belirecektir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi7.png" alt=""/>
	</p>
<p>Bu animasyonlardan istenilen bir tanesi tıklanarak (ki tıklandığında nasıl geçileceği hakkında fikir veren bir ön izleme gösterilmektedir) slayta uygulanabilir.
</p>
<p>Slayt içindeki nesnelere özel animasyonları uygulamak için ise, öncelikle bu nesnenin seçilmesi gerekir.  Nesne seçildikten sonra, animasyonlar sekmesine tıklanıp, listeden istenilen bir animasyon, seçili olan şekle uygulanabilir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi8.png" alt=""/>
	</p>
<p> Örneğin, gülen yüz şeklini, kendi çizeceğimiz bir yolda hareket ettirmek istiyor olalım. Bu durumda, şekil seçili iken animasyonlar altında bulunan özel yol seçimine tıklıyoruz.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi9.png" alt=""/>
	</p>
<p>Ardından şeklin izlemesini istediğimiz yolu, slayt üzerinde çiziyoruz:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi10.png" alt=""/>
	</p>
<p>Çizimin ardından, animasyon uygulanan şeklin yanında kutu içerisinde 1 rakamı belirir. Bu rakamın anlamı, slayt gösterisi sırasında, bu slayta gelindiğinde, ilk çalışacak animasyonun bu şekil üzerinde tanımlı olmasıdır.
</p>
<p>Ayrıca yeni animasyonlar tanımlandıkça, animasyonların üzerinde tanımlandığı şekillerin yanına sayılar eklenerek sıralar gösterilir.
</p>
<p>Bu animasyonların sırasının belirlendiği veya animasyonların silinip, değiştirilebildiği bir animasyon bölmesi bulunmaktadır. Bu bölmeyi açmak için araç çubuğunda bulunan &#8220;Animasyon Bölmesi&#8221; düğmesine tıklanır. Açılan bölmede mevcut animasyonlar görülmektedir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi11.png" alt=""/>
	</p>
<p><strong>Slayt Gösterisi<br />
</strong></p>
<p>Sunum hazırlandıktan sonra, slayt gösterisini başlatmak için &#8220;Slayt Gösterisi&#8221; sekmesine tıklanarak burada bulunan &#8220;Baştan&#8221; seçeneği tıklanabilir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi12.png" alt=""/>
	</p>
<p>Tıklamanın ardından slayt gösterisi başlayacaktır (klavyeden kısayol olarak f5 tuşuna basılabilir).
</p>
<p>Sunum sırasında klavyenin ok tuşları, farenin tuşları sunum içerisindeki slaytlar arasında geçişi sağlar.
</p>
<p>Ayrıca sunum sırasında, ekranın sol alt köşesinde bulunan bir gizli çubuk sayesinde, sunuma müdahale etmek de mümkündür. Örneğin kalem aracını seçerek sunum üzerine çizim yapılabilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi13.png" alt=""/>
	</p>
<p>Örnek olarak, bu kalem resmine tıklandıktan sonra açılan menüden istenilen bir kalem rengi seçilebilir:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi14.png" alt=""/>
	</p>
<p>Seçimin ardından, slayt üzerinde çizim yapmak mümkündür.
</p>
<p>Slayt gösterisini, son slayttan sonra devam etmeye çalışarak veya klavyeden ESC tuşuna herhangi bir anda basarak bitirebilirsiniz.
</p>
<p>Sunumun bitirilmesi ile birlikte, şayet sunum sırasında eklemeler yapıldıysa, aşağıdakine benzer bir diyalog ile bu eklemelerin saklanıp saklanmayacağı sorulacaktır:
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi15.png" alt=""/>
	</p>
<p>&#8220;Sakla&#8221; düğmesine basılması halinde, bu sonradan yapılan değişiklikler sunumun bir parçası olarak sunumla birlikte saklanacaktır.
</p>
<p><strong>Slayt Sıralayıcısı (Slide Sorter)<br />
</strong></p>
<p>Sunum sırasında, kullanılan slaytların sırası değiştirilebilir veya bazı slaytlar sunuma özgü olarak gizlenebilir.
</p>
<p>Sunumdaki slaytların sırasını değiştirmek için ekranın sol tarafında bulunan ve sunumların küçük resimlerle gösterildiği ekranda, bir slaytın tutulup istenilen farklı bir yere taşınması yeterlidir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi16.png" alt=""/>
	</p>
<p>Sunumdaki bir slaytın saklanması için, saklanmak istenen slayt üzerinde sağ tuşa basıp, açılan menüden &#8220;Slayt gizle&#8221; seçeneği seçilmelidir.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi17.png" alt=""/>
	</p>
<p>Seçimin ardından, ilgili slaytın numarası üzerine bir çarpı eklenir. Bunun anlamı bu slaytın sunum sırasında gösterilmeyeceğidir.
</p>
<p>Gizli bir slaytı, tekrar sunuma dahil etmek için, gizleme işlemi tekrar edilir. Örneğin slayt tekrar seçilir ve sağ tuşla tıklanıp, ikinci kere slayt gizle seçeneğine tıklanır.
</p>
<p><strong>Powerpoint ile baskı<br />
</strong></p>
<p>Powerpoint programı ile, yazıcıdan çıktı alırken, şimdiye kadar gördüğümüz diğer Office araçlarından farklı olarak ilave bazı ayarların yapılması mümkündür.
</p>
<p>Baskı işlemi, Dosya sekmesi altında bulunan yazdır seçeneği tıklanarak yapılır.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi18.png" alt=""/>
	</p>
<p>Örneğin, bir sayfada, birden fazla slayt bastırılması isteniyorsa, Slaytlar grubunda buluna Tam Sayfa Slaytlar tıklanarak farklı bir seçenek seçilebilir.
</p>
<p>Ayrıca özel olarak normalde sunumda görülmeyen ve slaytlar altına alınabilen notların basılması da mümkündür.
</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/122010_1359_Powerpointi19.png" alt=""/>
	</p>
<p>Bunun için not sayfaları seçilmelidir.</p>

<p class="sayac_bilgi">816 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/12/20/powerpoint-ile-sunum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dolphin 7 ile modül geliştirme</title>
		<link>http://www.bilgisayarkavramlari.com/2010/11/21/dolphin-7-ile-modul-gelistirme/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/11/21/dolphin-7-ile-modul-gelistirme/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 16:14:00 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/11/21/dolphin-7-ile-modul-gelistirme/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, bir içerik yönetim sistemi olan (CMS) Dolphin 7 platformu üzerinde nasıl modül geliştirileceğini açıklamaktır. Bu yazı kapsamında örnek bir modül geliştirilecektir. Modülün iki farklı ara yüzü olacaktır. Birincisi sitede yer alması ve siteyi ziyaret eden kişilerin görmesini hedeflediğimiz ara yüzdür. İkincisi ise modülün yönetici ara yüzüdür. Modülümüzü [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, bir içerik yönetim sistemi olan (CMS) Dolphin 7 platformu üzerinde nasıl modül geliştirileceğini açıklamaktır.
</p>
<p>Bu yazı kapsamında örnek bir modül geliştirilecektir. Modülün iki farklı ara yüzü olacaktır. Birincisi sitede yer alması ve siteyi ziyaret eden kişilerin görmesini hedeflediğimiz ara yüzdür. İkincisi ise modülün yönetici ara yüzüdür. Modülümüzü öncelikle basit bir metinden oluşan şekilde kodlayacağız ve ardından geliştireceğiz.
</p>
<p>Bir modülün dosya anatomisi
</p>
<p>Klasik bir modül geliştirilirken kullanılan bazı özel dizinler ve dosyalar bulunur. Bunların listesi aşağıda sunulmuştur. Modül geliştirilirken benzer dizin ve dosya isimlerinin kullanılması gerekir.
</p>
<p>Aşağıdaki dosya isimlerinde MeBlgg ile başlayan kısım modül ismidir. Burada örnek olarak benim blog&#8217;um kısaltması olarak MeBlgg kelimesi kullanılmıştır. Farklı modüller için farklı isimler kullanılabilir. Ancak bu modül ismine göre aşağıda listelendiği gibi dosya isimleri oluşturulmalıdır. Örneğin, ayarların tutulduğu dosya MeBlggConfig dosyası olarak isimlendirilmiştir. Proje ismi Ali olsaydı, dosya ismi AliConfig olacaktı. Benzer şekilde proje dosyaları bir dizin içerisinde kurulmalıdır. Örneğin dizin ismi olarak bloggie seçilmiştir. Proje kapsamında farklı isimler seçilebilir.
</p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes</strong><br />
			<br/>Modülün nesne yönelimli programlanması gerekir ve kodları bu dizin içerisindeki sınıflara yerleştirilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggConfig.php</strong><br />
			<br/>Modülün ayarlamalarını içeren (config) sınıfları bu dosyada durur. Buradaki ayarları, diğer sınıflar kullanır. Ayarların bulunduğu sınıflar, sistem sınıflarından miras alırlar (inheritance)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggDb.php</strong><br />
			<br/>Yazılan yeni modülün veritabanı bağlantısının yapıldığı dosyadır. SQL dilinde yazılan sorgular bu dosyada yer alır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggModule.php</strong><br />
			<br/>Modülün ana sınıfıdır. İlk çalışan fonksiyon ve diğer bütün fonksiyonlara çağrı bu dosyadan yapılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggTemplate.php</strong><br />
			<br/>Şablon sınıfıdır. Base sınıftan miras alır (inheritance)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install</strong><br />
			<br/>Modülün kurulumu için gereken bilgileri içerir. Örneğin kurulum sırasında çalışacak olan veri tabanı makroları bu dizinde bulunur.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/config.php</strong><br />
			<br/>Kurulum sırasındaki konfigürasyon bilgileri bu dosyaya yazılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/info</strong><br />
			<br/>Kurulum sırasında, modül kurulumu yapan kişilerin bilgilendirilmesini amaçlayan dosyadır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/installer.php</strong><br />
			<br/>Kurulum betiklerini (script) içerir. Kurulum sırasında otomatik olarak yapılacak olan makrolar bu dosyaya yazılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/langs</strong><br />
			<br/>Kurulum sırasındaki dil dosyasıdır.  Dil dosyaları, ülke kodunun iki hafidir. Sonu .php ile biter.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/langs/en.php</strong><br />
			<br/>Örnek olarak İngilizce kurulum dil dosyasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql</strong><br />
			<br/>Kurulum sırasında kullanılacak olan veri tabanı dosyalarını içerir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql/install.sql</strong><br />
			<br/>modülün kurulumu sırasında çalıştırılacak olan veri tabanı prosedürlerini içeren sql dosyası (create table, grant vs. gibi)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql/uninstall.sql</strong><br />
			<br/>Modülün kaldırılması için gereken veritabanı prosedürlerini içeren dosya. (drop table, revoke vs. gibi)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/request.php</strong><br />
			<br/>Yönlendirici sınıfıdır. <strong>MeBlggModule</strong> sınıf çağırılarına geçirilen bir kılıf gibi düşünülebilir (wrapping class).<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates</strong><br />
			<br/>Modülün görsel şemasını içeren dizindir. *.html, *.css ve resim dosyalarını barındırır. Tasarıma göre düzenlenmelidir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base</strong><br />
			<br/>Şemaların içerildiği ana dizindir. Dilenirse farklı alt dizinler oluşturularak her şema farklı bir dizinde bulundurulabilir. Ya da tek bir base dizini üzerinden hepsine prosedür çağırılabilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/css</strong><br />
			<br/>CSS dosyaları buraya yerleştirilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/images</strong><br />
			<br/>Resimlerin konulacağı dizindir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/images/icons</strong><br />
			<br/>İconların dizinidir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/main.html</strong><br />
			<br/>Şemanın içerileceği ana html dosyasıdır.<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Times New Roman; font-size:18pt"><strong>2. Basit Bir Modül<br />
</strong></span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Örnek olarak hazırlanan modül dosyasını bu bağlantıya tıklayarak indirebilirsiniz. Bu dosyanın modules/me dizinine kurulması gerekir. Elbette sizin geliştireceğiniz modül me dışında, proje ismini içeren bir dizine kurulacaktır. Ve yine elbette me dizini standart kurulumda modules dizini altında bulunmaz ve bu dizini sizin oluşturmanız gerekir. Dizine kurulum yaptıktan sonra bloggie isimli örnek dizin modules/me dizini altına gelir. Bu kurulum sonucunda gelen dizin ve dosyaları aşağıdaki şekilde açıklayabiliriz.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes</strong><br />
			<br/>Modülün nesne yönelimli programlanması gerekir ve kodları bu dizin içerisindeki sınıflara yerleştirilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggConfig.php</strong><br />
			<br/>Modülün ayarlamalarını içeren (config) sınıfları bu dosyada durur. Buradaki ayarları, diğer sınıflar kullanır. Ayarların bulunduğu sınıflar, sistem sınıflarından miras alırlar (inheritance)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggDb.php</strong><br />
			<br/>Yazılan yeni modülün veritabanı bağlantısının yapıldığı dosyadır. SQL dilinde yazılan sorgular bu dosyada yer alır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggModule.php</strong><br />
			<br/>Modülün ana sınıfıdır. İlk çalışan fonksiyon ve diğer bütün fonksiyonlara çağrı bu dosyadan yapılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/classes/MeBlggTemplate.php</strong><br />
			<br/>Şablon sınıfıdır. Base sınıftan miras alır (inheritance)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install</strong><br />
			<br/>Modülün kurulumu için gereken bilgileri içerir. Örneğin kurulum sırasında çalışacak olan veri tabanı makroları bu dizinde bulunur.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/config.php</strong><br />
			<br/>Kurulum sırasındaki konfigürasyon bilgileri bu dosyaya yazılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/info</strong><br />
			<br/>Kurulum sırasında, modül kurulumu yapan kişilerin bilgilendirilmesini amaçlayan dosyadır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/installer.php</strong><br />
			<br/>Kurulum betiklerini (script) içerir. Kurulum sırasında otomatik olarak yapılacak olan makrolar bu dosyaya yazılır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/langs</strong><br />
			<br/>Kurulum sırasındaki dil dosyasıdır.  Dil dosyaları, ülke kodunun iki hafidir. Sonu .php ile biter.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/langs/en.php</strong><br />
			<br/>Örnek olarak İngilizce kurulum dil dosyasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql</strong><br />
			<br/>Kurulum sırasında kullanılacak olan veri tabanı dosyalarını içerir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql/install.sql</strong><br />
			<br/>modülün kurulumu sırasında çalıştırılacak olan veri tabanı prosedürlerini içeren sql dosyası (create table, grant vs. gibi)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/sql/uninstall.sql</strong><br />
			<br/>Modülün kaldırılması için gereken veritabanı prosedürlerini içeren dosya. (drop table, revoke vs. gibi)<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/request.php</strong><br />
			<br/>Yönlendirici sınıfıdır. <strong>MeBlggModule</strong> sınıf çağırılarına geçirilen bir kılıf gibi düşünülebilir (wrapping class).<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates</strong><br />
			<br/>Modülün görsel şemasını içeren dizindir. *.html, *.css ve resim dosyalarını barındırır. Tasarıma göre düzenlenmelidir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base</strong><br />
			<br/>Şemaların içerildiği ana dizindir. Dilenirse farklı alt dizinler oluşturularak her şema farklı bir dizinde bulundurulabilir. Ya da tek bir base dizini üzerinden hepsine prosedür çağırılabilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/css</strong><br />
			<br/>CSS dosyaları buraya yerleştirilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/images</strong><br />
			<br/>Resimlerin konulacağı dizindir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/images/icons</strong><br />
			<br/>İconların dizinidir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/templates/base/main.html</strong><br />
			<br/>Şemanın içerileceği ana html dosyasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu dosya konumları oldukça önemlidir çünkü Dolphin yazılımı üzerinde çalışan bazı plug-in&#8217;ler bu dosyaları ilgili dizinlerde aramaktadır ve bulunmaması halinde hatalı çalışabilmektedir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Şimdi deneme modülümüzü kurmaya geçelim. Öncelikle admin paneline geçiyor ve normal bir modül kurar gibi kurulum yapıyoruz. Panel-&gt;Tools-&gt;Modules seçenekleri sırasıyla seçilerek yüklü olan modüller görülebilir. <img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile1.png" alt=""/><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu modüllerden bir kısmı kurulmamıştır ve Not Installed Modules grubu altında belirir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile2.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Modülün kurulması için, modül yanında bulunan kutucuk seçilip, Install düğmesine basılması gerekir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile3.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kurulum sırasında herhangi bir hata olması durumunda, ekranın en üzerinde aşağıdakine benzer bir hata mesajı belirir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile4.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu hatanın detayları, satırın sonundaki + düğmesine basılarak açılabilir. Örneğin bu kurulum sırasında, örnek olması açısından, modülün Dolphin versiyonu değiştirilerek kurulum denenmiş ve aşağıdaki şekilde hata mesajı alınmıştır:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile5.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Başarılı bir kurulumun ardından aşağıdaki mesaj alınabilir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile6.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Kurulu olan modülün testi için site üzerinde m/bloggie/home dizinine girilebilir. Örneğin test sunucusu için bu yol aşağıdaki şekildedir:<br />
</span></p>
<p><a href="http://beta.odmproje.com/dolphin/m/bloggie"><span style="font-family:Times New Roman; font-size:12pt">http://beta.odmproje.com/dolphin/m/bloggie</span></a><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Şayet herşey başarılı bir şekilde kurulduysa, aşağıdaki şekilde, sayfa tasarlanarak içerisinde, modül mesajı ile birlikte basılacaktır:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile7.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Buradaki modül mesajını değiştirmemiş mümkündür.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>bloggie/install/langs/en.php</strong> dosyası açılırsa aşağıdaki içerik görülecektir.<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">$sLangCategory = &#8216;My Bloggie&#8217;;<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">$aLangContent = array(<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg&#8217; =&gt; &#8216;My Bloggie&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg_text&#8217; =&gt; &#8216;For a community to be whole and healthy, it must be based on people\&#8217;s love and concern for each other.&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">);<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu mesajı aşağıdaki şekilde değiştirerek sitede de değişmesini sağlayabiliriz:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">$sLangCategory = &#8216;My Bloggie&#8217;;<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">$aLangContent = array(<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg&#8217; =&gt; &#8216;My Bloggie&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg_text&#8217; =&gt; &#8216;Bu bir testtir.&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">);<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki değişiklikten sonra aşağıdaki mesaj alınır:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile8.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Önemli bazı notlar:<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki mesajı normalde almanız gerekirken alamıyorsanız. Dil dosyasını yeniden derlemeniz (recompile) gerekebilir. Bunun için modül kurulum ekranından, modül seçildikten sonra &#8220;Recompile Languages&#8221; düğmesine basılması gerekir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile9.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu sayede yeni dil dosyası yüklenerek derlenir. Bu derleme işlemi sonucunda ana dil dosyası olan /langs/lang-en.php dosyasına, ilgili düzeltme yapılır. Aslında bütün mesajlar bu dosyada tutulmakta olup kurulan modüllerin mesajları da bu dosyaya yazılmaktadır. Dolayısıyla bu modüllerde yapılan değişiklikler aslında recompile edildiğinde bu dosya değişmektedir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Diğer bir dikkat edilecek husus ise, modülde yapılan değişikliklerin, siteye hemen yansımamasıdır. Bunun sebebi Dolphin dizini altında bulunan cache dizinidir. Buradaki cache dosyaları, sayfaların yeniden yüklenmesini ve değişikliklerin görülmesini engelleyebilir. Çözüm olarak bu dizin içindeki bütün dosyaların silinmesi denenebilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:18pt"><strong>2.2. Hareketli İçerik Kodlaması.<br />
</strong></span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Basit bir uygulama olarak, dolphin üzerindeki bazı hazır fonksiyonları kullanacak ve sunucu saati ve kullanıcı saati arasındaki farkı hesaplaya çalışacağız. Modül üzerinde yapılan bu değişiklik, Dolphin üzerine kodlamaya başlangıcımızdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Öncelikle modülümüze iki yeni mesaj ekliyelim<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">$sLangCategory = &#8216;My Bloggie&#8217;;<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">$aLangContent = array(<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg&#8217; =&gt; &#8216;My Bloggie&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg_server_time&#8217; =&gt; &#8216;Sunucu saati:&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;_me_blgg_user_time&#8217; =&gt; &#8216;Kullanıcı saati:&#8217;,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">);<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki mesajlar eklendikten sonra, bu mesajları, modülümüzün ekranda göstermesi için, bu mesajları çağıran html eklentisini yapmamız gerekir. <strong>bloggie/templates/base/main.html</strong> dosyasında bulunan ve sadece tek satırlık mesajı yazan eski halimiz aşağıdaki şekildeydi:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">&lt;div style=&#8221;text-align:center;&#8221;&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;bx_text:_me_blgg_text /&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">&lt;/div&gt;<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki bu dosyayı aşağıdaki şekilde değiştirelim:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">&lt;div style=&#8221;text-align:center;&#8221;&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;bx_text:_me_blgg_server_time /&gt; __server_time__<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;br /&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;bx_text:_me_blgg_user_time /&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;script type=&#8221;text/javascript&#8221;&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        document.write(new Date());<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &lt;/script&gt;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">&lt;/div&gt;<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Burada kullandıklarımız:<br />
</span></p>
<ul>
<li><span style="font-family:Times New Roman; font-size:12pt"><strong>bx_text</strong> ardından gelen mesaj değişkenini, dolphin kurulumu içindeki dil dosyasında arayarak ekrana basar.<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt"><strong>server_time</strong> değişkeni, şu anda kullanılmayan ve sistemden okunacak olan değişkendir..<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt">Kullanıcı saati için, javascript dilinde bir değişken kullanılmıştır..<br />
</span></li>
</ul>
<p><span style="font-family:Times New Roman; font-size:12pt">Modül sayfamızı yenilediğimizde aşağıdaki şekilde bir ekran göreceğiz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile10.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Görüldüğü üzere, yazılan yazılar ekranda belirmekte ayrıca javascript kodumuz çalışmaktadır. Tek sorun __server_time__ şeklinde beliren değişkenin değerinin okunamamasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bunun için kodlarımızı bulunduracak olan  <strong>bloggie/classes/MeBlggModule.php</strong> dosyasında bulunan aşağıdaki kodu buluyoruz:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    function actionHome () {<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageStart();<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $aVars = array ();<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        echo $this-&gt;_oTemplate-&gt;parseHtmlByName(&#8216;main&#8217;, $aVars);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageCode(_t(&#8216;_me_blgg&#8217;), true);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    }<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ve aşağıdaki yeni kod ile değiştiriyoruz.<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    function actionHome () {<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageStart();<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $aVars = array (<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">            &#8216;server_time&#8217; =&gt; date(&#8216;r&#8217;),<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        );<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        echo $this-&gt;_oTemplate-&gt;parseHtmlByName(&#8216;main&#8217;, $aVars);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageCode(_t(&#8216;_me_blgg&#8217;), true);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    }<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu kodda görüldüğü üzere yeni bir değişken eklenmiş ve bu değişkenin değeri php fonksiyonu olan date fonksiyonundan okunmuştur.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Sayfamızın yeni hali aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile11.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Sunucu ve bilgisayar aynı ülkede olduğu için yukarıdaki sayfada bir fark görülmüyor. Ancak sunucunun farklı bir ülkede (farklı bir zaman diliminde) olması durumunda bu fark görülecektir. Ayrıca iki saat arasındaki fark, sunucu ve bilgisayar arasındaki saat ayarlarındaki farklılıktan kaynaklanabileceği gibi, sunucunun sayfayı üretmesi ve yollaması sırasında geçen zaman da bu değerleri etkilemektedir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Şimdi modüllerin ana sayfasının yüklenmesi sırasında çalışan actionHome fonksiyonunu inceleyelim.<br />
</span></p>
<ul>
<li><span style="font-family:Times New Roman; font-size:12pt"><strong>_oTemplate</strong> değişkeni, <strong>MeBlggTemplate?</strong> Sınıfından yüklenen bir ana değişkendir.<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt"><strong>pageStart</strong> fonksiyonu, çıktının aşağıda olucağını belirtir.<br />
</span></li>
<li>
<div><span style="font-family:Times New Roman; font-size:12pt"><strong>pageCode</strong> fonksiyonu, pageStart fonksiyonuyla başlayan içeriğin bittiğini belirtir. Yani modül sayfamızda görülecek olan içerik bu iki fonksiyon arasında bulunacaktır.<br />
</span></div>
<ul>
<li><span style="font-family:Times New Roman; font-size:12pt">Bu fonksiyonun ilk parametresi, gösterilecek içeriğin başlığıdır ve dil dosyasından okunduğu için _t fonksiyonu ile çağrılmıştır.<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt">İkinc parametre ise, bu içeriğin bir kutu şeklinde gösterilip gösterilmeyeceğini belirtir. Yukarıdaki ekran görüntülerinde kutulama yapılmasının sebebi burada true yazılmış olmasıdır.<br />
</span></li>
</ul>
</li>
<li><span style="font-family:Times New Roman; font-size:12pt"><strong>parseHtmlByName</strong> fonksiyonu ise <strong>main.html</strong> dosyasında gerekli yer değiştirmeleri yapar. Örneğin <strong>$aVars</strong> değişkenler dizisi içerisinde artık bir  <strong>server_time</strong> değişkeni vardır ve bu değişkenin sayfadaki <strong>server_time</strong> değişkeni ile yer değiştirmesi ve değerinin  yerine yazılması gerekir.<br />
</span></li>
</ul>
<p><span style="font-family:Times New Roman; font-size:12pt">Böylelikle basit bir modül ekleme işlemini bitirmiş oluyoruz. Bundan sonra yukarıdaki bilgiler kullanılarak yeni modüller yazılabilir. Kısaca yapılacak işlem dolphin üzerindeki mesajların dil dosyalarında bulundurulması, html dosyalarında kullanılan değişkenlere ise class dosyalarındaki php kodları ile karşılık yazılmasıdır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Modülümüz için bir yönetici paneli eklenmesi ve veritabanı bağlantısı gibi bir seviye iler işlemler ise aşağıdaki bölümlerde anlatılacaktır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:18pt"><strong>3. Yönetici Paneli Kodlaması<br />
</strong></span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Örnek uygulama olarak, modülümüzdeki tarihleri düzenlemek ve formatlama seçeneği eklemek istiyoruz. Ayrıca kullanıcı saatini göstermek veya göstermemek gibi bir seçenek de eklemek istiyoruz. Bu işlemler için aşağıdakileri yapmamız gerekecektir:<br />
</span></p>
<ul>
<li><span style="font-family:Times New Roman; font-size:12pt">Yönetici sayfası eklememiz<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt">Modülümüzüe göster/gösterme şeklinde bir seçenek eklememiz<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt">Yönetici ekranında bu ayarları göstermemiz<br />
</span></li>
<li><span style="font-family:Times New Roman; font-size:12pt">Yönetici ekranında modüller listesinde, bizim modülümüze bir bağlantı eklenmesi<br />
</span></li>
</ul>
<p><span style="font-family:Times New Roman; font-size:18pt"><strong>3.1. Admin page creation.<a href="http://www.boonex.com/trac/dolphin/wiki/DolphinTutorialMyFirstModule" title="Link to this section"><span style="color:blue; text-decoration:underline"> ¶</span></a><br />
			</strong></span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ana fonksiyonlarımızı bulunduran <strong>bloggie/classes/MeBlggModule.php</strong> dosyasına, aşağıdaki admin fonksiyonunu ekleyelim:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    function actionAdministration () {<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">        if (!$GLOBALS['logged']['admin']) {<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">            $this-&gt;_oTemplate-&gt;displayAccessDenied ();<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">            return;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        }<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageStart();<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">        echo DesignBoxAdmin (_t(&#8216;_me_blgg&#8217;), &#8216;It works!&#8217;);<br />
</span></p>
<p>
 </p>
<p><span style="font-family:Courier New; font-size:10pt">        $this-&gt;_oTemplate-&gt;pageCodeAdmin (_t(&#8216;_me_blgg&#8217;));<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    }<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Buradaki bazı sınıf ve fonksiyonlar, yönetici ekranı açıldığı zaman çalışır. <strong>pageCodeAdmin</strong> fonksiyonu <strong>pageCode</strong> fonksiyonuna benzer şekilde, sayfanın başlangıç ve bitişlerini belirtmeye yarar. Tek farklı, tek parametre almasıdır. Burada görsellik daha fazla ikinci planda kaldığı için, çerçeve konulması düşünülmemiştir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Öncelikle yetkilendirme işlemi için bazı değişkenleri tanımamız gerekiyor. Mesela  <strong>$GLOBALS['logged']['admin']</strong> değişkeninde değer olarak true verildiyse, bu şu anda login olan kullanıcının yönetici yetkisinde olduğunu belirtir. Benzer şekilde <strong>$GLOBALS['logged']['member']</strong> değişken değerinin true olması halinde ise, kullanıcının üye yetkisi vardır demektir. Bu değerlerin false olması, kullanıcının guest yetkisi ile girdiğini gösterir. Bu durudma örneğin sayfaya erişilmesini engellemek için yine Dolphin içerisinde bulunan <strong>displayAccessDenied</strong> fonksiyonu çağırılabilir. Bu fonksiyon, erişimin reddedildiğini gösterir. Ayrıca <strong>$GLOBALS['logged']</strong> değişkeni her zaman bulunmayabilir. Modül kurulumu sırasında, ana dizinde gelen <strong>bloggie/request.php</strong> dosyası içerisidne <strong>check_logged</strong> fonksiyonunun çağırılması gerekir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Buradaki bir diğer fonksiyon ise <strong>DesignBoxAdmin</strong> fonksiyonudur ve görsel olarak içeriğin bir kutu içerisinde görüntülenmesini sağlar. Fonksiyonun 3 parametresi bulunur. Bunlardan ilk ikisi, sırayla kutunun başlığı ve kutunun içeriğidir. Her ne kadar yukarıdaki kod örneğinde 3. parametre kullanılmamış olsa da, istenirse, kutu üzerinde bir menü tanımlamak için 3. parametre de kullanılabilir.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Sayfayı test etmek için aşağıdaki link kullanılabilir:<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><br />
			<a href="http://beta.odmproje.com/dolphin/m/bloggie/administration"/></span>http://beta.odmproje.com/dolphin/m/bloggie/administration
</p>
<p>aşağıdaki şekilde yazılan test sayfasının çalıştığı görülecektir<span style="font-family:Times New Roman; font-size:12pt">.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/112110_1613_Dolphin7ile12.png" alt=""/><span style="font-family:Times New Roman; font-size:12pt"><br />
		</span></p>
<p><span style="font-family:Times New Roman; font-size:18pt"><strong>3.2. Modül Ayarlarının Eklenmesi<br />
</strong></span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Bu aşamada SQL komtuları kullanacağımızı düşünürsek, <strong>install.sql</strong> ve <strong>uninstall.sql</strong> dosyalarını hazırlamamız gerekir. İşe, <strong>bloggie/install/config.php</strong> dosyasını aşağıdaki hale getirerek başlayalım:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;install&#8217; =&gt; array(<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;update_languages&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    ),<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;uninstall&#8217; =&gt; array (<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;update_languages&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    ),<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Yukarıdaki mevcut dosyayı, aşağıdaki hale getiriyoruz:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;install&#8217; =&gt; array(<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;update_languages&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;execute_sql&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    ),<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    &#8216;uninstall&#8217; =&gt; array (<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;update_languages&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">        &#8216;execute_sql&#8217; =&gt; 1,<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">    ),<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Ayrıca <strong>install.sql</strong> ve <strong>uninstall.sql</strong> dosyaları, ilgili modül ayarlarının saklanması için düzenlenmeli. Bu dosyalar install ve uninstall işlemleri sırasında otomatik olarak çalışmaktadır.<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>install.sql</strong> dosyasını aşağıdaki hale getiriyoruz:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">SET @iMaxOrder = (SELECT `menu_order` + 1 FROM `sys_options_cats` ORDER BY `menu_order` DESC LIMIT 1);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">INSERT INTO `sys_options_cats` (`name`, `menu_order`) VALUES (&#8216;My Bloggie&#8217;, @iMaxOrder);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">SET @iCategId = (SELECT LAST_INSERT_ID());<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">INSERT INTO `sys_options` (`Name`, `VALUE`, `kateg`, `desc`, `Type`, `check`, `err_text`, `order_in_kateg`, `AvailableValues`) VALUES<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">(&#8216;me_blgg_date_format&#8217;, &#8216;Y-m-d H:i&#8217;, @iCategId, &#8216;Format for server date/time&#8217;, &#8216;digit&#8217;, &#8221;, &#8221;, &#8217;1&#8242;, &#8221;),<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">(&#8216;me_blgg_enable_js_date&#8217;, &#8216;on&#8217;, @iCategId, &#8216;Show user time&#8217;, &#8216;checkbox&#8217;, &#8221;, &#8221;, &#8217;2&#8242;, &#8221;);<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt"><strong>uninstall.sql</strong> dosyasını da aşağıdaki hale getirelim:<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">&#8211; settings<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">SET @iCategId = (SELECT `ID` FROM `sys_options_cats` WHERE `name` = &#8216;My Bloggie&#8217; LIMIT 1);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">DELETE FROM `sys_options` WHERE `kateg` = @iCategId;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">DELETE FROM `sys_options_cats` WHERE `ID` = @iCategId;<br />
</span></p>
<p><span style="font-family:Times New Roman; font-size:12pt">Önemli bir nokta, bütün ayarların, <strong>sys_options</strong> tablosunda saklanması gerektiğidir. It is better to assign every setting option some category which is stored in the <strong>sys_options_cats</strong> database table, because it makes it easier to delete created categories in uninstall and display them. Also, it is good practice to make a prefix for all of your setting names to avoid conflicts with other mods.<br />
</span></p>

<p class="sayac_bilgi">89 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/11/21/dolphin-7-ile-modul-gelistirme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ dili ile Kapsülleme (Encapsulation)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 05:59:16 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bu yazının amacı, nesne yönelimli programlama kavramlarından birisi olan kapsülleme işlemini (encapsulation), C++ dili üzerinden anlatmaktır. Kapsülleme veya diğer adıyla veri kapsülleme işlemi, basitçe bir sınıfın (class) dışarıya karşı kapalı hale getirilmesi ve sınıfa erişimin kapsüllenmesi yani engellenmesidir. Bilindiği üzere, sınıflar, özelliklerden (properties) ve metotlardan (methods) oluşmaktadır. Veri kapsüllemesinin amacı, [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER
</p>
<p>Bu yazının amacı, nesne yönelimli programlama kavramlarından birisi olan kapsülleme işlemini (encapsulation), C++ dili üzerinden anlatmaktır.
</p>
<p>Kapsülleme veya diğer adıyla veri kapsülleme işlemi, basitçe bir sınıfın (class) dışarıya karşı kapalı hale getirilmesi ve sınıfa erişimin kapsüllenmesi yani engellenmesidir. Bilindiği üzere, sınıflar, özelliklerden (properties) ve metotlardan (methods) oluşmaktadır. Veri kapsüllemesinin amacı, sınıfta bulunan özelliklerin erişimini kontrol altına almak ve sınıfın özelliklerinin dışarıdan erişimini engelleerek, sınıftaki metotlar marifetiyle erişimi kontrol etmektir.
</p>
<p>Örneğin bir rasyonel sayı sınıfımız aşağıdaki şekilde olsun.
</p>
<p>class rasyonelSayı{
</p>
<p>    int pay;
</p>
<p>    int payda;
</p>
<p>};
</p>
<p>Rasyonel sayı işlemlerinin yapılacağı sınıfı yukarıdaki şekilde tanımladık.
</p>
<p>public float rasyonelSayı::bölme(rasyonelSayı başkasayı){
</p>
<p>    return pay*başkasayı.payda / payda * başkasayı.pay;
</p>
<p>}
</p>
<p>Yukarıdaki bu metot tanımına göre aşağıdaki şekilde bir main fonksiyonu yazıp kullanmak mümkündür.
</p>
<p>int main(){
</p>
<p> tamsayı a,b;
</p>
<p> a.pay = 4;
</p>
<p> a.payda=6;
</p>
<p> b.pay = 2;
</p>
<p> b.payda=5;
</p>
<p> cout &lt;&lt; a.bölme(b) &lt;&lt; endl;
</p>
<p>}
</p>
<p>Görüldüğü üzere, a ve b isminde iki adet tam sayı tanımlanmış ve bu sayılar üzerinde bir bölme işlemi uygulanmıştır.
</p>
<p>Yukarıdaki sınıf tanımı ve bölme işlemi herhangi bir problem içermezken, aşağıdaki gibi bir bölme işlemi sorun oluşturabilir:
</p>
<p>int main(){
</p>
<p> tamsayı a,b;
</p>
<p> a.pay = 4;
</p>
<p> a.payda=6;
</p>
<p> b.pay = 0;
</p>
<p> b.payda=5;
</p>
<p> cout &lt;&lt; a.bölme(b) &lt;&lt; endl;
</p>
<p>}
</p>
<p>Yeni kodumuzda, b nesnesinin (object) değeri 0 olarak atanmıştır ve bilindiği üzere matematikte 0&#8242;a bölme işlemi bir hatadır. Herhangi bir sayı, 0&#8242;a bölünemez.
</p>
<p>Bu hatayı kodumuzda engellememiz ne yazık ki mümkün değildir ve bizim tamsayı metodumuzu kullanan herhangi birisi dilediği sayıyı atayabilir.
</p>
<p>Bu hatayı engellemek için bölme işleminin içerisinde bir kontrol yazılması yeterlidir.
</p>
<p>public float rasyonelSayı::bölme(rasyonelSayı başkasayı){
</p>
<p>    if(payda * başkasayı.pay != 0)
</p>
<p>        return pay*başkasayı.payda / payda * başkasayı.pay;
</p>
<p>    else
</p>
<p>        return 0;
</p>
<p>}
</p>
<p>Yeni fonksiyonumuzda, bölme işleminden önce, yeni payda değeri kontrol edilmiştir. Bu kontrol bölme işleminin güvenli olmasını sağlar ancak hala kodumuzda bir hata bulunmaktadır. Aşağıdaki main fonksiyonunu ele alalım:
</p>
<p>int main(){
</p>
<p> tamsayı a,b;
</p>
<p> a.pay = 4;
</p>
<p> a.payda=6;
</p>
<p> b.pay = 3;
</p>
<p> b.payda=0;
</p>
<p> cout &lt;&lt; a.bölme(b) &lt;&lt; endl;
</p>
<p>}
</p>
<p>Yukarıdaki yeni kodumuzda, b sayısının payda değeri 0 olarak atanmıştır. Bu durumda bölme işlemi için bir problem olmamakla birlikte b sayısının kendisi için bir problemden bahsedilebilir. Yani b sayısı, bir rasyonel sayı olarak belirsizdir.
</p>
<p>O halde sınıfımızdaki pay ve payda değişkenlerinin (properties) doğrudan atanması problem teşkil etmektedir. Bu problemin çözümü ise ancak kontrolünü bizim yaptığımız bir atama yöntemi olan kapsülleme (encapsulation) işlemidir.
</p>
<p>class rasyonelSayı{
</p>
<p>private:
</p>
<p>    int pay;
</p>
<p>    int payda;
</p>
<p>public:
</p>
<p>    void setPay(int x){ pay = x; }
</p>
<p>    void setPayda(int x) { payda = x; }
</p>
<p>    int getPay(){ return pay; }
</p>
<p>    int getPayda(){ return payda; }
</p>
<p>};
</p>
<p>Yukarıdaki yeni sınıfta, pay ve payda değişkenlerine atama işlemi bizim kontrolümüz altına girmiştir. Kısacası literatürde getter / setter fonksiyonları olarak bilinen ve Türkçeye alıcı/atayıcı fonksiyonları olarak çevirebileceğimiz, ve bir sınıftaki değişkenlerin değerlerini almak veya atamak için kullanılan fonksiyonlar dışında, bu sınıfta bulunan değişkenlere erişimi engellemiş olduk.
</p>
<p>Aslında, bir değişken üzerinde yapılabilecek iki temel işlem almak ve atamaktır. Yukarıdaki yeni sınıf tanımımızda henüz problemimizi çözen bir tedbir bulunmasa da artık yazmamız mümkündür:
</p>
<p>class rasyonelSayı{
</p>
<p>private:
</p>
<p>    int pay;
</p>
<p>    int payda;
</p>
<p>public:
</p>
<p>    void setPay(int x){ pay = x; }
</p>
<p>    void setPayda(int x) {
</p>
<p>        if (x!=0)
</p>
<p style="margin-left: 72pt">payda = x;
</p>
<p> }
</p>
<p>    int getPay(){ return pay; }
</p>
<p>    int getPayda(){ return payda; }
</p>
<p>};
</p>
<p>Görüldüğü üzere, setPayda fonksiyonu içerisinde kontrol edilerek atama işlemi yapılmaktadır. Dolayısıyla artık payda değeri konulmadan önce 0 olup olmadığı kontrol edilecek ve uygunsa atama işlemi yapılacaktır.
</p>
<p>Bu kontrolden sonra main fonksiyonumuz aşağıdaki şekilde olacaktır:
</p>
<p>int main(){
</p>
<p> tamsayı a,b;
</p>
<p> a.setPay ( 4 );
</p>
<p> a.setPayda (6);
</p>
<p> b.setPay ( 3);
</p>
<p> b.setPayda(0);
</p>
<p> cout &lt;&lt; a.bölme(b) &lt;&lt; endl;
</p>
<p>}
</p>
<p>Görüldüğü üzere, artık sınıfımızdaki değişkenlere, nesnelerin doğrudan erişimi mümkün olmamaktadır. Bu erişim, bizim kontrolümüzde olan fonksiyonlar marifetiyle yapılmakta, dolayısıyla bizim kontrolümüzden geçmektedir.</p>

<p class="sayac_bilgi">148 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/10/25/c-dili-ile-kapsulleme-encapsulation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

