<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3584817823557811623</atom:id><lastBuildDate>Thu, 24 Oct 2024 18:57:31 +0000</lastBuildDate><category>apache</category><category>commons</category><category>lang</category><category>CharSetUtils</category><category>Facebook</category><category>NullPointerException</category><category>NumberUtils</category><category>ObjectUtils</category><category>RandomUtils</category><category>SerializationUtils</category><category>StringEscapeUtils</category><category>StringUtils</category><category>arkadaş</category><category>builder</category><category>chat</category><category>compareTo</category><category>equals</category><category>hashCode</category><category>io</category><category>jabber</category><category>java</category><category>kütüphane</category><category>math</category><category>null safe</category><category>online</category><category>sınıf</category><category>takip</category><category>time</category><category>toString</category><category>xmpp</category><category>yardımcı</category><category>çevrimiçi</category><title>Kahvenin Hatırı</title><description>Java, Linux, Açık Kaynak, Aşk, Hayat... hakkında desem çok mu iddialı olur?</description><link>http://kahveninhatiri.blogspot.com/</link><managingEditor>noreply@blogger.com (Unknown)</managingEditor><generator>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-1231627380535589344</guid><pubDate>Mon, 30 May 2011 14:21:00 +0000</pubDate><atom:updated>2011-05-30T17:21:47.115+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">commons</category><category domain="http://www.blogger.com/atom/ns#">lang</category><category domain="http://www.blogger.com/atom/ns#">time</category><title>Apache Commons Lang Kütüphanesi-3: lang.time.* Paketi</title><description>&lt;a href=&quot;http://commons.apache.org/lang&quot;&gt;Lang &lt;/a&gt;kütüphanesini incelemeye &lt;i&gt;org.apache.commons.lang.time&amp;nbsp;&lt;/i&gt;paketi ile devam ediyoruz.&lt;br /&gt;
&lt;br /&gt;
Bu pakette bulunan sınıflar, zaman değerleriyle ilgili işlemler yapmak için daha pratik yöntemler sunar:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.apache.commons.lang.time.StopWatch;

import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

public class TimeTrial {
    public static void main(String[] args) {
        //Tarihi dd-MM-yyyy biçiminde göster
        System.out.println(&quot;1) dd-MM-yyyy &amp;gt;&amp;gt;&amp;gt;&quot; +
            DateFormatUtils.format(new Date(), &quot;dd-MM-yyyy&quot;));

        //Tarihi SMTP_DATETIME_FORMAT biçiminde göster 
        System.out.println(&quot;2) SMTP_DATETIME_FORMAT &amp;gt;&amp;gt;&amp;gt;&quot; +
            DateFormatUtils.SMTP_DATETIME_FORMAT.format(new Date()));

        //Tarihi ISO_DATE_FORMAT biçiminde göster 
        System.out.println(&quot;3) ISO_DATE_FORMAT &amp;gt;&amp;gt;&amp;gt;&quot; +
            DateFormatUtils.ISO_DATE_FORMAT.format(new Date()));

        //Girilen milisaniye değerini tarih olarak göster
        System.out.println(&quot;4) MMM dd yy HH:mm &amp;gt;&amp;gt;&amp;gt;&quot; +
            DateFormatUtils.format(System.currentTimeMillis(), &quot;MMM dd yy HH:mm&quot;));

        //Girilen milisaniye değerini UTC biçiminde tarih olarak göster
        System.out.println(&quot;5) MM/dd/yy HH:mm &amp;gt;&amp;gt;&amp;gt;&quot; +
            DateFormatUtils.formatUTC(System.currentTimeMillis(),
                &quot;MM/dd/yy HH:mm&quot;));

        StopWatch stWatch = new StopWatch();

        //StopWatch&#39;ı başlat
        stWatch.start();

        //Pazartesi&#39;den başlamak üzere haftanın tüm günleri için iterator nesnesi al.
        Iterator itr = DateUtils.iterator(new Date(),
                DateUtils.RANGE_WEEK_MONDAY);

        while (itr.hasNext()) {
            Calendar gCal = (Calendar) itr.next();
            System.out.println(gCal.getTime());
        }

        //StopWatch&#39;ı sonlandır
        stWatch.stop();
        System.out.println(&quot;Time Taken &amp;gt;&amp;gt;&quot; + stWatch.getTime());
    }
}
&lt;/pre&gt;&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;1) dd-MM-yyyy &amp;gt;&amp;gt;&amp;gt;09-12-2003
2) SMTP_DATETIME_FORMAT &amp;gt;&amp;gt;&amp;gt;Tue, 09 Dec 2003 00:34:47 +0530
3) ISO_DATE_FORMAT &amp;gt;&amp;gt;&amp;gt;2003-12-09
4) MMM dd yy HH:mm &amp;gt;&amp;gt;&amp;gt;Dec 09 03 00:34
5) MM/dd/yy HH:mm &amp;gt;&amp;gt;&amp;gt;12/08/03 19:04
Mon Dec 08 00:00:00 GMT+05:30 2003
Tue Dec 09 00:00:00 GMT+05:30 2003
Wed Dec 10 00:00:00 GMT+05:30 2003
Thu Dec 11 00:00:00 GMT+05:30 2003
Fri Dec 12 00:00:00 GMT+05:30 2003
Sat Dec 13 00:00:00 GMT+05:30 2003
Sun Dec 14 00:00:00 GMT+05:30 2003
Time Taken &amp;gt;&amp;gt;31
&lt;/pre&gt;&lt;br /&gt;
Bu örneklerde tarih bilgisini biçimlendirmeye örnek vermek için SMTP_DATE_FORMAT ve ISO_DATE_FORMAT biçimleri kullanılmıştır. Bu ikisi dışında DateFormatUtils sınıfında 7 ayrı biçim daha vardır. Hiçbiri işinize yaramazsa kendi biçimlendirmenizi de tanımlayabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
StopWatch sınıfı da bir çeşit kronometre uygulamasıdır.&lt;br /&gt;
&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/05/apache-commons-lang-kutuphanesi-3_30.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-3577109557559243348</guid><pubDate>Mon, 30 May 2011 13:05:00 +0000</pubDate><atom:updated>2011-05-30T16:05:13.471+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">commons</category><category domain="http://www.blogger.com/atom/ns#">lang</category><category domain="http://www.blogger.com/atom/ns#">math</category><category domain="http://www.blogger.com/atom/ns#">NumberUtils</category><category domain="http://www.blogger.com/atom/ns#">RandomUtils</category><title>Apache Commons Lang Kütüphanesi-3: lang.math.* Paketi</title><description>&lt;a href=&quot;http://commons.apache.org/lang&quot;&gt;Lang &lt;/a&gt;kütüphanesini incelemeye &lt;i&gt;org.apache.commons.lang.math&lt;/i&gt; paketi ile devam ediyoruz.&lt;br /&gt;
&lt;br /&gt;
Bu pakette bulunan sınıflar &lt;i&gt;java.math&lt;/i&gt; paketindekilere ek özellikler katar. İncelemeye değer en önemli sınıf &lt;b&gt;NumberUtils&lt;/b&gt;&#39;dir. Diğer sınıflar bu sınıfın kullandığı bazı tanımlamaları içerir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.math.RandomUtils;

import java.math.BigDecimal;

public class MathUtilsTrial {
    public static void main(String[] args) {
        //İki double değeri karşılaştır
        System.out.println(&quot;(FIRST &amp;gt; SECOND) &amp;gt;&amp;gt;&amp;gt; &quot; +
            NumberUtils.compare(2.11, 1.11));
        System.out.println(&quot;(FIRST &amp;lt; SECOND) &amp;gt;&amp;gt;&amp;gt; &quot; +
            NumberUtils.compare(1.11, 2.11));
        System.out.println(&quot;(FIRST == SECOND) &amp;gt;&amp;gt;&amp;gt; &quot; +
            NumberUtils.compare(1.11, 1.11));

        //Karakter katarından bir BigDecimal oluştur
        BigDecimal bDecimal = NumberUtils.createBigDecimal(&quot;123456789&quot;);

        //Bir karakter katarının sadece sayılardan oluştuğunu doğrular
        System.out.println(&quot;Is Digits &amp;gt;&amp;gt;&amp;gt; &quot; + NumberUtils.isDigits(&quot;123.123&quot;));

        //Bir karakter katarının geçerli bir sayı ifade ettiğini doğrular
        System.out.println(&quot;Is Number &amp;gt;&amp;gt;&amp;gt; &quot; + NumberUtils.isNumber(&quot;123.123&quot;));

        //Dizinin en büyük elemanını döner
        System.out.println(&quot;MAX &amp;gt;&amp;gt;&amp;gt; &quot; +
            NumberUtils.max(new double[] { 3.33, 8.88, 1.11 }));

        //Karakter katarını int değere çevirir. Çeviremezse öntanımlı değeri döner: 77
        System.out.println(&quot;String to Int &amp;gt;&amp;gt;&amp;gt; &quot; +
            NumberUtils.toInt(&quot;ABCD&quot;, 77));

        //Rastgele sayıla üretir
        System.out.println(&quot;Random double &amp;gt;&amp;gt;&amp;gt; &quot; + RandomUtils.nextDouble());
        System.out.println(&quot;Random float &amp;gt;&amp;gt;&amp;gt; &quot; + RandomUtils.nextFloat());
        System.out.println(&quot;Random int &amp;gt;&amp;gt;&amp;gt; &quot; + RandomUtils.nextInt());
    }
}
&lt;/pre&gt;&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;(FIRST &amp;gt; SECOND) &amp;gt;&amp;gt;&amp;gt; 1
(FIRST &amp;lt; SECOND) &amp;gt;&amp;gt;&amp;gt; -1
(FIRST == SECOND) &amp;gt;&amp;gt;&amp;gt; 0
Is Digits &amp;gt;&amp;gt;&amp;gt; false
Is Number &amp;gt;&amp;gt;&amp;gt; true
MAX &amp;gt;&amp;gt;&amp;gt; 8.88
String to Int &amp;gt;&amp;gt;&amp;gt; 77
Random double &amp;gt;&amp;gt;&amp;gt; 0.2720979622981403
Random float &amp;gt;&amp;gt;&amp;gt; 0.8221457
Random int &amp;gt;&amp;gt;&amp;gt; 738187848
&lt;/pre&gt;&lt;br /&gt;
&lt;i&gt;compare()&lt;/i&gt; metodu, iki değer eşitse 0, ilk değer daha büyükse 1, ikinci değer daha büyükse -1 döner.&lt;br /&gt;
&lt;br /&gt;
Dikkate değer bir diğer metod da &lt;i&gt;createNumber()&lt;/i&gt;&#39;dır. Bu metod bir karakter katarını &amp;nbsp;&lt;i&gt;java.lang.Number&lt;/i&gt;&amp;nbsp;&#39;ın alt tiplerinden uygun olan bir tanesine dönüştürür. Daha detaylı açıklarsak, bildiğiniz gibi Java&#39;da bütün sayısal sarıcı sınıflar (&lt;i&gt;Integer, Float, Double...&lt;/i&gt;)&lt;i&gt; java.lang.Number&lt;/i&gt;&#39;ın alt sınıfıdır.&amp;nbsp;&amp;nbsp;&lt;i&gt;createNumber()&lt;/i&gt; neredeyse bütün sayısal gösterimlerden anlar (&lt;i&gt;int, float, double, hex, binary, octal, &lt;/i&gt;...) ve bulduğu sayıyı uygun tipte döner.&lt;br /&gt;
&lt;br /&gt;
Bu pakette ayrıca &lt;b&gt;xxxRange &lt;/b&gt;kalıbında birkaç sınıf daha vardır. Bu sınıfları kullanarak &lt;i&gt;double, float, int &lt;/i&gt;ve &lt;i&gt;long&lt;/i&gt; tipleri için sayı aralıkları tanımlayabilir ve herhangi bir değerin bu aralıkta olup olmadığını kontrol edebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/05/apache-commons-lang-kutuphanesi-3.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4281444047227594529</guid><pubDate>Mon, 30 May 2011 05:21:00 +0000</pubDate><atom:updated>2011-05-30T15:07:23.806+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">builder</category><category domain="http://www.blogger.com/atom/ns#">commons</category><category domain="http://www.blogger.com/atom/ns#">compareTo</category><category domain="http://www.blogger.com/atom/ns#">equals</category><category domain="http://www.blogger.com/atom/ns#">hashCode</category><category domain="http://www.blogger.com/atom/ns#">lang</category><category domain="http://www.blogger.com/atom/ns#">toString</category><title>Apache Commons Lang Kütüphanesi-2: lang.builder.* Paketi</title><description>&lt;a href=&quot;http://commons.apache.org/lang/&quot;&gt;Lang &lt;/a&gt;kütüphanesini incelemeye &lt;i&gt;org.apache.commons.lang.builder&lt;/i&gt; paketi ile devam ediyoruz.&lt;br /&gt;
&lt;br /&gt;
Bu pakette kendi sınıflarınız için benzersiz olarak oluşturmanız gereken &lt;i&gt;&lt;span class=&quot;fixed&quot;&gt;equals&lt;/span&gt;, &lt;span class=&quot;fixed&quot;&gt;toString&lt;/span&gt;, &lt;span class=&quot;fixed&quot;&gt;hashCode&lt;/span&gt;&lt;/i&gt;, ve &lt;i&gt;&lt;span class=&quot;fixed&quot;&gt;compareTo&lt;/span&gt; &lt;/i&gt;metotlarını daha kolay üretebilmeniz için yardımcı birkaç sınıf bulunur. Şimdi bütün kayda değer metotların kullanıldığı bir örnek görelim ve hepsini teker teker açıklayalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class BuilderTrial {
    private String name;
    private int age;

    public BuilderTrial(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        //Birkaç nesne oluşturalım.
        BuilderTrial one = new BuilderTrial(&quot;Becker&quot;, 35);
        BuilderTrial two = new BuilderTrial(&quot;Becker&quot;, 35);
        BuilderTrial three = new BuilderTrial(&quot;Agassi&quot;, 33);

        //one ve two farklı nesnelerde aynı verileri tutuyor.
        //three nesnesi ise farklı veri barındırıyor.
        System.out.println(&quot;One&amp;gt;&amp;gt;&amp;gt;&quot; + one);
        System.out.println(&quot;Two&amp;gt;&amp;gt;&amp;gt;&quot; + two);
        System.out.println(&quot;Three&amp;gt;&amp;gt;&amp;gt;&quot; + three);

        System.out.println(&quot;one equals two? &quot; + one.equals(two));
        System.out.println(&quot;one equals three? &quot; + one.equals(three));

        //one ve two aynı verileri barındırdığı için, aynı hashcode dönülür.
        System.out.println(&quot;One HashCode&amp;gt;&amp;gt;&amp;gt; &quot; + one.hashCode());
        System.out.println(&quot;Two HashCode&amp;gt;&amp;gt;&amp;gt; &quot; + two.hashCode());
        System.out.println(&quot;Three HashCode&amp;gt;&amp;gt;&amp;gt; &quot; + three.hashCode());
    }

    public boolean equals(Object objCompared) {
        if (!(objCompared instanceof BuilderTrial)) {
            return false;
        }

        BuilderTrial rhs = (BuilderTrial) objCompared;

        return new EqualsBuilder().append(name, rhs.name).append(age, rhs.age)
                                  .isEquals();
    }

    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append(&quot;Name&quot;,
            name).append(&quot;Age&quot;, age).toString();
    }

     public int compareTo(Object o) {
     BuilderTrial builderTrial = (BuilderTrial ) o;
     return new CompareToBuilder()
       .appendSuper(super.compareTo(o)
       .append(this.name, builderTrial.name)
       .append(this.age,  builderTrial.age)
       .toComparison();
    }

    public int hashCode() {
        return new HashCodeBuilder(15, 19).append(name).append(age).toHashCode();
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;One&amp;gt;&amp;gt;&amp;gt;BuilderTrial@5[
  Name=Becker
  Age=35
]
Two&amp;gt;&amp;gt;&amp;gt;BuilderTrial@6[
  Name=Becker
  Age=35
]
Three&amp;gt;&amp;gt;&amp;gt;BuilderTrial@7[
  Name=Agassi
  Age=33
]
one equals two? true
one equals three? false
One HashCode&amp;gt;&amp;gt;&amp;gt; -923455822
Two HashCode&amp;gt;&amp;gt;&amp;gt; -923455822
Three HashCode&amp;gt;&amp;gt;&amp;gt; -1433293806
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Bir sınıf için equals metodu yazmak, eğer çok fazla üyesi varsa, sayısız &lt;b&gt;if&lt;/b&gt; ile boğuşmanızı gerektirebilir. &lt;b&gt;EqualsBuilder &lt;/b&gt;sınıfı bu iş için size daha kolay bir yol sunar. Örneğini yukarıda da gördüğünüz gibi, tek yapmanız gereken EqualsBuilder&#39;ın bir örneğinin oluşturup, bu nesne üzerinde, eşitlik kontrolü yapacağınız her alan için &lt;b&gt;append() &lt;/b&gt;metodunu çağırmaktır. Tabi en son olarak da &lt;b&gt;isEquals() &lt;/b&gt;metounu çağırmayı unutmayın.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ToStringBuilder &lt;/b&gt;sınfı &lt;b&gt;toString()&lt;/b&gt; metodunun daha anlamlı ve okunabilir çıktılar üretmesini sağlamak için kullanılır. &lt;b&gt;EqualsBuilder &lt;/b&gt;sınıfına benzer şekilde, &lt;b&gt;ToStringBuilder&lt;/b&gt;&#39;ın bir örneğini oluşturup, üretilecek çıktının biçimini belirtip sonra &lt;b&gt;toString()&lt;/b&gt; metodunda olmasını istediğiniz detayları &lt;b&gt;append()&lt;/b&gt; ile eklemeniz kafidir. Yine en son &lt;b&gt;toString() &lt;/b&gt;metodunu çağırmayı unutmayın tabi.&lt;br /&gt;
&lt;br /&gt;
ToStringBuilder&#39;ı kullanırken çıktı biçimini belirtmek zorunlu değildir. Belirtilmezse &lt;b&gt;DEFAULT_STYLE &lt;/b&gt;kullanılır. Diğer biçimler de şunlardır: &lt;b&gt;MULTI_LINE_STYLE, NO_FIELD_NAMES_STYLE, SHORT_PREFIX_STYLE, SIMPLE_STYLE.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Eğer kendi çıktı biçiminizi tanımlamak isterseniz &lt;b&gt;StandartToStringStyle &lt;/b&gt;sınıfını genişletebilirsiniz(&lt;b&gt;extend&lt;/b&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;HashCodeBuilder &lt;/b&gt;sınıfı &lt;b&gt;hashCode() &lt;/b&gt;metodunu daha pratik yoldan üretmek için tasarlanmıştır. Diğer &lt;b&gt;xxxBuilder&lt;/b&gt; sınıflarından farklı olarak, HashCodeBuilde&#39;ın örneğini oluştururken, iki tane rastgele seçilmiş tek ve sıfırdan farklı sayı belirtirsiniz. Asal sayı kullanmanız tavsiye edilir! Sonra öncekiler gibi &lt;b&gt;append() &lt;/b&gt;ile hashcode&#39;da olmasını istediğiniz alanları ekler, &lt;b&gt;toHashCode()&lt;/b&gt; ile hashcode&#39;u oluşturursunuz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;HashCodeBuilde, EqualsBuilder&lt;/b&gt; ile ortak çalışır. Yani &quot;&lt;b&gt;equals()&lt;/b&gt; metodu &lt;b&gt;true &lt;/b&gt;dönen iki nesne için hashcode&#39;lar eşit olmalıdır&quot; kuralına uyar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CompareToBuilder &lt;/b&gt;da neredeyse aynıdır. Argüman olan Object referansını uygun tipe dönüştürdükten(cast) sonra CompareToBuilder&#39;ın bir örneğini oluşturup, karşılaştırmak istediğiniz alanları &lt;b&gt;append() &lt;/b&gt;ile ekleyip, sonra &lt;b&gt;toComparison() &lt;/b&gt;metodunu çağırarak karşılaştırma işlemini gerçekleştirebilirsiniz. &lt;b&gt;append()&lt;/b&gt; için sadece çalıştığınız sınıfın alanları ile sınırlı olmadığınıza dikkat edin. Örneğin biz burada &lt;b&gt;appendSuper() &lt;/b&gt;ile bir üst sınıfın &lt;b&gt;compareTo() &lt;/b&gt;metodunu da hesaplamamıza kattık.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Hepsinin Kısayolu&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Bütün bu anlattığımız örneklerin Java Reflection API kullanan bariz bir şekilde daha kısa bir yolu var.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}
public String toString() {
    return ToStringBuilder.reflectionToString(this
           , ToStringStyle.MULTI_LINE_STYLE);
}

public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}

public int compareTo(Object o) {
   return CompareToBuilder.reflectionCompare(this, o);
}
&lt;/pre&gt;&lt;br /&gt;
Bu örneklerdeki kodda neredeyse herşey otomatikleştirilmiştir. Metodların içindeki tek satırlık kodlar, Java&#39;nın Reflection özelliklerini kullanarak, ilgili sınıfın bütün alanlarına erişir ve karşılaştırma ve hesaplama işlemlerini bizim müdahalemize gerek kalmadan gerçekleştirir. Ancak bu yaklaşımın bir eksi yanı vardır. Diğer yönteme göre bariz şekilde yavaştır ve oluşturulan kod üzerinde çok daha az kontrolümüz vardır.&lt;br /&gt;
&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/05/apache-commons-lang-kutuphanesi-2.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-6007685000487849041</guid><pubDate>Fri, 27 May 2011 00:03:00 +0000</pubDate><atom:updated>2011-05-27T12:52:10.849+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">CharSetUtils</category><category domain="http://www.blogger.com/atom/ns#">commons</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">kütüphane</category><category domain="http://www.blogger.com/atom/ns#">lang</category><category domain="http://www.blogger.com/atom/ns#">null safe</category><category domain="http://www.blogger.com/atom/ns#">NullPointerException</category><category domain="http://www.blogger.com/atom/ns#">ObjectUtils</category><category domain="http://www.blogger.com/atom/ns#">SerializationUtils</category><category domain="http://www.blogger.com/atom/ns#">StringEscapeUtils</category><category domain="http://www.blogger.com/atom/ns#">StringUtils</category><title>Apache Commons Lang Kütüphanesi-1: lang.* Paketi</title><description>Apache &lt;a href=&quot;http://commons.apache.org/&quot;&gt;Commons &lt;/a&gt;projesini incelemeye &lt;a href=&quot;http://commons.apache.org/lang/&quot;&gt;Lang &lt;/a&gt;kütüphanesi ile devam ediyoruz.&lt;br /&gt;
&lt;br /&gt;
Lang kütüphanesi JDK&#39;nın &lt;i&gt;&lt;b&gt;java.lang&lt;/b&gt;&lt;/i&gt; paketine bazı genel, çok sık kullanılan, her programcının işine yarayabilecek bileşenler ekler. Şimdi bunlardan en çok göze çarpanları inceleyelim. Açıklamaları yazarken zaman kaybetmemek için kodun içinde yapacağım.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CharsetUtils &lt;/b&gt;sınıfı karakterlerle alakalı işlemler için birkaç yardımcı statik metod barındırır. Not: &lt;b&gt;Her ne kadar aşağıdaki kod örneklerinde aranacak karakterleri (ikinci parametre) String olarak belirtsek de, içindeki karakterlerin hepsi için tek tek kontrol yapılır.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.CharSet;
import org.apache.commons.lang.CharSetUtils;
public class CharSetUtilsDeneme {
    public static void main(String[] args) {
        //Birinci parametredeki String&#39;in içinde,
        //İkinci parametredeki karakterleri sayar.
        System.out.println(&quot;B and o count = &quot; +
            CharSetUtils.count(&quot;BorisBecker&quot;, &quot;Bo&quot;)); //3
        System.out.println(&quot;B,o,k,e and r count = &quot; +
            CharSetUtils.count(&quot;BorisBecker&quot;, new String[] { &quot;Bo&quot;, &quot;ker&quot; })); //8

        //Birinci parametredeki String&#39;in içinden,
        //İkinci parametredeki karakterleri siler.
        System.out.println(&quot;Delete B and o = &quot; +
            CharSetUtils.delete(&quot;BorisBecker&quot;, &quot;Bo&quot;)); //risecker
        System.out.println(&quot;Delete B,o,k,e and r = &quot; +
            CharSetUtils.delete(&quot;BorisBecker&quot;, new String[] { &quot;Bo&quot;, &quot;ker&quot; })); //isc

        //Birinci parametredeki String&#39;in içinde,
        //sadece ikinci parametredeki karakterleri tutar. Diğerlerini siler.
        System.out.println(&quot;Keep B and o = &quot; +
            CharSetUtils.keep(&quot;BorisBecker&quot;, &quot;Bo&quot;)); //BoB

        //Birinci parametredeki String&#39;in içinden,
        //İkinci parametredeki karakterlerin tekrarlarını siler.
        System.out.println(&quot;Squeeze B and o = &quot; +
            CharSetUtils.squeeze(&quot;BBoooorisbbbecker&quot;, &quot;Bo&quot;)); //Borisbbbecker
    }
}
&lt;/pre&gt;&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;B and o count = 3
B,o,k,e and r count = 8
Delete B and o = risecker
Delete B,o,k,e and r = isc
Keep B and o = BoB
Squeeze B and o = Borisbbbecker
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;ObjectUtils &lt;/b&gt;sınıfı &lt;i&gt;equals, toString&lt;/i&gt; gibi bütün sınıflar için ortak olan bazı metodların &lt;b&gt;NullPointerException&lt;/b&gt; fırlatılmasına karşı daha güvenilir olan biçimlerini içerir. Bu metodları kullanarak örneğin &lt;b&gt;null &lt;/b&gt;referanslı bir nesne için&lt;i&gt; toString&lt;/i&gt; metodu çağırıldığında &quot;&lt;b&gt;null&lt;/b&gt;&quot; yerine &quot;&quot; veya &quot;&lt;b&gt;Boş referans&lt;/b&gt;&quot; gibi istediğiniz bir karakter katarının dönülmesini sağlayabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.ObjectUtils;

/**
 * Bu sınıfta kullanılan metodların hepsi NullPointerException&#39;a
 * karşı güvenlidir. null veri girilse bile hata fırlatmaz
 */
public class ObjectUtilsTrial {
    public static void main(String[] args) {
        //ObjectUtilsTrial nesnelerini oluşturalım
        ObjectUtilsTrial one = new ObjectUtilsTrial();
        ObjectUtilsTrial two = one; //Aynı referans
        ObjectUtilsTrial three = new ObjectUtilsTrial(); //Yeni nesne
        ObjectUtilsTrial four = null;

        //birinci referans null ise ikinci nesneyi dön
        System.out.print(&quot;1) If null return DEFAULT &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(ObjectUtils.defaultIfNull(four, three));

        //equals kontrolü
  //ikisi de aynı nesneyi refere ediyor.
        System.out.print(&quot;2) References to the same object &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(ObjectUtils.equals(one, two));

  //equals kontrolü
        //farklı nesneleri refere ediyorlar.
        System.out.print(&quot;3) Check object references and not values &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(ObjectUtils.equals(one, three));

        //toString methodu çağırılır
        System.out.print(&quot;4) toSring gets invoked &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(one);

        //nesnenin detaylarını gösterir. toString metodu çağırılmaz
        System.out.print(&quot;5) Display object details &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(ObjectUtils.identityToString(one));

        //toString&#39;e null geçilse bile boş karakter katarı dönülür: &quot;&quot;
  //çıktı **** olacaktır
        System.out.print(&quot;6) Pass null and get back an Empty string &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(&quot;**&quot; + ObjectUtils.toString(null) + &quot;**&quot;);
  
  //null verinin hashCode&#39;u 0 olarak dönülür
  //çıktı **0** olacaktır
        System.out.print(&quot;6) Pass null and get back an Empty string &amp;gt;&amp;gt;&amp;gt;&quot;);
        System.out.println(&quot;**&quot; + ObjectUtils.hashCode(null) + &quot;**&quot;);
    }

    public String toString() {
        return &quot;toString Output&quot;;
    }
}

&lt;/pre&gt;&lt;br /&gt;
Bu paketteki bir başka yardımcı sınıf da &lt;b&gt;SerializationUtils&lt;/b&gt;&#39;dir. Java&#39;da en basit dosyaya okuma işlemi için bile bir ton sınıfla uğraşmanız gerekir. Bu sınıf serileştirme işlemini tek bir metod çağrısına kadar indirger. Tek yapmanız gereken serileştirmek istediğiniz veriyi ve çıktıyı vereceğiniz akışı belirmektir. Örneğin;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;//File to serialize object to
String fileName = &quot;testSerialization.ser&quot;;

//New file output stream for the file
FileOutputStream fos = new FileOutputStream(fileName);

//Serialize String
SerializationUtils.serialize(&quot;SERIALIZE THIS&quot;, fos);
fos.close();

//Open FileInputStream to the file
FileInputStream fis = new FileInputStream(fileName);

//Deserialize and cast into String
String ser = (String) SerializationUtils.deserialize(fis);
System.out.println(ser);
fis.close();
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;StringUtils &lt;/b&gt;sınıfı belki de bu pakette en çok kullanacağız sınıf olacak. İçinde 100&#39;den fazla statik metod bulunur. Bu metodlar &lt;b&gt;&lt;i&gt;java.lan.String&lt;/i&gt;&lt;/b&gt; sınıfınının karakter katarı işlemede yetersiz kaldığı durumlardaki boşluğu doldurur. Ayrıca hepsi &lt;b&gt;NullPointerException&lt;/b&gt;&#39;a karşı güvenilirdir. Şimdi bu metodlardan bazıları iş başında görelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.StringUtils;

public class StringUtilsTrial {
    public static void main(String[] args) {
        //12 karakter kısalt
        System.out.println(&quot;1) Abbreviate Once upon a time &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.abbreviate(&quot;Once upon a time &quot;, 12));

        //İki karakter katarının benzerliklerinin bittiği yerin indexini döner.
        System.out.println(
            &quot;2) Index Of Difference between ABCXYZ and ABCPQR &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.indexOfDifference(&quot;ABCXYZ&quot;, &quot;ABCPQR&quot;));

        //Karakter katarının sonundan, ikinci argümandaki katarı çıkar.
        System.out.println(&quot;3) Chomp END &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.chomp(&quot;A test String END&quot;, &quot;END&quot;));

        //İlk argümanın sadece ikinci argümandaki karakterleri içerdiğini doğrular
        System.out.println(&quot;4) Check if 643287460 contains only 0123456789 &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.containsOnly(&quot;643287460&quot;, &quot;0123456789&quot;));

        //İki argümanı karşılaştırır, farklı oldukları kısmı döner.
        System.out.println(&quot;5) Compare ABCDEFG and ABCdefg &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.difference(&quot;ABCDEFG&quot;, &quot;ABCdefg&quot;));

        //Girilen nesne referansı null ise, &quot;&quot; dönülür.
        //ObjectUtils.toString() ile aynıdır.
        System.out.println(&quot;6) Return default string &amp;gt;&amp;gt;&amp;gt;&quot; + &quot;**&quot; +
            StringUtils.defaultString(null) + &quot;**&quot;);

        //Dizideki bütün karakter katarlarını araya &quot;$#$&quot; koyarak bir katara yerleştirir
        System.out.println(&quot;7) Join Strings using separator &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.join(new String[] { &quot;AB&quot;, &quot;CD&quot;, &quot;EF&quot; }, &quot;$#$&quot;));

        //SubString
        System.out.println(&quot;8) Substring &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.substring(&quot;SUBSTRING&quot;, 1, 5));

        //Katarı ters çevirir.
        System.out.println(&quot;9) Reverse &amp;gt;&amp;gt;&amp;gt;&quot; + StringUtils.reverse(&quot;REVERSE&quot;));

        //Katardaki boşlukları budar. null ise &quot;&quot; döner.
        System.out.println(&quot;10) Trim String. No NullPointerException &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.trim(null));

        //Katardaki boşlukları budar. null ise &quot;&quot; döner.
        System.out.println(&quot;11) Empty String &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.trimToEmpty(null) + &quot;&amp;lt;&amp;lt;&amp;lt;&quot;);

        //Equals kontrolu yapar. NullPointerException fırlatmaz!
        System.out.println(&quot;12) Comapre null and null &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.equals(null, null));

        //Baştaki ve sondaki boşlukları budar
        //null ise &quot;&quot; döner.
        System.out.println(&quot;13) Strip whitespace &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.stripToEmpty(&quot;     ABCD      &quot;));

        //İlk argümandaki katarın &quot;!@#$%^&amp;amp;*&quot; karakterlerini içermediğini doğrular
        System.out.println(&quot;14) Check that ABCD contains none of !@#$%^&amp;amp;* &amp;gt;&amp;gt;&amp;gt;&quot; +
            StringUtils.containsNone(&quot;ABCD&quot;, &quot;!@#$%^&amp;amp;*&quot;));
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;SystemUtils &lt;/b&gt;sistem değişkenlerini okur ve uygun değerleri döner. Örneğin programınızın çalışacağı sistemin Java&#39;nın en az 1.3 sürümünü desteklemesinin istiyorsanız: &lt;i&gt;&lt;b&gt;SystemUtils.isJavaVersionAtLeast(1.3f)); &lt;/b&gt;&lt;/i&gt;metodunu kullanabilirsiniz. Örnek kullanım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.SystemUtils;

public class SystemUtilsTrial {
    public static void main(String[] args) {
        System.out.println(&quot;1) FILE_SEPARATOR =&quot; + SystemUtils.FILE_SEPARATOR);
        System.out.println(&quot;2) JAVA_EXT_DIRS =&quot; + SystemUtils.JAVA_EXT_DIRS);
        System.out.println(&quot;3) JAVA_HOME =&quot; + SystemUtils.JAVA_HOME);
        System.out.println(&quot;4) Is 1.3 + =&quot; +
            SystemUtils.isJavaVersionAtLeast(1.3f));
        System.out.println(&quot;5) JAVA_EXT_DIRS =&quot; + SystemUtils.JAVA_EXT_DIRS);
        System.out.println(&quot;6) JAVA_VENDOR =&quot; + SystemUtils.JAVA_VENDOR);
        System.out.println(&quot;7) OS_NAME =&quot; + SystemUtils.OS_NAME);
    }
}
&lt;/pre&gt;&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;1) FILE_SEPARATOR =\
2) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
3) JAVA_HOME =C:\JDeveloper\jdk\jre
4) Is 1.3 + =true
5) JAVA_EXT_DIRS =C:\JDeveloper\jdk\jre\lib\ext
6) JAVA_VENDOR =Sun Microsystems Inc.
7) OS_NAME =Windows 2000
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;ClassUtils &lt;/b&gt;sınıfı &lt;b&gt;Java Reflection API&lt;/b&gt;&#39;yi kullanmadan sınıflarınız hakkında daha detaylı bilgiye sahip olmanızı sağlar. Ancak bu metodları kullanırken iki kere düşünün. Çünkü çoğu durumda böyle bir özelliği kullanmanız yazılımınızın tasarımının kötü olduğu anlamına gelir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.ClassUtils;

public class ClassUtilsTrial {
    public static void main(String[] args) {
        System.out.println(&quot;1) Interfaces implemented by java.lang.String &amp;gt;&amp;gt;&amp;gt; &quot; +
            ClassUtils.getAllInterfaces(String.class));
        System.out.println(&quot;2) SuperClasses of java.lang.String &amp;gt;&amp;gt;&amp;gt; &quot; +
            ClassUtils.getAllSuperclasses(String.class));
        System.out.println(&quot;3) PackageName of a string &amp;gt;&amp;gt;&amp;gt; &quot; +
            ClassUtils.getPackageName(&quot;A String&quot;, &quot;IfNull&quot;));
        System.out.println(&quot;4) Every String is an Object = &quot; +
            ClassUtils.isAssignable(String.class, Object.class));
        System.out.println(&quot;5) Every Object is an String = &quot; +
            ClassUtils.isAssignable(Object.class, String.class));
    }
}
&lt;/pre&gt;&lt;br /&gt;
Çıktısı:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;1) Interfaces implemented by java.lang.String &amp;gt;&amp;gt;&amp;gt; [interface java.io.Serializable
, interface java.lang.Comparable, interface java.lang.CharSequence]
2) SuperClasses of java.lang.String &amp;gt;&amp;gt;&amp;gt; [class java.lang.Object]
3) PackageName of a string &amp;gt;&amp;gt;&amp;gt; java.lang
4) Every String is an Object = true
5) Every Object is an String = false
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;StringEscapeUtils &lt;/b&gt;sınıfı da yeri geldiğinde çok işinize yarayacak bir sınıftır. Program yazarken bazen Java sözdizimi ile&amp;nbsp; HTML, JavaScript, SQL gibi dillerin söz dizimleri karışabilir. Örneğin; bir servlet&#39;in &amp;lt;p&amp;gt;MyName&amp;lt;p&amp;gt; metnini ekrana basmasını isteyip doğrudan sayfaya yazdırırsanız, web sunucusu bunu HTML olarak olarak yorumlayıp &amp;lt;p&amp;gt;&amp;lt;p&amp;gt; etiketlerini kaldıracaktır: &lt;span class=&quot;fixed&quot;&gt;MyName. Bu hatadan kurtulmak için &lt;/span&gt;&lt;b&gt;StringEscapeUtils&lt;/b&gt;&#39;in sağladığı metodları kullanabilirsiniz. &lt;b&gt;StringEscapeUtils &lt;/b&gt; HTML&#39;den başka birçok dili daha desteklemekte:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;import org.apache.commons.lang.StringEscapeUtils;

public class StringEscapeUtilsTrial {
    public static void main(String[] args) {
        String strHTMLInput = &quot;&amp;lt;p&amp;gt;MyName&amp;lt;p&amp;gt;&quot;;
        String strEscapeHTML = StringEscapeUtils.escapeHtml(strHTMLInput);
        String strUnEscapeHTML = StringEscapeUtils.unescapeHtml(strEscapeHTML);
        System.out.println(&quot;Escaped HTML &amp;gt;&amp;gt;&amp;gt; &quot; + strEscapeHTML);
        System.out.println(&quot;UnEscaped HTML &amp;gt;&amp;gt;&amp;gt; &quot; + strUnEscapeHTML);
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;ArrayUtils &lt;/b&gt;sınıfı da onlarca metod ve bunların bütün ilkel tipler ve &lt;i&gt;java.lang.Object&lt;/i&gt; için aşırı yüklenmiş hallerini içerir. Ayrıca yine aşağıdaki &lt;b&gt;  xxx &lt;/b&gt;kısaltması bütün ilkel tipler ve Object sınıfı için kullanılmıştır. Sizin de tahmin edebileceğiz gibi bu metodlar dizi tipindeki değişkenler üzerinde yapılan çeşitli işleri kolaylaştırır.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;tt&gt;add(xxx[], xxx)&lt;/tt&gt; bir diziye yeni bir eleman ekler. Dizinin boyutunu büyüterek tabii ki&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;clone(xxx[])&lt;/tt&gt; dizinin kopyasını döner. &lt;/li&gt;
&lt;li&gt;&lt;tt&gt;contains(xxx[], xxx)&lt;/tt&gt;dizide bir eleman arar.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;getLength(Object)&lt;/tt&gt; dizinin eleman sayısını döner. Geçirilen referans dizi değilse, IllegalArgumentException fırlatılır.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;hashCode(Object)&lt;/tt&gt;, &lt;tt&gt;equals(Object, Object)&lt;/tt&gt;, &lt;tt&gt;toString(Object)&lt;/tt&gt; &lt;/li&gt;
daha önce tanıttığım metodların diziler üstünde çalışanı.
&lt;li&gt;&lt;tt&gt;indexOf(xxx[], xxx)&lt;/tt&gt; and &lt;tt&gt;indexOf(xxx[], xxx, int)&lt;/tt&gt;  String sınıfındaki metodlarla aynı işeve sahiptirler. Ancak diziler üzerinde çalışırlar. Ayrıca a lastIndexOf metodu da vardır.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;isEmpty(xxx[])&lt;/tt&gt; dizinin boş veya null kontrolünü yapar.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;isSameLength(xxx[], xxx[])&lt;/tt&gt; argümanlarındaki dizilerin aynı uzunluğa sahip olup olmadığını kontrol eder.&lt;/li&gt;
&lt;li&gt;add() metodunun yanında iki tip remove metodu da vardır. İlki verilen indexteki elemanı, &lt;tt&gt;remove(xxx[], int)&lt;/tt&gt;, belirtilen elemanı siler, &lt;tt&gt;remove(xxx[], xxx)&lt;/tt&gt;. &lt;/li&gt;
&lt;li&gt;&lt;tt&gt;reverse(xxx[])&lt;/tt&gt; diziyi ters çevirir.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;subarray(xxx[], int, int)&lt;/tt&gt; dizinin belirtilen aralıklardan bir alt dizisini oluşturup döner.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;toObject(xxx[])&lt;/tt&gt; ve &lt;tt&gt;toPrimitive(Xxx[])&lt;/tt&gt; metodları ilkel tipler ile bunların sarıcıları arasında dönüşüm yapar&lt;tt&gt;&amp;nbsp; &lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;tt&gt;ArrayUtils.toMap(Object[])&lt;/tt&gt; iki boyutlu dizilerden Map nesnesi oluşturur. Örneğin;  &lt;ul&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;Map colorMap = MapUtils.toMap(new String[][] {{
           {&quot;RED&quot;, &quot;#FF0000&quot;},
           {&quot;GREEN&quot;, &quot;#00FF00&quot;},
           {&quot;BLUE&quot;, &quot;#0000FF&quot;}
});
&lt;/pre&gt;&lt;br /&gt;
Kolay Gelsin</description><link>http://kahveninhatiri.blogspot.com/2011/05/apache-commons-lang-kutuphanesi-1-lang.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-5264254215594240248</guid><pubDate>Tue, 24 May 2011 19:12:00 +0000</pubDate><atom:updated>2011-05-25T03:32:39.041+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">arkadaş</category><category domain="http://www.blogger.com/atom/ns#">chat</category><category domain="http://www.blogger.com/atom/ns#">Facebook</category><category domain="http://www.blogger.com/atom/ns#">jabber</category><category domain="http://www.blogger.com/atom/ns#">online</category><category domain="http://www.blogger.com/atom/ns#">takip</category><category domain="http://www.blogger.com/atom/ns#">xmpp</category><category domain="http://www.blogger.com/atom/ns#">çevrimiçi</category><title>Takip Ettiğiniz Kişi Facebook Chat&#39;te Çevrimiçi Olunca Haber Veren Program</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;O kadar lazım çok olur mu bilmem ama bana lazım oldu ve çözümü şöyle buldum. Daha farklı da yapılabilir tabi.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Ön Bilgi:&lt;/b&gt; Facebook Chat servisi &lt;a href=&quot;http://developers.facebook.com/docs/chat/&quot;&gt;&lt;b&gt;XMPP/Jabber&lt;/b&gt;&lt;/a&gt; protokolü üzerinde çalışıyor. Bu protokolün belirtimlerine(specification) göre, ne zaman bir arkadaşınız FB Chat&#39;te durumunu değiştirirse (Çevrimiçi, Dışarıda, Çevrimdışı) protokol istemcilerini bilgilendirir. MSN gibi yani.&lt;br /&gt;
&lt;br /&gt;
Benim yöntemim bu protokolü kullanarak FB&#39;a bağlanıp gelen uyarılar içinden istediğiniz kişiyi süzmekten oluşuyor.&lt;br /&gt;
&lt;br /&gt;
Bunun için öncelikle bir FB Chat istemcisine ihtiyacımız var. &lt;b&gt;Açık Kaynak Yazılım&lt;/b&gt; felsefesi sağolsun burada imdadımıza yetişiyor. SourceForge&#39;da &lt;a href=&quot;http://sourceforge.net/projects/jfbchat/&quot;&gt;JFBChat&lt;/a&gt; adında işimizi görecek küçük bir program var. Kaynak kodlarını &lt;a href=&quot;http://sourceforge.net/scm/?type=svn&amp;amp;group_id=405668&quot;&gt;SVN&lt;/a&gt;&#39;den indirebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.digisoftware.org/images/conversation.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.digisoftware.org/images/conversation.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
İşin zor kısmı programın FB&#39;den gelen uyarıları dinleyen kısmı bulmakta. Kodu biraz deştiğinizde &lt;b&gt;&lt;i&gt;jfbchat.listeners.MyRosterListener&lt;/i&gt;&lt;/b&gt; sınıfının bu işi yaptığını fark edebilirsiniz. Gerisi artık sadece bir &lt;b&gt;if &lt;/b&gt;kontrolüne kalıyor. Aşağıdaki ilk satır bir kullanıcı durumunu değiştirdiğinde konsola bir &lt;b&gt;debug &lt;/b&gt;mesajı basıyor. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;new DMessage(contact.getUser() + &quot; has changed status and he is now &quot; + contact.getPresence().toString() + &quot;.&quot;).println();
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;contact.getUser()&lt;/pre&gt;&lt;br /&gt;
Çağrısı ile kullanıcının FB&#39;taki tam adına erişebilirsiniz.&lt;br /&gt;
Debug mesajından sonra şöyle basit bir&lt;b&gt; if&lt;/b&gt; ile istediğiniz kullanıcıyı süzebilir, çevrimiçi olduğunda, sınırları hayalleriniz ve programcılık yeteneklerinizle belirlenmek üzere istediğiniz uyarıyı verdirebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;if (contact.getUser().indexOf(&quot;KULLANICI-ADI&quot;)!=-1)
{
System.out.println(&quot;Kahvenin Hatırı&#39;nın debug çağrısı&quot;);
new MP3(&quot;C:\\PolisFilmTheme.mp3&quot;).play();
}
&lt;/pre&gt;&lt;br /&gt;
Netbeans projesi de &lt;a href=&quot;http://www.box.net/shared/yxf0acu2qc&quot;&gt;burada&lt;/a&gt;.&lt;br /&gt;
Kolay gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/05/takip-ettiginiz-kisi-facebook-chatte.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-3974307307028265668</guid><pubDate>Sat, 21 May 2011 22:15:00 +0000</pubDate><atom:updated>2011-05-22T11:16:02.404+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apache</category><category domain="http://www.blogger.com/atom/ns#">commons</category><category domain="http://www.blogger.com/atom/ns#">io</category><category domain="http://www.blogger.com/atom/ns#">sınıf</category><category domain="http://www.blogger.com/atom/ns#">yardımcı</category><title>Apache Commons IO Kütüphanesi</title><description>&lt;a href=&quot;http://apache.org/&quot;&gt;Apache Yazılım Derneği&lt;/a&gt;&#39;nin Java&#39;da sık karşılaşılan, JDK tarafından sağlanan sınıflarla yaparsanız &quot;bin dereden su getirmeye&quot; benzeyen görevleri, daha kolay biçimde gerçekleştirmenizi sağlayan araçları bir araya getirdiği &lt;a href=&quot;http://commons.apache.org/&quot;&gt;Commons &lt;/a&gt;adında bir projesi var.&lt;br /&gt;
&lt;br /&gt;
Bu yazıda bu projenin giriş çıkış işlemleri üzerine yoğunlaşan &lt;a href=&quot;http://commons.apache.org/io/&quot;&gt;IO &lt;/a&gt;kütüphanesini inceliyoruz.Kütüphaneyi &lt;a href=&quot;http://commons.apache.org/io/download_io.cgi&quot;&gt;buradan&lt;/a&gt; indirebilirsiniz. &lt;b&gt;commons-io-2.0.1.jar&lt;/b&gt; dosyasını projenizin &lt;b&gt;classpath&lt;/b&gt;&#39;ına eklemeniz yeterli.&lt;br /&gt;
&lt;br /&gt;
Bu jar&#39;ın içindeki bazı önemli sınıfları inceleyelim.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;IOUtils &lt;/b&gt;sınıfı okuma, yazma ve kopyalama işlemleri için bazı yardımcı metodlar barındırır. Bu metodlar InputStream, OutputStream, Reader ve Writer nesneleri üzerinde çalışır.&lt;br /&gt;
&lt;br /&gt;
Örneğin çok sık karşılaşılan bir işlem olan &quot;&lt;i&gt;herhangi bir InputStream&#39;dan gelen verilere String formatında erişme&lt;/i&gt;&quot; yi JDK sınıflarıyla şu şekilde gerçeklersiniz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;InputStream in = new URL( &quot;URL-HERE&quot; ).openStream();
 try {
   InputStreamReader inR = new InputStreamReader( in );
   BufferedReader buf = new BufferedReader( inR );
   String line;
   while ( ( line = buf.readLine() ) != null ) {
     System.out.println( line );
   }
 } finally {
   in.close();
 }
&lt;/pre&gt;&lt;br /&gt;
Ancak &lt;b&gt;IOUtils &lt;/b&gt;sınıfını kullanarak, bu işlemi çok daha basit bir şekilde halledebilirsiniz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;InputStream in = new URL( &quot;URL-HERE&quot; ).openStream();
 try {
   System.out.println( IOUtils.toString( in ) );
 } finally {
   IOUtils.closeQuietly(in);
 }
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Buradaki &lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;IOUtils.toString( in );&lt;/pre&gt;&lt;br /&gt;
metodu herhangi bir &lt;b&gt;InputStream&lt;/b&gt;&#39;i &lt;b&gt;String &lt;/b&gt;olarak döner. Biz burada &lt;b&gt;URL&lt;/b&gt;&#39;den gelen bir akış(stream) kullandık. Ama sadece bununla sınırlı değilsiniz. &lt;b&gt;InputStream &lt;/b&gt;dönen herhangi bir kaynak kullanabilirsiniz. Örneğin; &lt;b&gt;File&lt;/b&gt; nesneleri, &lt;b&gt;BufferedReader&lt;/b&gt;&#39;lar...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FileUtils &lt;/b&gt;sınıfı &lt;b&gt;File &lt;/b&gt;nesneleriyle birlikte kullanabileceğiniz çeşitli metodlar içerir. Bu metodları kullanarak dosyalarla okuma, yazma, kopyalama ve karşılaştırma işlemlerini çok daha kolay yapabilirsiniz. Örneğin; bir dosyayı satır satır okumak için şu kod parçasını kullanabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;File file = new File(&quot;/commons/io/project.properties&quot;);
List lines = FileUtils.readLines(file, &quot;UTF-8&quot;);
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;FilenameUtils &lt;/b&gt;sınıfı da &lt;b&gt;File &lt;/b&gt;nesneleri kullanma zorunluluğunu ortadan kaldırarak, dosya adlarıyla uğraşmanın daha basit yollarını sunar. Bu sınıf genelde Linux/Windows sistemler arası uyumluluğu sağlamak için kullanılır. Örneğin bir dosya adındaki çift noktaları kaldırmak için şu kodu kullanabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;String filename = &quot;C:/commons/io/../lang/project.xml&quot;;
String normalized = FilenameUtils.normalize(filename);
// çıktı: &quot;C:/commons/lang/project.xml&quot;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;FileSystemUtils &lt;/b&gt;sınıfı işletim sistemindeki dosya sistemi yapısı ilgili işlemler yapmak için JDK&#39;da bulunmayan bazı yardımcı metodlar içerir. Örneğin: C diskindeki boş alan miktarını öğrenmek için;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;long freeSpace = FileSystemUtils.freeSpace(&quot;C:/&quot;);
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;LineIterator &lt;/b&gt;sınıfıyla metin tabanlı bir dosyanın satırlarına kolayca tek tek ulaşabilirsiniz. &lt;b&gt;LineIterator &lt;/b&gt;kurucu ile oluşturulabileceği gibi &lt;b&gt;IOUtils &lt;/b&gt;ve &lt;b&gt;FileUtils &lt;/b&gt;sınıfları üzerinden fabrika meodlarıyla da oluşturulabilir. Örnek kullanımı:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;LineIterator it = FileUtils.lineIterator(file, &quot;UTF-8&quot;);
 try {
   while (it.hasNext()) {
     String line = it.nextLine();
     /// do something with line
   }
 } finally {
   LineIterator.closeQuietly(iterator);
 }
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Hazır Dosya Filtreleri&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;org.apache.commons.io.filefilter &lt;/code&gt; paketinde JDK&#39;nın &lt;code&gt;java.io.FileFilter&lt;/code&gt; ve             &lt;code&gt;java.io.FilenameFilter&lt;/code&gt;. interface&#39;lerini birleştirip, bunlara daha gelişmiş ek özellikler katan &lt;a href=&quot;http://commons.apache.org/io/api-release/index.html?org/apache/commons/io/filefilter/IOFileFilter.html&quot;&gt;IOFileFilter&lt;/a&gt; interface&#39;i bulunur. Pakette ayrıca bu interface&#39;in hazır örnekleri de mevcuttur. Bu filtreleri örneğin bir &lt;b&gt;FileDialog &lt;/b&gt;nesnesinde sadece belli tür dosyaları göstermek için kullanabilirsiniz. Hazır filtrelerden bazıları şunlardır. Not: Sınıf isimleri yeterince açıklayıcı olduğu için, ayrıca açıklamalarını yazmadım.&lt;br /&gt;
&lt;i&gt;&lt;br /&gt;
&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;DirectoryFilter, PrefixFileFilter, SuffixFileFilter, NameFileFilter, WildcardFileFilter, AgeFileFilter, SizeFileFilter, TrueFileFilter, FalseFileFilter, NotFileFilter, AndFileFilter, OrFileFilter&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Örneğin, geçerli dizindeki, dizin olmayan, &quot;A&quot; ile başlayıp,&amp;nbsp; &quot;.java&quot; veya &quot;.class&quot; ile biten dosyaları listelemek için:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;File dir = new File(&quot;.&quot;);
  String[] files = dir.list( 
    new AndFileFilter(
      new AndFileFilter(
        new PrefixFileFilter(&quot;A&quot;),
        new OrFileFilter(
          new SuffixFileFilter(&quot;.class&quot;),
          new SuffixFileFilter(&quot;.java&quot;)
        )
      ),
      new NotFileFilter(
        new DirectoryFileFilter()
      )
    )
  );
  for ( int i=0; i&amp;lt;files.length; i++ ) {
    System.out.println(files[i]);
  }
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Bu pakette ayrıca &lt;b&gt;FileFilterUtils &lt;/b&gt;sınıfı da mevcuttur. Bu sınıf az önce saydığın filtre sınıflarını import etmeden statik alanlar üzerinden çok daha kolay çağırmayı sağlar. Az önceki örnek bu sınıf yardımıyla tekrar yazılırsa şu hale dönüşür:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;File dir = new File(&quot;.&quot;);
  String[] files = dir.list( 
    FileFilterUtils.andFileFilter(
      FileFilterUtils.andFileFilter(
        FileFilterUtils.prefixFileFilter(&quot;A&quot;),
        FileFilterUtils.orFileFilter(
          FileFilterUtils.suffixFileFilter(&quot;.class&quot;),
          FileFilterUtils.suffixFileFilter(&quot;.java&quot;)
        )
      ),
      FileFilterUtils.notFileFilter(
        FileFilterUtils.directoryFileFilter()
      )
    )
  );
  for ( int i=0; i&amp;lt;files.length; i++ ) {
    System.out.println(files[i]);
  }
&lt;/pre&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Dosya Karşılaştırıcıları&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;org.apache.commons.io.comparator&lt;/code&gt;  paketi &lt;code&gt;java.io.File &lt;/code&gt;sınıfı için &lt;code&gt;java.util.Comparator&lt;/code&gt; interface&#39;inin birkaç hazır örneğini içerir. Bu karşılaştırıcılar dosya listelerini veya dizilerini sıralamak için kullanılabilir.&lt;br /&gt;
&lt;br /&gt;
Bütün karşılaştırıcılar kendi özelliklerine göre uygun &lt;code&gt;sort(File...)&lt;/code&gt; ve   &lt;code&gt;sort(List)&lt;/code&gt; metodlarını içerir. Örneğin, bir dizindeki dosyaları dosya adına göre sıralamak için; &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;File[] files = dir.listFiles();
NameFileComparator.NAME_COMPARATOR.sort(files);
&lt;/pre&gt;&lt;br /&gt;
Aynı işlemi tek satırda da yapabilirsiniz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;File[] files = NameFileComparator.NAME_COMPARATOR.sort(dir.listFiles());
  &lt;/pre&gt;&lt;br /&gt;
&lt;a href=&quot;http://commons.apache.org/io/api-release/org/apache/commons/io/comparator/CompositeFileComparator.html&quot;&gt;CompositeFileComparator&lt;/a&gt; sınıfı karşılaştırma ve sıralama işlemini birkaç karşılaştırıcıyı birleştirerek yapabilir. Örneğin dosyaları önce türüne sonra da adına göre sıralamak için;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;CompositeFileComparator comparator =new CompositeFileComparator(
DirectoryFileComparator.DIRECTORY_COMPARATOR,NameFileComparator.NAME_COMPARATOR);
File[] files = dir.listFiles();
comparator.sort(files);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;b&gt;Akışlar(Stream)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;code&gt;org.apache.commons.io.input&lt;/code&gt; ve &lt;code&gt;org.apache.commons.io.output&lt;/code&gt; paketleri akışların kullanışlı birkaç örneğini içerir. Bazıları;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;i&gt;Null output stream&lt;/i&gt; - Kendisine gönderilen bütün veriyi emer (yok eder).&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Tee output stream&lt;/i&gt; - Çıktıyı tek akış yerine iki akışa yönlendirir.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Byte array output stream&lt;/i&gt; - JDK&#39;daki abisinin daha hızlısı&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Counting streams&lt;/i&gt; - Aldığı veriyi byte olarak sayan akış&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Proxy streams&lt;/i&gt; - Proxy tasarım desenini uygular ve akışı uygun metoda yönlendirir.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Lockable writer&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;Bu yazıda Apache Commons&#39;un IO kütüphanesini tanıtmaya çalıştım. Sınıflar ve kullanımları hakkında daha detaylı bilgiyi kütüphanenin &lt;a href=&quot;http://commons.apache.org/io/api-release/index.html&quot;&gt;Javadoc&lt;/a&gt;&#39;unda bulabilirsiniz.</description><link>http://kahveninhatiri.blogspot.com/2011/05/apache-commons-io-kutuphanesi.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-282769101133100000</guid><pubDate>Fri, 13 May 2011 22:00:00 +0000</pubDate><atom:updated>2011-05-14T01:02:16.282+03:00</atom:updated><title>Basit Bir Anlık Mesajlaşma Yazılımı</title><description>Şimdi farkettim 2 sene olmuş İşletim Sistemleri dersinden ödev olarak basit bir MSN Messenger yapalı.&lt;br /&gt;
&lt;br /&gt;
Proje hakkında bilgiyi aşağıdaki sunumda bulabilirsiniz:&lt;br /&gt;
&lt;br /&gt;
&lt;embed src=&quot;http://www.box.net/embed/3dc4iexx31muy4t.swf&quot; width=&quot;466&quot; height=&quot;400&quot; wmode=&quot;opaque&quot; type=&quot;application/x-shockwave-flash&quot; allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
İndirme bağlantısı da &lt;a href=&quot;http://www.box.net/shared/a04926kc7o&quot;&gt;burada&lt;/a&gt;.</description><link>http://kahveninhatiri.blogspot.com/2011/05/basit-bir-anlk-mesajlasma-yazlm.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4018036470336987081</guid><pubDate>Fri, 13 May 2011 21:35:00 +0000</pubDate><atom:updated>2011-05-26T10:03:22.760+03:00</atom:updated><title>Pulp Fiction Duvar Kağıdı</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Türkçesi: &quot;İntikamımı aldığımda...&quot;&lt;br /&gt;
&lt;embed allowfullscreen=&quot;true&quot; allowscriptaccess=&quot;always&quot; height=&quot;400&quot; src=&quot;http://www.box.net/embed/roaqvta8vamxm2x.swf&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;566&quot; wmode=&quot;opaque&quot;&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/05/pulp-fiction-duvar-kagd.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4158074476069135583</guid><pubDate>Fri, 13 May 2011 21:21:00 +0000</pubDate><atom:updated>2011-05-21T23:58:13.481+03:00</atom:updated><title>Polis Filmi Duvar Kağıdı</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Polis en sevdiğim filmdir. Bir zamanlar en önemli sahnelerinden biri için bir duvar kağıdı yapmıştım. Buyrun:&lt;/div&gt;&lt;br /&gt;
&lt;embed src=&quot;http://www.box.net/embed/90f1is0q3omrrl0.swf&quot; width=&quot;700&quot; height=&quot;400&quot; wmode=&quot;opaque&quot; type=&quot;application/x-shockwave-flash&quot; allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot;&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/05/polis-filmi-duvar-kagd.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-165316422164797692</guid><pubDate>Fri, 13 May 2011 17:24:00 +0000</pubDate><atom:updated>2011-05-13T20:31:07.143+03:00</atom:updated><title>SCJP Sticker&#39;ı</title><description>SCJP sınavını geçince şöyle bir sticker hazırlamıştım.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioRPlhLmxdUVHGbCWzFoH9qnnVLFyOroAn2E7RsSlZYG001fqI36tb6xlqa7rgzKepz1Jg5ZH66BlHt_biNN8X4q581ZPcFnxvj37jcjPynVIlSwS1LIuUo1lcZ0LeIaCUrxD25FwNgo/s1600/scjp-logo.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioRPlhLmxdUVHGbCWzFoH9qnnVLFyOroAn2E7RsSlZYG001fqI36tb6xlqa7rgzKepz1Jg5ZH66BlHt_biNN8X4q581ZPcFnxvj37jcjPynVIlSwS1LIuUo1lcZ0LeIaCUrxD25FwNgo/s1600/scjp-logo.bmp&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/br&gt;&lt;br /&gt;
&lt;/br&gt;&lt;br /&gt;
Beğenip de kullanmak isteyen olursa buyursun.&lt;br /&gt;
Tasarımı &lt;a href=&quot;http://getpaint.net/&quot;&gt;Paint.Net&lt;/a&gt; &#39;te yapmıştım. Bu da kaynak &lt;a href=&quot;http://www.box.net/shared/l0nftay56p&quot;&gt;dosyası&lt;/a&gt;.</description><link>http://kahveninhatiri.blogspot.com/2011/05/scjp-sticker.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgioRPlhLmxdUVHGbCWzFoH9qnnVLFyOroAn2E7RsSlZYG001fqI36tb6xlqa7rgzKepz1Jg5ZH66BlHt_biNN8X4q581ZPcFnxvj37jcjPynVIlSwS1LIuUo1lcZ0LeIaCUrxD25FwNgo/s72-c/scjp-logo.bmp" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-7009045934624900117</guid><pubDate>Thu, 12 May 2011 00:17:00 +0000</pubDate><atom:updated>2011-05-13T23:26:43.196+03:00</atom:updated><title>Dosya Paylaşımı İçin Box.net&amp;#39;e Geçtim</title><description>&lt;div xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;Blog&#39;umdan dosya paylaşımı daha rahat yapabilmek için box.net kullanmaya karar verdim. Daha önce paylaştığım Maven Rehberi&#39;ne buradan ulaşabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.box.net/index.php?rm=box_download_shared_file&amp;amp;blog&amp;amp;file_id=f_736039424&amp;amp;shared_name=hyherrsgpd&quot; target=&quot;_blank&quot;&gt;MAVEN-REHBER.pdf&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;embed src=&quot;http://www.box.net/embed/a1no9bs3vlip18m.swf&quot; width=&quot;466&quot; height=&quot;400&quot; wmode=&quot;opaque&quot; type=&quot;application/x-shockwave-flash&quot; allowFullScreen=&quot;true&quot; allowScriptAccess=&quot;always&quot;&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/05/dosya-paylasm-icin-boxnet-gectim.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-953014297688995901</guid><pubDate>Mon, 25 Apr 2011 09:04:00 +0000</pubDate><atom:updated>2011-04-25T14:46:30.563+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-6: Örnek Çok Modüllü Proje</title><description>Bu yazıda daha önce &lt;a href=&quot;http://kahveninhatiri.blogspot.com/2011/04/maven-ornek-proje.html&quot;&gt;Maven3 (Proje yönetim aracı)-4: Örnek Proje(simple-weather)&lt;/a&gt; ve &lt;a href=&quot;http://kahveninhatiri.blogspot.com/2011/04/maven3-proje-yonetim-arac-5-ornek-web.html&quot;&gt;Maven3 (Proje yönetim aracı)-5: Örnek Web Projesi(simple-webapp)&lt;/a&gt; nde anlattığım örnek projeleri bir araya getirip çok modüllü bir proje oluşturacağız. Proje kodlarını &lt;a href=&quot;http://www.sonatype.com/books/mvnex-book/mvnexbook-examples-0.5.2-project.zip&quot;&gt;buradan &lt;/a&gt;indirebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
Çok modüllü bir proje, içinden sahip olduğu alt modüllere referans veren bir ebeveyn POM ile oluşturulur. Yani ebeveyn projemizi &lt;b&gt;simple-parent/&lt;/b&gt; dizinine koyar ve içine de şu POM&#39;u koyarsak, &lt;b&gt;simple-weather&lt;/b&gt; ve &lt;b&gt;simple-webapp&lt;/b&gt; adında iki alt modülü olan bir çok modüllü proje elde etmiş oluruz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

  &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.multi&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;simple-parent&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;pom&amp;lt;/packaging&amp;gt;
  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
  &amp;lt;name&amp;gt;Multi Chapter Simple Parent Project&amp;lt;/name&amp;gt;
 
  &amp;lt;modules&amp;gt;
    &amp;lt;module&amp;gt;simple-weather&amp;lt;/module&amp;gt;
    &amp;lt;module&amp;gt;simple-webapp&amp;lt;/module&amp;gt;
  &amp;lt;/modules&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;pluginManagement&amp;gt;
      &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;configuration&amp;gt;
            &amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;
            &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;
          &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;
      &amp;lt;/plugins&amp;gt;
   &amp;lt;/pluginManagement&amp;gt; 
  &amp;lt;/build&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Dikkat ederseniz ebeveyn projemizin paketleme tipi olarak JAR veya WAR gibi herhangi bir arşiv çesidi vermedik. Paketleme çeşidimiz sadece diğer projelere referansla içeren basit bir &lt;b&gt;POM &lt;/b&gt;dosyası. Ayrıca bu POM&#39;da modules adında daha önce karşılaşmadığınız bir öğe var: &lt;b&gt;modules &lt;/b&gt;Bu öğe altındaki her &lt;b&gt;module &lt;/b&gt;öğesi ebeveyn projenin dizini altındaki alt modüllerin dizinlerine işaret eder. Yani bizim örneğimize göre &lt;b&gt;simple-weather&lt;/b&gt; ve &lt;b&gt;simple-webapp&lt;/b&gt; adında iki alt dizine (modüle) sahibiz.&lt;br /&gt;
Bu ebeveny POM tarafından tanımlanmış bütün ayarlar, bağımlılıklar v.s. alt modüller tarafından kalıtım alınır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;simple-weather Alt Modülü&lt;/b&gt;&lt;br /&gt;
Modülümüzün POM&#39;unu şu şekilde oluşturuyoruz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;parent&amp;gt;
    &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.multi&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;simple-parent&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
  &amp;lt;/parent&amp;gt;
  &amp;lt;artifactId&amp;gt;simple-weather&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;

  &amp;lt;name&amp;gt;Multi Chapter Simple Weather API&amp;lt;/name&amp;gt;

  &amp;lt;build&amp;gt;
    &amp;lt;pluginManagement&amp;gt;
      &amp;lt;plugins&amp;gt;
        &amp;lt;plugin&amp;gt;
          &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
          &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
          &amp;lt;configuration&amp;gt;
            &amp;lt;testFailureIgnore&amp;gt;true&amp;lt;/testFailureIgnore&amp;gt;
          &amp;lt;/configuration&amp;gt;
        &amp;lt;/plugin&amp;gt;
      &amp;lt;/plugins&amp;gt;
    &amp;lt;/pluginManagement&amp;gt; 
  &amp;lt;/build&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.2.14&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;dom4j&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;dom4j&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.6.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;jaxen&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jaxen&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;velocity&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;velocity&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.5&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Modülün detaylarına inmeden önce burada birşey dikkatinizi çekmeli: &lt;b&gt;parent &lt;/b&gt;öğesi. Bu öğe ile modülümüzün ebeveyn projesinin koordinatlarını belirtiyoruz.&lt;br /&gt;
&lt;br /&gt;
Bu modülde şöyle bir yol izleyeceğiz: Tekrar kullanılabilirliği sağlamak için bir tane servis sınıfı yazacağız. Bu sınıf aynen komut satırından çalışan &lt;b&gt;simple-weather&lt;/b&gt; projesi gibi girilen bölge koduna ait şehrin hava durumu bilgilerini geri dönecek. Servis sınıfımız işlemlerini gerçekleştirmek için &lt;b&gt;simple-weather&lt;/b&gt; projesinin sınıflarını kullanacak.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;

public class WeatherService {

    public WeatherService() {}

    public String retrieveForecast( String zip ) throws Exception {
        // Retrieve Data
        InputStream dataIn = new YahooRetriever().retrieve( zip );

        // Parse Data
        Weather weather = new YahooParser().parse( dataIn );

        // Format (Print) Data
        return new WeatherFormatter().format( weather );
    }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;simple-webapp Alt Modülü&lt;/b&gt;&lt;br /&gt;
Bu modülümüz ise az önce &lt;b&gt;simple-weather&lt;/b&gt;&#39;da oluşturduğumuz servis sınıfını kullanıp, ondan aldığı verileri yayınlamak üzere birkaç servlet tanımlayacak. Şimdi öncelikle &lt;b&gt;simple-weather&lt;/b&gt; modülünü kullanacağımız için POM&#39;umuzda bu projeyi bağımlılık olarak belirtmeliyiz. POM&#39;un geri kalanı zaten &lt;b&gt;simple-webapp &lt;/b&gt;projesininkiyle aynı olacak.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;parent&amp;gt;
    &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.multi&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;simple-parent&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
  &amp;lt;/parent&amp;gt;

  &amp;lt;artifactId&amp;gt;simple-webapp&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
  &amp;lt;name&amp;gt;simple-webapp Maven Webapp&amp;lt;/name&amp;gt;
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.multi&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;simple-weather&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  &amp;lt;build&amp;gt;
    &amp;lt;finalName&amp;gt;simple-webapp&amp;lt;/finalName&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-jetty-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/pre&gt;&lt;br /&gt;
Servletimizde ise HTTP isteğinden bölge kodunu okuyoruz ve bir önceki modülde oluşturduğumuz &lt;b&gt;WeatherService &lt;/b&gt;sınıfının &lt;b&gt;retreiveForecast()&lt;/b&gt; metodunu çağırıyoruz. Dönen cevabı da &lt;b&gt;out.println()&lt;/b&gt; ile istemciye yolluyoruz:&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SimpleServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
 PrintWriter out = response.getWriter();
 out.println( &quot;SimpleServlet Executed&quot; );
        out.flush();
        out.close();
    }
}
&lt;/pre&gt;&lt;br /&gt;
Son olarak &lt;b&gt;web.xml&lt;/b&gt;&#39;imizde&lt;b&gt; /weather&lt;/b&gt; adresine yapılan istekleri karşılamak üzere &lt;b&gt;WeatherServlet&lt;/b&gt;&#39;i kaydediyoruz:&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;!DOCTYPE web-app PUBLIC
 &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
 &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &amp;gt;

&amp;lt;web-app&amp;gt;
  &amp;lt;display-name&amp;gt;Archetype Created Web Application&amp;lt;/display-name&amp;gt;
  &amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;simple&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.sonatype.mavenbook.web.SimpleServlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;weather&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.sonatype.mavenbook.web.WeatherServlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;simple&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/simple&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;weather&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/weather&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Çok Modüllü Projeyi Derlemek&lt;/b&gt;&lt;br /&gt;
Sıra projelerimizi derlemeye geldi. &lt;b&gt;simple-webapp&lt;/b&gt;, &lt;b&gt;simple-weather&lt;/b&gt;&#39;a bağımlı olduğu için, daha önce derlenmesi gerekli. Ancak bunu dert etmenize gerek yok, çünkü Maven (&lt;b&gt;Reactor &lt;/b&gt;eklentisi) hangisinin daha önce derlenmesi gerektiğini bilecek kadar akıllı. Tek yapmanız gereken ebeveyn projenin olduğu dizinden &lt;b&gt;mvn clean install&lt;/b&gt; komudunu çalıştırmak:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;~/examples/ch-multi/simple-parent$ mvn clean install
[INFO] Scanning for projects...
[INFO] Reactor build order: 
[INFO]   Simple Parent Project
[INFO]   simple-weather
[INFO]   simple-webapp Maven Webapp
[INFO] ----------------------------------------------------------------------
[INFO] Building simple-weather
[INFO]    task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------
[...]
[INFO] [install:install]
[INFO] Installing simple-weather-1.0.jar to simple-weather-1.0.jar
[INFO] ----------------------------------------------------------------------
[INFO] Building simple-webapp Maven Webapp
[INFO]    task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------
[...]
[INFO] [install:install]
[INFO] Installing simple-webapp.war to simple-webapp-1.0.war
[INFO] 
[INFO] ----------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ----------------------------------------------------------------------
[INFO] Simple Parent Project ............................... SUCCESS [3.041s]
[INFO] simple-weather ...................................... SUCCESS [4.802s]
[INFO] simple-webapp Maven Webapp .......................... SUCCESS [3.065s]
[INFO] ----------------------------------------------------------------------
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Tavsiye&lt;/b&gt;: Aslında yapmak zorunda olmasanız da &lt;b&gt;mvn &lt;/b&gt;komudunu her çalıştırdığınızda &lt;b&gt;clean &lt;/b&gt;evresini de ekleyin. Böylece Maven, daha önce oluşturulmuş bütün çıktıları silecek ve &quot;&lt;b&gt;temiz&lt;/b&gt;&quot; bir inşa işlemine başlayacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Uygulamayı Çalıştırmak&lt;/b&gt;&lt;br /&gt;
Artık bildiğiniz üzere:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;~/examples/ch-multi/simple-parent/simple-webapp $ mvn jetty:run
[INFO] ----------------------------------------------------------------------
[INFO] Building simple-webapp Maven Webapp
[INFO]    task-segment: [jetty:run]
[INFO] ----------------------------------------------------------------------
[...]
[INFO] [jetty:run]
[INFO] Configuring Jetty for project: simple-webapp Maven Webapp
[...]
[INFO] Webapp directory = ~/examples/ch-multi/simple-parent/\
                          simple-webapp/src/main/webapp
[INFO] Starting jetty 6.1.6rc1 ...
2007-11-18 1:58:26.980::INFO:  jetty-6.1.6rc1
2007-11-18 1:58:26.125::INFO:  No Transaction manager found
2007-11-18 1:58:27.633::INFO:  Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
&lt;/pre&gt;&lt;br /&gt;
Jetty başladıktan sonra &lt;b&gt;http://localhost:8080/simple-webapp/weather?zip=01201&lt;/b&gt; adresine gidip servisi test edebilirsiniz. Sondaki 5 haneli numarayı değiştirip istediğiniz bölgenin hava durumunu öğrenebilirsiniz.&lt;br /&gt;
&lt;i&gt;Aslında Türkiye&#39;nin kodlarını da bulup İstanbul&#39;un hava durumunu da öğrenmek lazım ya. Bu da size ödev olsun :)&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/04/maven3-proje-yonetim-arac-5-ornek-cok.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-1172098635919149087</guid><pubDate>Mon, 25 Apr 2011 08:45:00 +0000</pubDate><atom:updated>2011-04-25T11:55:06.630+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-5: Örnek Web Projesi</title><description>Merhabalar. Bu yazıda basit bir web uygulamasını Maven kullanarak nasıl yapılacağını anlatacağım. Oluşturacağımız proje bir önceki yazıda anlattığım projeye büyük oranda benzeyecek. Bu yüzden hafizanızı tazelemenize ihtiyacınız olabilir. Hadi başlayalım.&lt;br /&gt;
&lt;br /&gt;
Önce yine şu komut ile proje oluşturulmasını tetikleyin:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn archetype:generate -DgroupId=org.sonatype.mavenbook.simpleweb -DartifactId=simple-webapp -Dpackage=org.sonatype.mavenbook
&lt;/pre&gt;Sorulduğunda proje iskeleti olarak &lt;b&gt;maven-archetype-webapp&lt;/b&gt;&#39;ı seçin. İşlem tamamlandığında şuna benzer bir POM oluşacak.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.simpleweb&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;simple-webapp&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
  &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
  &amp;lt;name&amp;gt;simple-webapp Maven Webapp&amp;lt;/name&amp;gt;
  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  &amp;lt;build&amp;gt;
    &amp;lt;finalName&amp;gt;simple-webapp&amp;lt;/finalName&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Bu POM&#39;da bir önceki projeninkinden farklı olarak dikkatinizi çekebilecek 2 şey var. Birincisi projenin paketleme biçimi WAR olarak belirlenmiş. İkincisi ise build öğesi altına &lt;b&gt;finalName &lt;/b&gt;öğesini eklenmiş. Bu öğe paketleme evresinde WAR&#39;a son adını vermekte kullanılır. Bu örneğe göre, projemiz &lt;b&gt;target/&lt;/b&gt; dizini altına &lt;b&gt;simple-webapp.war&lt;/b&gt; olarak yayınlanacak.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Projeyi Çalıştırmak&lt;/b&gt;&lt;br /&gt;
Bir önceki projenin aksine bu proje bir web uygulaması olduğu için çalıştırmak için &lt;b&gt;Exec &lt;/b&gt;eklentisini kullanamayız. Normal şartlar altında(NŞA) bu iş için &lt;b&gt;Tomcat &lt;/b&gt;ya da &lt;b&gt;Jetty &lt;/b&gt;gibi bir &lt;b&gt;Servlet Kabı(Container)&lt;/b&gt;&#39;nı internetten indirip, ayarlarını yapıp, &lt;b&gt;simple-webapp.war &lt;/b&gt;dosyasını &lt;b&gt;webapps/&lt;/b&gt; altına koyup sonra da kabı başlatmanız gerekir. Ancak bunun daha kolay bir yolu var. &lt;b&gt;Maven Jetty&lt;/b&gt; eklentisini bu iş için kullanabilirsiniz. Şu POM parçasını projenize eklemeniz yeterli:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;build&amp;gt;
    &amp;lt;finalName&amp;gt;simple-webapp&amp;lt;/finalName&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-jetty-plugin&amp;lt;/artifactId&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Sonrasında Jetty eklentisinin &lt;b&gt;Run &lt;/b&gt;hedefini kullanarak uygulamayı çalıştırabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;~/examples/ch-simple-web/simple-webapp $ mvn jetty:run
...
[INFO] [jetty:run]
[INFO] Configuring Jetty for project: simple-webapp Maven Webapp
[INFO] Webapp source directory = \
       ~/svnw/sonatype/examples/ch-simple-web/simple-webapp/src/main/webapp
[INFO] web.xml file = \
 ~/svnw/sonatype/examples/ch-simple-web/\
simple-webapp/src/main/webapp/WEB-INF/web.xml
[INFO] Classes = ~/svnw/sonatype/examples/ch-simple-web/\
simple-webapp/target/classes
2007-11-17 22:11:50.532::INFO:  Logging to STDERR via org.mortbay.log.StdErrLog
[INFO] Context path = /simple-webapp
[INFO] Tmp directory =  determined at runtime
[INFO] Web defaults = org/mortbay/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
[INFO] Webapp directory = \
       ~/svnw/sonatype/examples/ch-simple-web/simple-webapp/src/main/webapp
[INFO] Starting jetty 6.1.6rc1 ...
48
2007-11-17 22:11:50.673::INFO:  jetty-6.1.6rc1
2007-11-17 22:11:50.846::INFO:  No Transaction manager found 
2007-11-17 22:11:51.057::INFO:  Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;DİKKAT&lt;/b&gt;: Maven Jetty eklentisini &lt;b&gt;Windows &lt;/b&gt;altında çalıştırıyorsanız, yerel deponuzu adında boşluk içermeyen bir dizine almanız gerekebilir. Çünkü böyle durumlarda (örneğin yerel deponun &quot;&lt;b&gt;C:\Documents and Settings\&lt;/b&gt;&lt;user&gt;&quot; altında olması durumunda) bazen &lt;b&gt;Jetty&lt;/b&gt;&#39;nin başlatılamaması hatası ile karşılabilirsiniz. Çözüm deponuzu adında boşluk içermeyen bir yere alıp, bu yeri de&lt;b&gt; ~/.m2/settings.xml&lt;/b&gt; dosyasında tekrar belirtmektir.&lt;br /&gt;
Jetty başlatıldıktan sonra, tarayıcınızdan &lt;b&gt;http://localhost:8080/simple-webapp/&lt;/b&gt; adresine gidin. Eğer herşey yolundaysa bir &quot;&lt;b&gt;Merhaba Dünya&lt;/b&gt;&quot; görmelisiniz. Karşınıza gelen sayfa &lt;b&gt;maven-archetype-webapp&lt;/b&gt; iskeletinin oluşturduğu &lt;b&gt;index.jsp&lt;/b&gt; sayfasıdır.  Maven ön tanımlı olarak herhangi bir web uygulamasının ana dizinini &lt;b&gt;src/main/webapp/&lt;/b&gt; olarak kabul eder. İşte az önce gördüğümüz index.jsp de bu dizindedir. İçeriğini merak ettiyseniz:&lt;br /&gt;
&lt;br /&gt;
&lt;/user&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h2&amp;gt;Hello World!&amp;lt;/h2&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;src/main/webapp/WEB-INF&lt;/b&gt; altında ise yine çok basit bir &lt;b&gt;web.xml&lt;/b&gt; dosyası vardır:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;!DOCTYPE web-app PUBLIC
 &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
 &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &amp;gt;
&amp;lt;web-app&amp;gt;
  &amp;lt;display-name&amp;gt;Archetype Created Web Application&amp;lt;/display-name&amp;gt;
&amp;lt;/web-app&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Servlet Eklemek&lt;/b&gt;&lt;br /&gt;
Şimdi projemize biraz Java kodu ekleyelim. Öncelikle eğer halihazırda yoksa &lt;b&gt;src/main/java/org/sonatype/mavenbook/web&lt;/b&gt; dizinini sonra da içinde &lt;b&gt;SimpleServlet.java&lt;/b&gt; sınıfını oluşturun. İçine de şunları yazın:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.web;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SimpleServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
        throws ServletException, IOException {
 PrintWriter out = response.getWriter();
 out.println( &quot;SimpleServlet Executed&quot; );
        out.flush();
        out.close();
    }
}
&lt;/pre&gt;&lt;br /&gt;
Servlet&#39;imiz aslında bir çeşit &quot;Merhaba Dünya&quot; servlet&#39;inden başka birşey değil. Bu servlet&#39;i uygulamamız altında çağrılan bir yola bağlamak için &lt;b&gt;web.xml&lt;/b&gt;&#39;i kullanacağız. Aşağıdaki web.xml ile servlet&#39;imizi &lt;b&gt;simple/&lt;/b&gt; yoluna bağlıyoruz. Yani ne zaman &lt;b&gt;http://localhost:8080/simple-webapp/simple&lt;/b&gt; adresine bir istek yapılsa bu servlet çağırılacak.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;!DOCTYPE web-app PUBLIC
 &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
 &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &amp;gt;

&amp;lt;web-app&amp;gt;
  &amp;lt;display-name&amp;gt;Archetype Created Web Application&amp;lt;/display-name&amp;gt;
  &amp;lt;servlet&amp;gt;
    &amp;lt;servlet-name&amp;gt;simple&amp;lt;/servlet-name&amp;gt;
    &amp;lt;servlet-class&amp;gt;org.sonatype.mavenbook.web.SimpleServlet&amp;lt;/servlet-class&amp;gt;
  &amp;lt;/servlet&amp;gt;
  &amp;lt;servlet-mapping&amp;gt;
    &amp;lt;servlet-name&amp;gt;simple&amp;lt;/servlet-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/simple&amp;lt;/url-pattern&amp;gt;
  &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Şimdi de projemize Servlet API&#39;nin bağımlılığını ekleyelim:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;dependencies&amp;gt;
    [...]
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Burada bağımlılığın kapsamının &lt;b&gt;provided &lt;/b&gt;olduğuna dikkat edin. Bu Maven&#39;a bağımlılığı WAR dosyasının içine koymamasını çünkü servlet kabı tarafından sağlanacağını söyler. Eğer projede JSP etiketleri kullanırsanız JSP belirtim kütüphanesini de classpath&#39;a eklemeniz gerekir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;dependencies&amp;gt;
    [...]
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;javax.servlet.jsp&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jsp-api&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Şimdi uygulamamamızı çalıştırabiliriz. Uygulama kodları değiştiği için, Jetty&#39;i tekrar çalıştırmamız gerekecek. Eğer Jetty hala çalışıyorsa &lt;b&gt;CTRL+C&lt;/b&gt; tuşlarıyla durdurun. &lt;b&gt;mvn clean install&lt;/b&gt; komutu ile tekrar inşa edin ve &lt;b&gt;mvn jetty:run&lt;/b&gt; ile Jetty&#39;i tekrar çalıştırın.&lt;br /&gt;
&lt;br /&gt;
Tarayıcınızdan &lt;b&gt;http://localhost:8080/simple-webapp/simple&lt;/b&gt; adresine gittiğinizde &quot;&lt;b&gt;Simple Executed&lt;/b&gt;&quot; çıktısını görmeniz lazım.&lt;br /&gt;
&lt;br /&gt;
Bu yazıda basit bir Java Web uygulaması geliştirdik, uygulmamıza bir servlet ekledik ve servlet kabı içinden çalıştırdık. Şimdi bu temel uzerine kendiniz geliştirmeler yapabilirsiniz. Örneğin POM&#39;a PrimeFaces kütüphanesini ekleyip biraz JSF alıştırması yapın.&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/04/maven3-proje-yonetim-arac-5-ornek-web.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4822476867821866458</guid><pubDate>Sun, 24 Apr 2011 10:28:00 +0000</pubDate><atom:updated>2011-04-25T11:20:22.728+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-4: Örnek Proje</title><description>Bu yazıda sıfırdan Maven kullanarak bir proje geliştireceğiz. Proje kodlarını &lt;a href=&quot;http://www.sonatype.com/books/mvnex-book/mvnexbook-examples-0.5.2-project.zip&quot;&gt;buradan &lt;/a&gt;indirebilirsiniz.&lt;br /&gt;
Projemiz Yahoo Weather RSS servisine bağlanıp girilen koda karşılık gelen bölgenin hava durumu bilgilerini getiren bir konsol uygulaması olacak.&lt;br /&gt;
Önce bir önceki yazıda anlattığım &lt;b&gt;maven-quickstart-archive&#39;&lt;/b&gt;ı kullanarak bir proje oluşturalım:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn archetype:generate -DgroupId=org.sonatype.mavenbook.custom -DartifactId=simple-weather -Dpackage=org.sonatype.mavenbook -Dversion=1.0
&lt;/pre&gt;&lt;br /&gt;
Komut satırında sorulduğunda proje iskeleti olarak &lt;b&gt;maven-quickstart-archive&#39;&lt;/b&gt;ı seçin. Maven komutu işlemeyi bitirdiğinde &lt;b&gt;simple-weather&lt;/b&gt; dizinini oluşturacak ve içine projenin pom.xml dosyasını koyacaktır. Bu dosya:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;org.sonatype.mavenbook.custom&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;simple-weather&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;
  &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;
  &amp;lt;name&amp;gt;simple-weather&amp;lt;/name&amp;gt;
  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Projenin hedef Java sürümünü Derleme eklentisi aracılığyla Java 5&#39;e ayarlayın:&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  .................
  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;source&amp;gt;1.5&amp;lt;/source&amp;gt;
          &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
  .............
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Kod yazmaya başlamadan önce pom&#39;a proje hakkında biraz bilgi girelim:&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; 
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
...

  &amp;lt;name&amp;gt;simple-weather&amp;lt;/name&amp;gt;
  &amp;lt;url&amp;gt;http://www.sonatype.com&amp;lt;/url&amp;gt;

  &amp;lt;licenses&amp;gt;
    &amp;lt;license&amp;gt;
      &amp;lt;name&amp;gt;Apache 2&amp;lt;/name&amp;gt;
      &amp;lt;url&amp;gt;http://www.apache.org/licenses/LICENSE-2.0.txt&amp;lt;/url&amp;gt;
      &amp;lt;distribution&amp;gt;repo&amp;lt;/distribution&amp;gt;
      &amp;lt;comments&amp;gt;A business-friendly OSS license&amp;lt;/comments&amp;gt;
    &amp;lt;/license&amp;gt;
  &amp;lt;/licenses&amp;gt;

  &amp;lt;organization&amp;gt;
    &amp;lt;name&amp;gt;Sonatype&amp;lt;/name&amp;gt;
    &amp;lt;url&amp;gt;http://kahveninhatiri.blogspot.com/&amp;lt;/url&amp;gt;
  &amp;lt;/organization&amp;gt;

  &amp;lt;developers&amp;gt;
    &amp;lt;developer&amp;gt;
      &amp;lt;id&amp;gt;kh&amp;lt;/id&amp;gt;
      &amp;lt;name&amp;gt;Kahvenin Hatiri&amp;lt;/name&amp;gt;
      &amp;lt;email&amp;gt;kahveninhatiri@gmail.com&amp;lt;/email&amp;gt;
      &amp;lt;url&amp;gt;http://kahveninhatiri.blogspot.com/&amp;lt;/url&amp;gt;
      &amp;lt;organization&amp;gt;Kahvenin Hatiri&amp;lt;/organization&amp;gt;
      &amp;lt;organizationUrl&amp;gt;http://kahveninhatiri.blogspot.com/&amp;lt;/organizationUrl&amp;gt;
      &amp;lt;roles&amp;gt;
        &amp;lt;role&amp;gt;developer&amp;lt;/role&amp;gt;
      &amp;lt;/roles&amp;gt;
      &amp;lt;timezone&amp;gt;+1&amp;lt;/timezone&amp;gt;
    &amp;lt;/developer&amp;gt;
  &amp;lt;/developers&amp;gt;
...
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Sıra geldi projeye birkaç bağımlılık eklemeye. Projemizin XML verileri çözümleme işleri için &lt;b&gt;Dom4J &lt;/b&gt;ve &lt;b&gt;Jaxen&lt;/b&gt; kütüphanelerini, komut satırına vereceğimiz çıktıyı formatlamak için &lt;b&gt;Velocity &lt;/b&gt;kütüphanesini ve günlük kaydı için de &lt;b&gt;Log4J &lt;/b&gt;kütüphanesini kullanacağız. Bu bağımlılıkları şu şekilde ekliyoruz:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;log4j&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;log4j&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.2.14&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;dom4j&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;dom4j&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.6.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;jaxen&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jaxen&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;velocity&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;velocity&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.5&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Peki ben bu bağımlılıkların koordinatlarını nasıl buldum? Bu iş için &lt;a href=&quot;http://jarvana.com/&quot;&gt;jarvana.com&lt;/a&gt; adresini kullanabilirsiniz.&lt;br /&gt;
Şimdi projemizin kaynak kodlarını ekleyelim. Öncelikle proje iskeleti ile gelen &lt;b&gt;App &lt;/b&gt;ve &lt;b&gt;AppTest &lt;/b&gt;sınıflarını silelim. Projemiz 5 tane sınıftan oluşacak:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;org.sonatype.mavenbook.weather.Main&lt;/b&gt;: Çalıştırılabilir main() metodunu barındıran sınıf.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;org.sonatype.mavenbook.weather.Weather&lt;/b&gt;: Hava durumu nesnesi. Yer, sıcaklık, nem v.b. bilgileri tutan basit bir JavaBean.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;org.sonatype.mavenbook.weather.YahooRetriever&lt;/b&gt;: Yahoo servisine bağlanıp, RSS kaynağından bir InputStream döner.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;org.sonatype.mavenbook.weather.YahooParser&lt;/b&gt;: Yahoo&#39;dan dönen XML i çözümleyip, bilgileri bir Weather nesnesi olarak döner.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;org.sonatype.mavenbook.weather.WeatherFormatter&lt;/b&gt;: Weather nesnelerini alıp, tanımladığımız Velocity temasına göre formatlar.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

public class Weather {
 private String city;
 private String region;
 private String country;
    private String condition;
    private String temp;
    private String chill;
    private String humidity;
    
    public Weather() {}

 public String getCity() { return city; }
 public void setCity(String city) { this.city = city; }

 public String getRegion() { return region; }
 public void setRegion(String region) { this.region = region; }

 public String getCountry() { return country; }
 public void setCountry(String country) { this.country = country; }

 public String getCondition() { return condition; }
 public void setCondition(String condition) { this.condition = condition; }

 public String getTemp() { return temp; }
 public void setTemp(String temp) { this.temp = temp; }
        
 public String getChill() { return chill; }
 public void setChill(String chill) { this.chill = chill; }

 public String getHumidity() { return humidity; }
 public void setHumidity(String humidity) { this.humidity = humidity; }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import org.apache.log4j.PropertyConfigurator;

public class Main {

 public static void main(String[] args) throws Exception {
  // Configure Log4J
  PropertyConfigurator.configure(Main.class.getClassLoader().getResource(&quot;log4j.properties&quot;));

  // Read the Zip Code from the Command-line (if none supplied, use 60202)
  String zipcode = &quot;02101&quot;;
        try {
    zipcode = args[0];
        } catch( Exception e ) {}

  // Start the program
  new Main(zipcode).start();
 }

 private String zip;

 public Main(String zip) {
  this.zip = zip;
 }
 
 public void start() throws Exception {
  // Retrieve Data
  InputStream dataIn = new YahooRetriever().retrieve( zip );

  // Parse Data
  Weather weather = new YahooParser().parse( dataIn );

  // Format (Print) Data
  System.out.print( new WeatherFormatter().format( weather ) );
 }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.log4j.Logger;

public class YahooRetriever {

 private static Logger log = Logger.getLogger(YahooRetriever.class);

 public InputStream retrieve(String zipcode) throws Exception {
  log.info( &amp;quot;Retrieving Weather Data&amp;quot; );
  String url = &amp;quot;http://weather.yahooapis.com/forecastrss?p=&amp;quot; + zipcode;
  URLConnection conn = new URL(url).openConnection();
  return conn.getInputStream();
 }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.io.SAXReader;

public class YahooParser {

 private static Logger log = Logger.getLogger(YahooParser.class);

 public Weather parse(InputStream inputStream) throws Exception {
  Weather weather = new Weather();
  
  log.info( &quot;Creating XML Reader&quot; );
  SAXReader xmlReader = createXmlReader();
  Document doc = xmlReader.read( inputStream );

  log.info( &quot;Parsing XML Response&quot; );
  weather.setCity( doc.valueOf(&quot;/rss/channel/y:location/@city&quot;) );
  weather.setRegion( doc.valueOf(&quot;/rss/channel/y:location/@region&quot;) );
  weather.setCountry( doc.valueOf(&quot;/rss/channel/y:location/@country&quot;) );
  weather.setCondition( doc.valueOf(&quot;/rss/channel/item/y:condition/@text&quot;) );
  weather.setTemp( doc.valueOf(&quot;/rss/channel/item/y:condition/@temp&quot;) );
  weather.setChill( doc.valueOf(&quot;/rss/channel/y:wind/@chill&quot;) );
  weather.setHumidity( doc.valueOf(&quot;/rss/channel/y:atmosphere/@humidity&quot;) );
  
  return weather;
 }

 private SAXReader createXmlReader() {
  Map&lt;String,String&gt; uris = new HashMap&lt;String,String&gt;();
        uris.put( &quot;y&quot;, &quot;http://xml.weather.yahoo.com/ns/rss/1.0&quot; );
        
        DocumentFactory factory = new DocumentFactory();
        factory.setXPathNamespaceURIs( uris );
        
  SAXReader xmlReader = new SAXReader();
  xmlReader.setDocumentFactory( factory );
  return xmlReader;
 }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;

import org.apache.log4j.Logger;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class WeatherFormatter {

 private static Logger log = Logger.getLogger(WeatherFormatter.class);

 public String format( Weather weather ) throws Exception {
  log.info( &amp;quot;Formatting Weather Data&amp;quot; );
  Reader reader = new InputStreamReader( getClass().getClassLoader().getResourceAsStream(&amp;quot;output.vm&amp;quot;));
  VelocityContext context = new VelocityContext();
  context.put(&amp;quot;weather&amp;quot;, weather );
  StringWriter writer = new StringWriter();
  Velocity.evaluate(context, writer, &amp;quot;&amp;quot;, reader);
  return writer.toString();  
 }
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Bu sınıfları &lt;b&gt;simple-weather\src\main\java\org\sonatype\mavenbook&lt;/b&gt; dizini altında oluşturun.&lt;br /&gt;
Şimdi Log4J ve Velocity için ayar dosyalarını ekleyelim. Önce eğer yoksa &lt;b&gt;src/main/&lt;/b&gt; altında &lt;b&gt;resources/&lt;/b&gt; klasörü oluşturun. Bu klasörün içinde &lt;b&gt;log4j.properties&lt;/b&gt; dosyası oluşturup içine şunları yazın:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=INFO
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r %-5p %c{1} %x - %m%n
&lt;/pre&gt;&lt;br /&gt;
Bu ayarlar Log4J&#39;nin günlük çıktılarını ekrana hangi formatta basacağı ile ilgilidir.&lt;br /&gt;
&lt;br /&gt;
Sıra velocity&#39;nin ayar dosyasında. Yine aynı klasörde &lt;b&gt;output.vm&lt;/b&gt; dosyasını oluşturun ve içine şunları yazın.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;*********************************
Current Weather Conditions for:
${weather.city}, ${weather.region}, ${weather.country}

Temperature: ${weather.temp}
Condition: ${weather.condition}
Humidity: ${weather.humidity}
Wind Chill: ${weather.chill}
*********************************
&lt;/pre&gt;&lt;br /&gt;
Sizin de tahmin edebileceğiz gibi bu ayar dosyası bir Weather nesnesinin alanlarına erişip (${weather.temp}) verilecek çıktı için bir düzen tanımlar.&lt;br /&gt;
&lt;br /&gt;
Projemizin çalışması için gerekli herşey bu kadar. Şimdi &lt;b&gt;mvn install&lt;/b&gt; komutuyla projeyi yerel depoda yayınlayalım.&lt;br /&gt;
3. parti bir eklenti olan &lt;b&gt;Exec &lt;/b&gt;eklentisi ile projeyi çalıştıralım:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main
&lt;/pre&gt;Bu komut ön tanımlı olan 60202 bölge kodlu Evanston&#39;ın hava durumu bilgilerini ekrana getirecektir. Eğer komut satırından başka bir bölge kodu girmek isterseniz, şöyle yapabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main -Dexec.args=&quot;70112&quot;
&lt;/pre&gt;&lt;br /&gt;
Maven en başta bizim eklediğimiz 4 bağımlılığın dışında,geçişli bağımlılıkları da classpath&#39;e ekler. Hangi kütüphanelerin classpath&#39;ta olduğunu öğrenmek için, bağımlılıkları çözümleyebilrisiniz. Bunun için gerekli komut:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn dependency:resolve
...
[INFO] [dependency:resolve]
[INFO] 
[INFO] The following files have been resolved: 
[INFO]    com.ibm.icu:icu4j:jar:2.6.1 (scope = compile)
[INFO]    commons-collections:commons-collections:jar:3.1 (scope = compile)
[INFO]    commons-lang:commons-lang:jar:2.1 (scope = compile)
[INFO]    dom4j:dom4j:jar:1.6.1 (scope = compile)
[INFO]    jaxen:jaxen:jar:1.1.1 (scope = compile)
[INFO]    jdom:jdom:jar:1.0 (scope = compile)
[INFO]    junit:junit:jar:3.8.1 (scope = test)
[INFO]    log4j:log4j:jar:1.2.14 (scope = compile)
[INFO]    oro:oro:jar:2.0.8 (scope = compile)
[INFO]    velocity:velocity:jar:1.5 (scope = compile)
[INFO]    xalan:xalan:jar:2.6.0 (scope = compile)
[INFO]    xerces:xercesImpl:jar:2.6.2 (scope = compile)
[INFO]    xerces:xmlParserAPIs:jar:2.6.2 (scope = compile)
[INFO]    xml-apis:xml-apis:jar:1.0.b2 (scope = compile)
[INFO]    xom:xom:jar:1.0 (scope = compile)
&lt;/pre&gt;&lt;br /&gt;
mvn dependency:tree komutu bağımlılıkları ağaç yapısında gösterir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn dependency:tree
...
[INFO] [dependency:tree]
[INFO] org.sonatype.mavenbook.custom:simple-weather:jar:1.0
[INFO] +- log4j:log4j:jar:1.2.14:compile
[INFO] +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] +- jaxen:jaxen:jar:1.1.1:compile
[INFO] |  +- jdom:jdom:jar:1.0:compile
[INFO] |  +- xerces:xercesImpl:jar:2.6.2:compile
[INFO] |  \- xom:xom:jar:1.0:compile
[INFO] |     +- xerces:xmlParserAPIs:jar:2.6.2:compile
[INFO] |     +- xalan:xalan:jar:2.6.0:compile
[INFO] |     \- com.ibm.icu:icu4j:jar:2.6.1:compile
[INFO] +- velocity:velocity:jar:1.5:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- commons-lang:commons-lang:jar:2.1:compile
[INFO] |  \- oro:oro:jar:2.0.8:compile
[INFO] +- org.apache.commons:commons-io:jar:1.3.2:test
[INFO] \- junit:junit:jar:3.8.1:test
...
&lt;/pre&gt;&lt;br /&gt;
Eğer proje için düşünülmüş ama sürüm uyuşmazlığı veya diğer nedenlerle seçilmeyen bağımlılıkları da görmek isterseniz, komutu hata ayıklama kipinde çalıştırın:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn install -X
...
[DEBUG] org.sonatype.mavenbook.custom:simple-weather:jar:1.0 (selected for null)
[DEBUG]   log4j:log4j:jar:1.2.14:compile (selected for compile)
[DEBUG]   dom4j:dom4j:jar:1.6.1:compile (selected for compile)
[DEBUG]     xml-apis:xml-apis:jar:1.0.b2:compile (selected for compile)
[DEBUG]   jaxen:jaxen:jar:1.1.1:compile (selected for compile)
[DEBUG]     jaxen:jaxen:jar:1.1-beta-6:compile (removed - )
[DEBUG]     jaxen:jaxen:jar:1.0-FCS:compile (removed - )
[DEBUG]     jdom:jdom:jar:1.0:compile (selected for compile)
[DEBUG]     xml-apis:xml-apis:jar:1.3.02:compile (removed - nearer: 1.0.b2)
[DEBUG]     xerces:xercesImpl:jar:2.6.2:compile (selected for compile)
[DEBUG]     xom:xom:jar:1.0:compile (selected for compile)
[DEBUG]       xerces:xmlParserAPIs:jar:2.6.2:compile (selected for compile)
[DEBUG]       xalan:xalan:jar:2.6.0:compile (selected for compile)
[DEBUG]       xml-apis:xml-apis:1.0.b2.
[DEBUG]       com.ibm.icu:icu4j:jar:2.6.1:compile (selected for compile)
[DEBUG]   velocity:velocity:jar:1.5:compile (selected for compile)
[DEBUG]     commons-collections:commons-collections:jar:3.1:compile 
[DEBUG]     commons-lang:commons-lang:jar:2.1:compile (selected for compile)
[DEBUG]     oro:oro:jar:2.0.8:compile (selected for compile)
[DEBUG]   junit:junit:jar:3.8.1:test (selected for test)
&lt;/pre&gt;&lt;br /&gt;
Aslında proje oluşturma aşaması burada bitti. Ancak Maven&#39;ın yeteneklerini göstermek için devam edelim ve projemize Birim Testleri ekleyelim.&lt;br /&gt;
Öncelikle eğer yoksa &lt;b&gt;src\test\java\org\sonatype\mavenbook&lt;/b&gt; sizini oluşturun. Biz burada iki sınıfı test edeceğiz, birincisi YahooParser. Bunun için YahooParserTest sınıfını oluşturun ve içine şunları yazın.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;

import junit.framework.TestCase;

import org.sonatype.mavenbook.weather.Weather;
import org.sonatype.mavenbook.weather.YahooParser;

public class YahooParserTest extends TestCase {

 public YahooParserTest(String name) {
  super(name);
 }
 
 public void testParser() throws Exception {
  InputStream nyData = 
   getClass().getClassLoader().getResourceAsStream(&amp;quot;ny-weather.xml&amp;quot;);
  Weather weather = new YahooParser().parse( nyData );
  assertEquals( &amp;quot;New York&amp;quot;, weather.getCity() );
  assertEquals( &amp;quot;NY&amp;quot;, weather.getRegion() );
  assertEquals( &amp;quot;US&amp;quot;, weather.getCountry() );
  assertEquals( &amp;quot;39&amp;quot;, weather.getTemp() );
  assertEquals( &amp;quot;Fair&amp;quot;, weather.getCondition() );
  assertEquals( &amp;quot;39&amp;quot;, weather.getChill() );
  assertEquals( &amp;quot;67&amp;quot;, weather.getHumidity() );
 }
}
&lt;/pre&gt;&lt;br /&gt;
Bu sınıftaki JUnit detaylarına girmeyeceğim, bu kısmı JUnit&#39;i anlattığım bir yazıda açıklarım belki. Burada YahooParser sınıfının gelen XML bilgisini doğru çözümleyip çözümlemediği kontrol ediyoruz. Bunun önce sınayacağımız bir veriye ihtiyacımız var. Bu veriyi classpath&#39;taki &lt;b&gt;ny-weather.xml&lt;/b&gt; dosyasından alıyoruz. (birazdan bu dosyayı classpath&#39;e koyacağız.) ve bu dosyadaki değerlerle karşılaştırıyoruz. Hepsi doğruysa test hata vermeden tamamlanacaktır.&lt;br /&gt;
&lt;br /&gt;
İkinci testimiz WeatherFormatter sınıfı için. Bunun için WeatherFormatterTest sınıfını aynı dizinde oluşturun.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:java&quot;&gt;package org.sonatype.mavenbook.weather;

import java.io.InputStream;

import org.apache.commons.io.IOUtils;

import org.sonatype.mavenbook.weather.Weather;
import org.sonatype.mavenbook.weather.WeatherFormatter;
import org.sonatype.mavenbook.weather.YahooParser;

import junit.framework.TestCase;

public class WeatherFormatterTest extends TestCase {

 public WeatherFormatterTest(String name) {
  super(name);
 }
 
 public void testFormat() throws Exception {
  InputStream nyData = 
   getClass().getClassLoader().getResourceAsStream(&amp;quot;ny-weather.xml&amp;quot;);
  Weather weather = new YahooParser().parse( nyData );
  String formattedResult = new WeatherFormatter().format( weather );
  InputStream expected = 
   getClass().getClassLoader().getResourceAsStream(&amp;quot;format-expected.dat&amp;quot;);
  assertEquals( IOUtils.toString( expected ), formattedResult );
 }
}
&lt;/pre&gt;&lt;br /&gt;
Bu sınıfta WeatherFormatter ın Weather nesnelerini doğru biçemlendirip biçimlendirmediği sınıyoruz. Bunun için karşılaştıracağımız bir kaynağa ihtiyacımız var. Bu kaynağı &lt;b&gt;format-expected.dat&lt;/b&gt; dosyasından alıyoruz (bu dosyayı da birazdan oluşturacağız.).&lt;br /&gt;
Burada açıklamam gereken bir ayrıntı daha var. G/Ç işleriyle uğraşmamak için bir InputStream i String olarak dönen Apache Commons un &lt;b&gt;commons-io&lt;/b&gt; kütüphanesini kullanıyoruz. Aslında bunu elle de yapabilirdik ancak test kapsamlı bağımlıkları göstermek için bu kütüphaneyi kullanıyoruz. Şimdi bu bağımlılığı pom&#39;a ekleyelim.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&lt;project&gt;
  ...
  &lt;dependencies&gt;
    ...
    &lt;dependency&gt;
      &lt;groupid&gt;org.apache.commons&lt;/groupid&gt;
      &lt;artifactid&gt;commons-io&lt;/artifactid&gt;
      &lt;version&gt;1.3.2&lt;/version&gt;
      &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
    ...
  &lt;/dependencies&gt;
&lt;/project&gt;
&lt;/pre&gt;&lt;br /&gt;
Şimdi daha önce söz verdiğimiz dosyaları ekleyelim. Önce eğer yoksa &lt;b&gt;src/test/resources&lt;/b&gt; dizinini oluşturun.&lt;br /&gt;
&lt;b&gt;format-expected.dat&lt;/b&gt; dosyasını oluşturup içine şunları yazın.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;*********************************
Current Weather Conditions for:
New York, NY, US

Temperature: 39
Condition: Fair
Humidity: 67
Wind Chill: 39
*********************************
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;ny-weather.xml&lt;/b&gt; dosyasını oluşturup içine şunları yazın.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;rss version=&amp;quot;2.0&amp;quot; xmlns:yweather=&amp;quot;http://xml.weather.yahoo.com/ns/rss/1.0&amp;quot; xmlns:geo=&amp;quot;http://www.w3.org/2003/01/geo/wgs84_pos#&amp;quot;&amp;gt;
 &amp;lt;channel&amp;gt;
 &amp;lt;title&amp;gt;Yahoo! Weather - New York, NY&amp;lt;/title&amp;gt;
 &amp;lt;link&amp;gt;http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html&amp;lt;/link&amp;gt;
 &amp;lt;description&amp;gt;Yahoo! Weather for New York, NY&amp;lt;/description&amp;gt;
 &amp;lt;language&amp;gt;en-us&amp;lt;/language&amp;gt;
 &amp;lt;lastBuildDate&amp;gt;Sat, 10 Nov 2007 8:51 pm EDT&amp;lt;/lastBuildDate&amp;gt;

 &amp;lt;ttl&amp;gt;60&amp;lt;/ttl&amp;gt;
 &amp;lt;yweather:location city=&amp;quot;New York&amp;quot; region=&amp;quot;NY&amp;quot; country=&amp;quot;US&amp;quot; /&amp;gt;
 &amp;lt;yweather:units temperature=&amp;quot;F&amp;quot; distance=&amp;quot;mi&amp;quot; pressure=&amp;quot;in&amp;quot; speed=&amp;quot;mph&amp;quot; /&amp;gt;
 &amp;lt;yweather:wind chill=&amp;quot;39&amp;quot; direction=&amp;quot;0&amp;quot; speed=&amp;quot;0&amp;quot; /&amp;gt;
 &amp;lt;yweather:atmosphere humidity=&amp;quot;67&amp;quot; visibility=&amp;quot;1609&amp;quot; pressure=&amp;quot;30.18&amp;quot; rising=&amp;quot;1&amp;quot; /&amp;gt;
  &amp;lt;yweather:astronomy sunrise=&amp;quot;6:36 am&amp;quot; sunset=&amp;quot;4:43 pm&amp;quot; /&amp;gt;
  &amp;lt;image&amp;gt;
 &amp;lt;title&amp;gt;Yahoo! Weather&amp;lt;/title&amp;gt;

 &amp;lt;width&amp;gt;142&amp;lt;/width&amp;gt;
 &amp;lt;height&amp;gt;18&amp;lt;/height&amp;gt;
 &amp;lt;link&amp;gt;http://weather.yahoo.com/&amp;lt;/link&amp;gt;
 &amp;lt;url&amp;gt;http://l.yimg.com/us.yimg.com/i/us/nws/th/main_142b.gif&amp;lt;/url&amp;gt;
 &amp;lt;/image&amp;gt;
 &amp;lt;item&amp;gt;
 &amp;lt;title&amp;gt;Conditions for New York, NY at 8:51 pm EDT&amp;lt;/title&amp;gt;

  &amp;lt;geo:lat&amp;gt;40.67&amp;lt;/geo:lat&amp;gt;
 &amp;lt;geo:long&amp;gt;-73.94&amp;lt;/geo:long&amp;gt;
  &amp;lt;link&amp;gt;http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html&amp;lt;/link&amp;gt;
 &amp;lt;pubDate&amp;gt;Sat, 10 Nov 2007 8:51 pm EDT&amp;lt;/pubDate&amp;gt;
 &amp;lt;yweather:condition text=&amp;quot;Fair&amp;quot; code=&amp;quot;33&amp;quot; temp=&amp;quot;39&amp;quot; date=&amp;quot;Sat, 10 Nov 2007 8:51 pm EDT&amp;quot; /&amp;gt;
 &amp;lt;description&amp;gt;&amp;lt;![CDATA[
&amp;lt;img src=&amp;quot;http://l.yimg.com/us.yimg.com/i/us/we/52/33.gif&amp;quot; /&amp;gt;&amp;lt;br /&amp;gt;
 &amp;lt;b&amp;gt;Current Conditions:&amp;lt;/b&amp;gt;&amp;lt;br /&amp;gt;
 Fair, 39 F&amp;lt;BR /&amp;gt;&amp;lt;BR /&amp;gt;
 &amp;lt;b&amp;gt;Forecast:&amp;lt;/b&amp;gt;&amp;lt;BR /&amp;gt;
  Sat - Partly Cloudy. High: 45 Low: 32&amp;lt;br /&amp;gt;
  Sun - Sunny. High: 50 Low: 38&amp;lt;br /&amp;gt;
 &amp;lt;br /&amp;gt;
&amp;lt;a href=&amp;quot;http://us.rd.yahoo.com/dailynews/rss/weather/New_York__NY/*http://weather.yahoo.com/forecast/10002_f.html&amp;quot;&amp;gt;Full Forecast at Yahoo! Weather&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;
 (provided by The Weather Channel)&amp;lt;br/&amp;gt;
 ]]&amp;gt;&amp;lt;/description&amp;gt;
 &amp;lt;yweather:forecast day=&amp;quot;Sat&amp;quot; date=&amp;quot;10 Nov 2007&amp;quot; low=&amp;quot;32&amp;quot; high=&amp;quot;45&amp;quot; text=&amp;quot;Partly Cloudy&amp;quot; code=&amp;quot;29&amp;quot; /&amp;gt;

&amp;lt;yweather:forecast day=&amp;quot;Sun&amp;quot; date=&amp;quot;11 Nov 2007&amp;quot; low=&amp;quot;38&amp;quot; high=&amp;quot;50&amp;quot; text=&amp;quot;Sunny&amp;quot; code=&amp;quot;32&amp;quot; /&amp;gt;
  &amp;lt;guid isPermaLink=&amp;quot;false&amp;quot;&amp;gt;10002_2007_11_10_20_51_EDT&amp;lt;/guid&amp;gt;
 &amp;lt;/item&amp;gt;
&amp;lt;/channel&amp;gt;
&amp;lt;/rss&amp;gt;&amp;lt;!-- p7.weather.re3.yahoo.com compressed/chunked Sat Nov 10 17:57:31 PST 2007 --&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Şimdi testlerimizi çalıştırabiliriz. Aslında &lt;b&gt;mvn package &lt;/b&gt;veya &lt;b&gt;mvn install&lt;/b&gt; komutlarını çalıştırınca bu evrelerden önce olan test evresi de çalıştırılır. Ancak sadece test evresini çalıştırmak isterseniz &lt;b&gt;mvn test&lt;/b&gt; komutunu da kullanabilirsiniz. Bu komutu çalıştırınca &lt;b&gt;Maven Surfire&lt;/b&gt; eklentisi testlerinizi çalıştıracaktır ve testler hakkında detaylı bilgileri &lt;b&gt;${basedir}/target/surefire-reports&lt;/b&gt; altına koyacaktır. Eğer bir şeyler ters giderse buraya bakın :)&lt;br /&gt;
&lt;br /&gt;
Eğer hatalı testlerin inşa işlemini bölmesini istemiyorsanız Bunu iki şekilde belirtebilirsiniz. İlki pom&#39;a şu parçayı ekleyerek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;testFailureIgnore&amp;gt;true&amp;lt;/testFailureIgnore&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
İkincisi komut satırından:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn test -Dmaven.test.failure.ignore=true
&lt;/pre&gt;&lt;br /&gt;
Eğer bir inşada testleri atlamak isterseniz bunu da yine iki şekilde yapabilirsiniz. İlki pom&#39;a şu parçayı ekleyerek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;project&amp;gt;
  [...]
  &amp;lt;build&amp;gt;
    &amp;lt;plugins&amp;gt;
      &amp;lt;plugin&amp;gt;
        &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;
        &amp;lt;configuration&amp;gt;
          &amp;lt;skip&amp;gt;true&amp;lt;/skip&amp;gt;
        &amp;lt;/configuration&amp;gt;
      &amp;lt;/plugin&amp;gt;
    &amp;lt;/plugins&amp;gt;
  &amp;lt;/build&amp;gt;
  [...]
&amp;lt;/project&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
İkincisi yine komut satırından:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;mvn install -Dmaven.test.skip=true
...
[INFO] [compiler:testCompile]
[INFO] Not compiling test sources
[INFO] [surefire:test]
[INFO] Tests are skipped.
...
&lt;/pre&gt;&lt;br /&gt;
Kolay Gelsin.</description><link>http://kahveninhatiri.blogspot.com/2011/04/maven-ornek-proje.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-837420995632383776</guid><pubDate>Sat, 23 Apr 2011 02:54:00 +0000</pubDate><atom:updated>2011-04-25T11:19:49.728+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-3: maven-archetype-quickstart İskeleti</title><description>&lt;d class=&quot;wlWriterSmartContent&quot; id=&quot;scid:0767317B-992E-4b12-91E0-4F059A8CECA8:b1742b7d-59e6-4924-99ac-2597a57fad28&quot; iv=&quot;&quot; style=&quot;display: inline; float: none; margin: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Technorati Etiketleri: &lt;a href=&quot;http://technorati.com/tags/maven&quot; rel=&quot;tag&quot;&gt;maven&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/giri%c5%9f&quot; rel=&quot;tag&quot;&gt;giriş&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/%c3%b6rnek&quot; rel=&quot;tag&quot;&gt;örnek&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/proje&quot; rel=&quot;tag&quot;&gt;proje&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/archetype&quot; rel=&quot;tag&quot;&gt;archetype&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/quickstart&quot; rel=&quot;tag&quot;&gt;quickstart&lt;/a&gt;&lt;/d&gt;&lt;br /&gt;
Bu bölümde örnek bir Maven projesi oluşturup detaylarıyla inceleyeceğiz. Anlatacaklarım daha önce yayınladığım &lt;b&gt;Maven Rehberi&lt;/b&gt; belgesindeki bilgilerin üzerine kurulacak. Eğer okumadıysanız şimdi okumanın tam zamanı.&lt;br /&gt;
&lt;br /&gt;
Komut satırından &lt;b&gt;mvn archetype:generate&lt;/b&gt; komutunu girerek, etkileşimli kipte proje oluşturmaya başlayın. Listelenen proje iskeletleri arasından &lt;b&gt;maven-archetype-quickstart&lt;/b&gt;&#39;ı seçin ve istenilen bilgileri girin. Projenizin &lt;b&gt;artifacId&lt;/b&gt;&#39;sini simple olarak adlandırırsak, Maven komutu çalıştırdığınız dizinde &lt;b&gt;simple/&lt;/b&gt; adında bir dizin oluşturacaktır. Bu dizinin yapısı:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;simple/[1]
simple/pom.xml[2]
      /src/
      /src/main/[3]
          /main/java
      /src/test/[4]
          /test/java
&lt;/pre&gt;&lt;br /&gt;
Bu yapıyı incelersek oluşturulan her proje için şunların yapıldığı sonucuna varabiliriz:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Projenin artifactId&#39;si ile aynı adda bir dizin: simple/.[1]&lt;/li&gt;
&lt;li&gt;İçinde POM.xml.[2]&lt;/li&gt;
&lt;li&gt;Projenin kaynak kodlarının koyulacağı src/main dizini.[3]&lt;/li&gt;
&lt;li&gt;İçinde groupId ile aynı paket yapısının içinde App adlı basit bir Java programı.&lt;/li&gt;
&lt;li&gt;Test kodlarının koyulacağı src/test dizini ve içinde App programının testi olan AppTest.[4]&lt;/li&gt;
&lt;/ul&gt;Bu projeyi inşa etmek için komut satırından POM un bulunduğu dizine geçin ve &lt;b&gt;mvn install&lt;/b&gt; komutunu çalıştırın. Bu komut projeyi derler, testlerini çalıştırır, paketler ve yerel deponuza kaydeder. Ayrıca &lt;b&gt;target/&lt;/b&gt; dizini altına &lt;b&gt;simple-1.0-SNAPSHOT.jar&lt;/b&gt; dosyasını koyar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;maven-archetype-quickstart&lt;/b&gt; proje iskeleti Maven&#39;ın tanımladığı en basit proje yapısını oluşturur. Bu projede sade bir POM, App adında bir Merhaba Dünya uygulaması ve bunun AppTest adında bir testi bulunur.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;mvn install&lt;/b&gt; komutu simple projesi üzerinde İnşa Yaşam Döngüsünün &lt;b&gt;install &lt;/b&gt;evresini çalıştırır. İnşa Yaşam Döngüsü bir projeyi inşa etmek için teker teker çalıştırılan(geçilen) bir dizi evredir(phase). Maven&#39;ın işletebileceği birçok yaşam döngüsü vardır. Ancak en önemlisi projenin kontrolü, derlenmesi, paketlenmesi, yayınlamasını da içeren İnşa&#39;dır. Eklenti hedefleri yaşam döngüsü hedeflerine bağlanabilir. Maven döngüde ilerlerken her evreye bağlanmış hedefleri sırayla çalıştırır. Her evrenin sıfır veya daha fazla hedefi olabilir. Örneğin bizim projemiz JAR çıktısı verdiği için &lt;b&gt;package &lt;/b&gt;evresine &lt;b&gt;jar:jar&lt;/b&gt; hedefi bağlanmıştır. Eğer WAR çıktısı verseydi &lt;b&gt;war:war&lt;/b&gt; hedefi çalıştırılacaktı. &lt;br /&gt;
&lt;img src=&quot;http://www.sonatype.com/books/mvnex-book/reference/figs/web/simple-project_plugin.png&quot; /&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.sonatype.com/books/mvnex-book/reference/figs/web/simple-project_phasebinding.png&quot; /&gt; &lt;br /&gt;
Maven&#39;da bir evreyi çalıştırmak, belirtilen evre ve öncesindeki bütün evrelerin çalıştırılmasına neden olur. Örneğin &lt;b&gt;mvn package&lt;/b&gt; komutu çalıştırıldığında Maven &lt;b&gt;package &lt;/b&gt;ve öncesindeki her evre için resimde görülen hedefleri çalıştırır. Çalıştırılacak hedeflerin seçimi projenin ayarlarının belirtildiği POM dosyasındaki girdilere göre değişir.&lt;br /&gt;
&lt;img src=&quot;http://www.sonatype.com/books/mvnex-book/reference/figs/web/simple-project_lifecyclebinding.png&quot; /&gt;&lt;br /&gt;
&lt;b&gt;maven-archetype-quickstart&lt;/b&gt; iskeleti projenin testlerini çalıştırmak için kullanılmak üzere &lt;b&gt;JUnit-3.8.1&lt;/b&gt; için bir bağımlılık tanımlar. &lt;b&gt;mvn install&lt;/b&gt; komutunu çalıştırdığınızda Maven, bu bağımlılığı internetten indirip yerel deponuza JUnit&#39;in koordinatlarını da göz önünde bulundurarak koyar. &lt;b&gt;Junit-3.8.1&lt;/b&gt; in koordinatları şöyledir: &lt;b&gt;junit:junit:3.8.1&lt;/b&gt;. Eğer &lt;b&gt;~/.m2/repository/&lt;/b&gt; altına bakarsanız, bu şekilde bir dizin yapısı oluşturulduğunu ve içine de &lt;b&gt;junit-3.8.1.jar&lt;/b&gt; ın yerleştirildiğini görürsünüz: &lt;b&gt;/junit/junit/3.8.1/junit-3.8.1.jar&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Maven bağımlılıklar için jar&#39;ın dışında bağımlılığın pom.xml dosyasını ve indirmenin doğru yapılıp yapılmadığını kontrol için SHA-1 dosyalarını da indirir. Bağımlılığın pom&#39;u geçişli bağımlılıkları bulabilmek için indirilir.</description><link>http://kahveninhatiri.blogspot.com/2011/04/maven-maven-archetype-quickstart.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-1250932875574675689</guid><pubDate>Sun, 17 Apr 2011 21:31:00 +0000</pubDate><atom:updated>2011-04-25T11:19:25.826+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-2: Türkçe Maven Rehberi</title><description>Sonatype&#39;ın birkaç tane CC lisanslı Maven kitabı var. Maven konusundaki Türkçe kaynak sıkıntısını gidermek adına Maven: The Complete Reference kitabının giriş ve orta seviye için önemli gördüğüm yerlerini Türkçeye çevirerek bir rehber hazırladım.&lt;br /&gt;
&lt;a href=&quot;https://docs.google.com/viewer?a=v&amp;amp;pid=explorer&amp;amp;chrome=true&amp;amp;srcid=0BxFvE_-m7xnfMjc3NmMyZTQtYzA3Ni00ZDNiLWJjNjUtZDdjY2RjMjIyYzFl&amp;amp;hl=en&quot;&gt;Maven Rehberi&lt;/a&gt;&lt;br /&gt;
Faydalı olması dileğiyle...</description><link>http://kahveninhatiri.blogspot.com/2011/04/turkce-maven-rehberi.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4238240177781293375</guid><pubDate>Sun, 03 Apr 2011 10:16:00 +0000</pubDate><atom:updated>2011-04-12T19:12:23.977+03:00</atom:updated><title>Maven3 (Proje yönetim aracı)-1: Giriş ve Kurulum</title><description>&lt;dIV class=wlWriterEditableSmartContent id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:783d7caa-8965-4ba7-be05-fb97e8a7b744 contentEditable=false style=&quot;PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FLOAT: none; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px&quot;&gt;Technorati Etiketleri: &lt;a href=&quot;http://technorati.com/tags/java&quot; rel=&quot;tag&quot;&gt;java&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/maven&quot; rel=&quot;tag&quot;&gt;maven&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/proje&quot; rel=&quot;tag&quot;&gt;proje&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/y%c3%b6netim&quot; rel=&quot;tag&quot;&gt;yönetim&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/arac%c4%b1&quot; rel=&quot;tag&quot;&gt;aracı&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/kurumsal&quot; rel=&quot;tag&quot;&gt;kurumsal&lt;/a&gt;,&lt;a href=&quot;http://technorati.com/tags/enterprise&quot; rel=&quot;tag&quot;&gt;enterprise&lt;/a&gt;&lt;/DIV&gt;&lt;p&gt;Merhabalar. Bu yazımızda piyasada çok kullanılan bir proje yönetim aracı olan &lt;b&gt;Maven&lt;/b&gt;’ı işliyoruz.  &lt;p&gt;Maven bir proje yönetim aracıdır. “Ben projelerimi zaten kendim (ya da IDE’m vasıtasıyla) yönetebiliyorum. Bunun için bir araca ne gerek var?”, demeyin. Bu yazı dizisi çaylak Javacılara hitap ettiği için muhtemelen projeleriniz Maven kullanmanızı gerektirecek büyüklükte değildir. Kurumsal projeler ise bazen o kadar büyük olabiliyor ki, Maven gibi araçlara ihtiyaç duyulabiliyor.  &lt;p&gt;&lt;b&gt;Maven ne yapar?&lt;/b&gt;  &lt;p&gt;Maven en başta projeleriniz (tipine göre) için bir standart dizin yapısı tanımlar. Bu sayede, örneğin siz Netbeans’te çalışıyorken Netbeans’in oluşturduğu dizin yapısı ile arkadaşınız Eclipse’de çalışıyorken Eclipse’in oluşturduğu dizin yapısı veya bunların kullandığı özel ayarlar yüzünden projelerin taşınabilirliğinin olmamasının önüne geçer.  &lt;p&gt;Kurumsal Java projeleri o kadar büyük olabilir ki, bazen 100’lerce 3. Parti kütüphane jar’ı kullanmanız gerekebilir. Bu jarları internetten birbirleriyle uygun sürümlerine göre indirip IDE’nizde kütüphaneleri koyduğu yere koymanız, sonra ayrı ayrı javadoc ve kaynak kodlarını ayarlamanız ve bunları proje üzerinde geliştirme yapan herkesin standart bir şekilde uygulaması angarya olur. Öyle ki projeyi geliştirmekten çok yönetimine kafa patlatırsınız. Maven buna da çözüm getirir. Maven’ın yaklaşık 200 GB büyüklüğünde çevrimiçi bir deposu vardır. Siz Maven’a projenizde hangi kütüphaneyi kullanmak istediğinizi söylersiniz, o da bu depodan jarları indirip sizin yerel deponuza kaydeder ve projenin classpath’ını bu jarları da dâhil edecek şekilde değiştirir.  &lt;p&gt;Maven projenin yönetimi için standart bir yaşam döngüsü tanımlar: &lt;b&gt;Temizle-Derle-Test Et-Çalıştır-Yayınla&lt;/b&gt;… gibi. Siz çeşitli eklentilerle (&lt;b&gt;plugin&lt;/b&gt;) bu döngüye müdahale edebilir, projenizin gerekliliklerine göre değiştirebilirsiniz. Maven’ın çekirdeği aslında çok basittir. Çekirdek sadece gerekli jarları internetten nasıl indireceğini ve XML dosyalarıyla yapılan ayarların nasıl uygulanacağını bilir. Bu yüzden çok hafiftir (&lt;b&gt;lightweight&lt;/b&gt;). Eklentilerle Maven’ı ayarlamak size kalır.  &lt;p&gt;Maven projeler için kendi modelini tanımlar. Projenin ayar dosyasına girdiğiniz verileri (tanım, geliştiriciler, lisans, bağımlı olduğu diğer projeler v.s.) çok çeşitli işlerde kullanabilir. Bu açıklamaları kullanarak tek bir komutla projeye özel bir web sitesi bile oluşturabilir.  &lt;p&gt;&lt;b&gt;Kurulum&lt;/b&gt;  &lt;p&gt;Maven 3’ü &lt;a href=&quot;http://maven.apache.org/download.html&quot;&gt;http://maven.apache.org/download.html&lt;/a&gt; adresinden indirebilirsiniz. Kurulumunu sadece Windows’a göre anlatacağım. Çünkü zaten diğer işletim sistemlerini kullananlar biraz sonra anlatacağım ayarları kendi sitemlerinde nasıl yapacakları biliyorlardır.  &lt;p&gt;İndirdiğiniz sıkıştırılmış dosyayı &lt;b&gt;C:\&lt;/b&gt; dizinine açın. Bu dizinde şuna benzer bir klasör oluşmalı: &lt;b&gt;C:\apache-maven-3.0.3&lt;/b&gt;  &lt;p&gt;Bilgisayarıma sağ tıklayıp Özellikler’e tıklayın (ya da Denetim Masası’ndan Sistem’i açın). Gelişmiş sekmesinde Çevre değişkenlerine (environment variables) tıklayın. Sistem değişkenleri (system variables) altında Yeni’ye tıklayın. Değişken adına: &lt;tt&gt;&lt;b&gt;M2_HOME&lt;/b&gt;&lt;/tt&gt; , değerine de &lt;b&gt;C:\apache-maven-3.0.3&lt;/b&gt; girin, Tamam’a tıklayın.  &lt;p&gt;Aynı pencerede tekrar Yeni’ye basın. Bu sefer değişken adına &lt;b&gt;M2&lt;/b&gt; değerine de &lt;tt&gt;&lt;b&gt;%M2_HOME%\bin&lt;/b&gt;&lt;/tt&gt; girin.  &lt;p&gt;Yine aynı pencerede &lt;b&gt;Path&lt;/b&gt; değişkenine tıklayıp, düzenle’yi seçin. Değer kısmının en sonunda &lt;b&gt;; &lt;/b&gt;yoksa ekleyin, sonra da &lt;tt&gt;&lt;b&gt;%M2%&lt;/b&gt;&lt;/tt&gt; ‘ yi ekleyin.  &lt;p&gt;Yine ayrı pencerede &lt;b&gt;JAVA_HOME&lt;/b&gt; değişkeni yoksa ekleyin ve değerine &lt;b&gt;JDK&lt;/b&gt;’nın bulunduğu dizinin yolunu verin. Örneğin &lt;b&gt;C:\Program Files\Java\jdk1.6.0_24&lt;/b&gt;  &lt;p&gt;Sonra &lt;b&gt;Path&lt;/b&gt; değişkenine üstteki gibi &lt;b&gt;&lt;tt&gt;%JAVA_HOME%&lt;/tt&gt; &lt;/b&gt;‘yi ekleyin.  &lt;p&gt;&lt;b&gt;Windows+R &lt;/b&gt;tuşlarına basıp &lt;b&gt;cmd&lt;/b&gt; ‘yi çalıştırın. Komut satırından &lt;b&gt;mvn –v&lt;/b&gt; ‘yi çalıştırarak kurulumunuzu sınayın.  &lt;p&gt;&lt;b&gt;Kurulum Ayrıntıları&lt;/b&gt;  &lt;p&gt;Maven’ın yalın 3.0.3 sürümü yaklaşık 2.9 MB boyutunda. Bu kadar küçük olmasının nedeni, gerektiğinde ihtiyacı olduğu eklentileri kendi deposundan indirebiliyor olmasıdır.  &lt;p&gt;Maven kurulum dizini şu dosya ve klasörleri içerir:  &lt;p&gt;&lt;pre class=&quot;brush:plain&quot;&gt;LICENSE.txt 
NOTICE.txt 
README.txt 
bin/ 
boot/ 
conf/ 
lib/ 
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Bunlardan, &lt;b&gt;bin/&lt;/b&gt; içinde Maven’ı çalıştıran &lt;b&gt;mvn&lt;/b&gt; komut kümesi (&lt;b&gt;batch&lt;/b&gt;)’i barındırır. &lt;b&gt;boot/&lt;/b&gt; içinde Maven’ın çalıştırıldığı bir Sınıf Yükleyici (&lt;b&gt;Class Loader&lt;/b&gt;)’yi oluşturan &lt;b&gt;plexus-classworlds-2.4.jar&lt;/b&gt; dosyası vardır. &lt;b&gt;conf/&lt;/b&gt; klasöründe Maven’ın global ayarlarını bulunduran &lt;b&gt;settings.xml&lt;/b&gt;’i barındırır. &lt;strong&gt;lib/&lt;/strong&gt; içinde de Maven çekirdeğini oluşturan &lt;strong&gt;maven-core-3.0.3.jar &lt;/strong&gt;dosyası bulunur. &lt;br /&gt;
&lt;p&gt;&lt;b&gt;Yerel Maven Deposu ve Ayarları&lt;/b&gt; &lt;br /&gt;
&lt;p&gt;Maven’ı projelerinizde ilk kullanmaya başladığınızda, işletim sisteminizin kullanıcı dizininde (Win XP: &lt;b&gt;C:\Documents and Settings\Foobar\.m2&lt;/b&gt; ya da Linux: &lt;b&gt;/home/foobar&lt;/b&gt; ya da genel adıyla &lt;b&gt;~/&lt;/b&gt;) &lt;b&gt;.m2&lt;/b&gt; adında bir klasör oluşturur. Bu klasör sizin yerel ayarlarınızın ve kütüphane (&lt;b&gt;jar&lt;/b&gt;) deponuzun (&lt;b&gt;repository&lt;/b&gt;) bulunduğu dizindir. Bu dizinde iki tane girdi olacaktır: &lt;br /&gt;
&lt;p&gt;&lt;b&gt;~/.m2/settings.xml&lt;/b&gt; : Kullanıcıya özel Maven ayarlarının bulunduğu dosya. &lt;br /&gt;
&lt;p&gt;&lt;b&gt;~/.m2/repository&lt;/b&gt;: Yerel Maven deposu. İnternetten indirilen jarlar buraya konulur. &lt;br /&gt;
&lt;p&gt;Eğer Maven’ın ayarlarını değiştirmek isterseniz &lt;b&gt;~/.m2/settings.xml&lt;/b&gt; dosyasında değişiklik yapmanız daha doğru olacaktır.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;em&gt;Devamı gelecek…&lt;/em&gt;&lt;/p&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/04/caylak-javacnn-piyasa-rehberi-2-maven3.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-7552573348547335515</guid><pubDate>Sat, 19 Mar 2011 00:38:00 +0000</pubDate><atom:updated>2011-03-19T02:47:47.698+02:00</atom:updated><title>Windows Sağ Tuş Menüsünü Yönetmek</title><description>&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergisinde yayınlanmıştır.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilgisayarınıza çok sık program kurup kaldırıyorsunuz ve gün geçtikçe sağ tuş menünüz ne işe yaradığını bile bilmediğiniz girdilerle doldu. Ya da belirli dosyalar/klasörler üzerinde bazı işlemleri çok sık yapıyorsunuz ve &quot;keşke şu işlem için bir kısayol olsa&quot; diye düşünüyorsunuz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu ay hem sağ tuş menüsünü gereksiz girdilerden temizleyip bu can sıkıcı durumu düzeltiyor hem de yararlı kısayollar ekleyip bilgisayar deneyiminizi daha eğlenceli hale getiriyoruz. Hadi başlayalım.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPfGo1tYu7ofsKyq5Wg1m5IoRzwwgtV3Lyxvc2gyHii5-4xI8I2PW4j0XKfVs_oQ3t1nBSPei-lTpR3kSnUoD_jPI3YTZBsRLdXn6jk09UZvGn_vOystRa0PtlGXL5abZSclsfsczgaWA/s1600/programsagtikcrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPfGo1tYu7ofsKyq5Wg1m5IoRzwwgtV3Lyxvc2gyHii5-4xI8I2PW4j0XKfVs_oQ3t1nBSPei-lTpR3kSnUoD_jPI3YTZBsRLdXn6jk09UZvGn_vOystRa0PtlGXL5abZSclsfsczgaWA/s640/programsagtikcrop.bmp&quot; width=&quot;264&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Türkçe&#39;ye kullanımından Sağ Tuş Menüsü (STM) olarak çevirebileceğimiz menü, herhangi bir klasöre, programa, dosyaya masaüstünde ya da herhangi bir klasörün içindeyken farenin sağ tuşuna basılınca çıkan menüdür. Bilgisayar dünyasında Sağ Tuş Menü (Right Click Menu), Dizin Menüsü (Context Menu), Kabuk Menüsü (Shell Menu), İşlev Menüsü şeklinde isimleri vardır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Windows&#39;ta STM girdisi genelde iki şekilde eklenir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Birincisi Windows Kayıt Defteri&#39;ne programın ya da sistemin uygun girdisi altında &quot;shell&quot; ya da &quot;shellex&quot; altında yeni girdileri oluşturulup uygun ayarlar atanırsa STM&#39;ye girdi eklenmiş olur. Buralardaki girdiler değiştirilip silinerek STM yönetilebilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;İkinci yöntem ise &quot;context menu dll&#39;lerini&quot; sisteme kaydettirmek (DLL Register işlemi). Bazı programlar STM girdilerini bir dll dosyası içinde tutar. Bu dll dosyalarını Program Files altında bulabilirsiniz. Windows komut satırından &quot;&lt;b&gt;regsvr32 dosyaAdi.dll&lt;/b&gt;&quot; komutunu çalıştırarak, STM&#39;ye programın girdisini ekleyebilirsiniz. &quot;&lt;b&gt;regsvr32 /u dosyaAdi.dll&lt;/b&gt;&quot; komutu da sistemde kayıtlı bir girdiyi kaldırmaya yarar. Bu duruma canlı bir örnek vermek gerekirse, çoğumuzun kullandığı Notepad++ programının Program Files dizininde &quot;nppcm.dll&quot; adında bir dosya var. Bu dosyaya sağ tıklayıp özelliklerine bakarsanız dosyanın STM girdisi oluşturduğunu görürsünüz (Context Handler Menu for Notepad++). Az önceki komutları kullanarak Notepad++ girdisini STM&#39;den kaldırabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kayıt Defteri Kullanarak STM&#39;den Girdilerini Düzenlemek&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;STM girdileri kayıt defterinde genellikle &lt;b&gt;HKEY_CLASSES_ROOT&lt;/b&gt; altında tutulur. HKEY_CLASSES_ROOT altında sisteminizin tanıdığı bütün dosya uzantılarını görebilirsiniz. Burada \shellex &#39;in altındaki girdileri düzenleyip ayrı ayrı her dosya tipi için STM girdilerini belirleyebilirsiniz. En üstte bulunan &quot;*&quot; altında ise&amp;nbsp; sadece belli bir dosya tipine göre değil tüm STM&#39;lerde beliren girdiler bulunur. Eğer girdiler {XXXXXXXX­XXXX­XXXX­XXXX­XXXXXXXXXXXX} şeklinde ise, ifadeyi Kayıt Defteri&#39;nde ya da Google&#39;da aratarak ne işe yaradığı hakkında fikir edinebilirsiniz. Diğer önemli STM kayıtlarının bulunduğu Kayıt Defteri girdileri:&amp;nbsp;&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Bilgisayarım&lt;/b&gt;:&amp;nbsp;CLSID\{20D04FE0­3AEA­1069­A2D8­08002B30309D}\shell&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Internet&amp;nbsp;Explorer&lt;/b&gt;:&amp;nbsp;CLSID\{871C5380­42A0­1069­A2EA­08002B30309D}\shell&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Ağ&lt;/b&gt;:&amp;nbsp;CLSID\{F02C1A0D­BE21­4350­88B0­7367FC96EF3C}\shell&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Başlat Menüsü&lt;/b&gt;:&amp;nbsp;Directory\Shell&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Klasör Seçenekleri&#39;ni Kullanarak STM Girdilerini Düzenlemek&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sadece belirli dosya türlerine ait STM girdilerini düzenlemek için Denetim Masası&amp;gt;Klasör Seçenekleri&amp;gt;Dosya Türleri altından bulanan seçenekleri kullanabilirsiniz. Burada istediğiniz dosya türünü seçip &quot;Gelişmiş&quot; e tıkladığınızda, o dosya türüne ait tüm girdileri görebilir, yeni girdiler ekleyip, istemediklerinizi silebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibspPlk6rveschHJsddOduSs8hyphenhyphenmp7ysWGTIHLQfiwFwGihpEtTm7gwwtoTy4aLaGtK8y01RJFpF7YAeuEqRAIC3h8Krb9l-NsrfQ11-LVg6NNMYmyFr0Iq9MeKMU9yrnfa4WDn89dCek/s1600/klasorseceneklericrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibspPlk6rveschHJsddOduSs8hyphenhyphenmp7ysWGTIHLQfiwFwGihpEtTm7gwwtoTy4aLaGtK8y01RJFpF7YAeuEqRAIC3h8Krb9l-NsrfQ11-LVg6NNMYmyFr0Iq9MeKMU9yrnfa4WDn89dCek/s400/klasorseceneklericrop.bmp&quot; width=&quot;348&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBl_PhIsQh0t8E-7aUXdIhsMSx5SV64UPsCieZdl0orbkRPO72unrqghFK-AtvXHIpTar2GjxV0wuHC93j0IqTB93B4GRKJ2pUHQ1TEQpxgyINCjfq7muMS7TphjviTA5ZfZSvh2o_nF0/s1600/winrarfullcrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBl_PhIsQh0t8E-7aUXdIhsMSx5SV64UPsCieZdl0orbkRPO72unrqghFK-AtvXHIpTar2GjxV0wuHC93j0IqTB93B4GRKJ2pUHQ1TEQpxgyINCjfq7muMS7TphjviTA5ZfZSvh2o_nF0/s400/winrarfullcrop.bmp&quot; width=&quot;206&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF6JT4GGRDc1cz1_nl90ZyazVVa2nVDWPzs7_m3KDS7VUzeYOkz4fvy_vhoD6iRqocdUfkvWkPkFnPJzdc6ZTgP8Igsg7fiZ_DhcvE4dYas-ToSiI0JPAKs4zpML9J8S1WMqk5WABwiw/s1600/winrar-altmenucrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;126&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBF6JT4GGRDc1cz1_nl90ZyazVVa2nVDWPzs7_m3KDS7VUzeYOkz4fvy_vhoD6iRqocdUfkvWkPkFnPJzdc6ZTgP8Igsg7fiZ_DhcvE4dYas-ToSiI0JPAKs4zpML9J8S1WMqk5WABwiw/s320/winrar-altmenucrop.bmp&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bir çok programın STM&#39;ye girdi ekleyip eklememesini programın ayarlarından kontrol edebilirsiniz. Genelde programın ayarlar bölümünde sistem sekmesi altında STM ile ilgili seçenekler bulunur. Şimdi size bazı durumda STM&#39;nüzü neredeyse yarıya indirecek bir ipucu vereyim. Bazı dosyalara sağ tıkladığınızda WinRAR&#39;ın çıldırmış gibi STM&#39;yü doldurmuş oldurduğunu görürsünüz (Ekran görüntüsünde 8 tane :) Ama WinRAR&#39;ın ayarları içinden &quot;Bütünleşme&quot; sekmesinde &quot;Uzayan işlev menüleri&quot; seçeneğini aktifleştirirsiniz bütün bu winrar girdileri STM&#39;de bir alt menü altında görüntülenecektir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kişiselleştirme&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;STM&#39;müzü gereksiz girdilerden temizledik şimdi ona daha gelişmiş özellikler katmaya ne dersiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilgisayarınızda çok sık yaptığınız işlemler için STM&#39;ye kısayollar, özelikler ekleyebilirsiniz. Örneğin sık sık bir dosyayı/klasörü açıyorsunuz, komut satırı üzerinden &quot;cd&quot; ile bulunduğunuz dizini değiştiriyorsunuz, dosyaların uzantılarını, gizli dosyaları gösterip gizliyorsunuz...&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu işlemlerini hepsi ve daha fazlası için küçük STM eklentilerini internetten bulabilirsiniz. (“Sağ tuş eklentileri” diye google’da arama yapmanız yeterli). İşinize yarayabilecek girdilerden bazıları:&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfOyQDaxsBmXTaaZDlzd2W71eW62I2E7iNmCUNDlIpa3Ct-Ms06WUM2Lzpv6pKF2gbzJlbb1mWTP_fvvdJ_TgG-bZJt9l-fNYqotzC9xecxK7UAU4sWyCCJGCEl_G9fprXLRsOWRt_9w/s1600/desktopsagcrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfOyQDaxsBmXTaaZDlzd2W71eW62I2E7iNmCUNDlIpa3Ct-Ms06WUM2Lzpv6pKF2gbzJlbb1mWTP_fvvdJ_TgG-bZJt9l-fNYqotzC9xecxK7UAU4sWyCCJGCEl_G9fprXLRsOWRt_9w/s1600/desktopsagcrop.bmp&quot; /&gt;&lt;/a&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Masaüstü STM:&lt;/b&gt;&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;Gizli dosyaları göster      gizle&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Klasöre kopyala-taşı&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Komut penceresi aç&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Masaüstünü göster&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXrCBi9vbK0-xo3YJGTI0mkV8HqVKWXI-i6ySH9TRfQs3HlDZ63W4fkQ1skzH1JPiZhFUSSUH2b4Y-rZsZMBxQDVvCeVTm2lGe0s-UW4ogom5xi08-lLuLA9beGC6iRl0pRWH5CLZdthE/s1600/bilgisayarimcrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXrCBi9vbK0-xo3YJGTI0mkV8HqVKWXI-i6ySH9TRfQs3HlDZ63W4fkQ1skzH1JPiZhFUSSUH2b4Y-rZsZMBxQDVvCeVTm2lGe0s-UW4ogom5xi08-lLuLA9beGC6iRl0pRWH5CLZdthE/s400/bilgisayarimcrop.bmp&quot; width=&quot;231&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Bilgisayarım STM:&lt;/b&gt;&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;Program Ekle Kaldır&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Disk Temizle&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Denetim Masası&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Aygıt Yöneticisi&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Olay Görüntüleyicisi&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Kayıt Defteri&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Hizmetler&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;margin-left: 36pt;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;STM&#39;ye kendinize ait girdiler eklemek ise çok kolay. Belli bir dosya tipine özel bir girdi ekleyecekseniz yukarıda anlattığım Klasör Seçenekleri ipucunu takip edebilirsiniz. Dosya türünü düzenlediğiniz ekranda &quot;Yeni&quot; düğmesine tıklayarak girdiye bir isim ve girdinin çalıştıracağı komutu belirmeniz yeterli.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kayıt Defteri ipucunda anlattığım yerlere özel bir girdi ekleyecekseniz, istediğiniz Kayıt Defteri yolu altında &quot;\shell&quot; altında yeni bir anahtar oluşturun. Anahtarın adı STM&#39;de gözüken metin olacaktır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;HKEY_CLASSES_ROOT\CLSID\{20D04FE0­3AEA­1069­A2D8­08002B30309D}\shell\Filmleri Aç&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu anahtarın altında &quot;command&quot; adında yeni bir anahtar oluşturun. &quot;(Varsayılan-Default)&quot; kayıt girdisine çalıştırılacak komutu girin.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Vista kullanıcılarına özel bir ipucu&lt;/b&gt;: Vista’da herhangi bir klasörde boş bir yere “Shift” tuşu basılıyken sağ tıklarsanız, normalde gizli olan “Komut Satırı Aç” girdisini görebilirsiniz. Sık sık cmd’de “&lt;b&gt;cd&lt;/b&gt;” ile klasör değiştirenlerin işine yarayacaktır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;STM&#39;nüzü düzenlemek için illa ki her program için kayıt defterinde iğne aramak, hangi dll in ne işe yaradığını bilmenize gerek yok. Bu iş kullanabileceğiniz birkaç ücretsiz program:&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;ShellExView&lt;/b&gt;: Bu program STM&#39;ye kaydolmuş bütün girdileri ad, uzantı,program ad ve özelliklerine göre listeliyor. Program içinden girdileri aktif edip kapatabilir, böylelikle daha temiz bir STM&#39;ye sahip olabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq2xecaBDqPczC0nWk2UvItboMfdTEgar5lGRAZCNIoeqYcaZVKoovXfd39_8V2ofG8TjoEyDHNRnitVOM0yFwFZvVV0DGWh_jXhFp6ZHIlSuC5bSX5Jq_C5fhpDffUtpo47W8MPeLXV4/s1600/shellexview.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;624&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq2xecaBDqPczC0nWk2UvItboMfdTEgar5lGRAZCNIoeqYcaZVKoovXfd39_8V2ofG8TjoEyDHNRnitVOM0yFwFZvVV0DGWh_jXhFp6ZHIlSuC5bSX5Jq_C5fhpDffUtpo47W8MPeLXV4/s640/shellexview.bmp&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Folder Guide&lt;/b&gt;: Sıklıkla açtığınız klasörleri programa ekliyorsunuz. Ekranda herhangi bir yere sağ tıkladığınızda klasörleriz emrinizde.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj-jCNkT45ku9M33HvHdjxBPbpDslwwds9TGuxIXDtso0P8rHxtS1qntDCZ19aaxlZcipRFiSzcoG7q3rZvR94lPR3JnfkgQ_wAAuiD4sOBwJDQz6x7Y1nM4JM7BHs0cPVFWeCrV_FKzE/s1600/folderguidecrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;163&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj-jCNkT45ku9M33HvHdjxBPbpDslwwds9TGuxIXDtso0P8rHxtS1qntDCZ19aaxlZcipRFiSzcoG7q3rZvR94lPR3JnfkgQ_wAAuiD4sOBwJDQz6x7Y1nM4JM7BHs0cPVFWeCrV_FKzE/s400/folderguidecrop.bmp&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;FileMenuTools&lt;/b&gt;:STM&#39;nünüzü yönetmek için bir başka güzel araç. Üstelik ücretsiz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcR748U21M4YpNn-qbeykQhpNcr3LI_FePpp-ePUdj2w-X7TKi8yLzz9h23tubpI3LiBEgL0AgwmIpwAJsJsI2DMUZSq2Nu_pkb7coNs-syAqAtNDkoIYUmUDlgfKRbbt9e9GedYvAOu0/s1600/filemenutoolscrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcR748U21M4YpNn-qbeykQhpNcr3LI_FePpp-ePUdj2w-X7TKi8yLzz9h23tubpI3LiBEgL0AgwmIpwAJsJsI2DMUZSq2Nu_pkb7coNs-syAqAtNDkoIYUmUDlgfKRbbt9e9GedYvAOu0/s400/filemenutoolscrop.bmp&quot; width=&quot;341&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;WinBubble&lt;/b&gt;: Windows için ayar (Tweak) aracı.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxry_lvDHfnrj1pYNeGQBJ2MLmDybT2uWZTMwCsq9Kb0SzpzoSmdWJOQUZcL0EQr6yIH2j1_a6bdzJak4-GtZ63u5vRCGSdqmepjOXj3P5g4iz2WpTvBKk1tTwMQ0ncjQ6O826fORuPp0/s1600/sendtocrop.bmp&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxry_lvDHfnrj1pYNeGQBJ2MLmDybT2uWZTMwCsq9Kb0SzpzoSmdWJOQUZcL0EQr6yIH2j1_a6bdzJak4-GtZ63u5vRCGSdqmepjOXj3P5g4iz2WpTvBKk1tTwMQ0ncjQ6O826fORuPp0/s400/sendtocrop.bmp&quot; width=&quot;286&quot; /&gt;&lt;/a&gt;&lt;b&gt;Gönder (Send To) Menüsünü Düzenlemek&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Gönder Menüsü aslında “&lt;b&gt;C:\Documents and Settings\Kullanıcı_Adı&lt;/b&gt;“&amp;nbsp; (Vista için: “&lt;b&gt;C:\Users\Kullanici_Adi&lt;/b&gt;” olabilir) altında Send To adında bir klasördür (Bu &lt;b&gt;klasör&lt;/b&gt; genelde gizlidir, görünmüyorsa gizli dosyaları göstermeniz gerekebilir). Burada Gönder menüsündeki programların &quot;kısayolları&quot; bulunur. Bu kısayolları silerek istemediğiniz girdileri kaldırabilirsiniz. Ya da kendi kısayolunuzu ekleyerek yeni bir girdi ekleyebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Örneğin arşiv amaçlı kullandığınız bir klasörünüz var. Bu klasöre kopyalayacağınız dosyaları sadece Sağ Tık&amp;gt;Gönder komutu ile kopyalamak ister miydiniz? Hem de dosyalarınız nerde olursa olsun. Send To klasörünün içinde sağ tıklayıp &quot;Yeni&amp;gt;Kısayol&quot; komutu ile ona bir kısayol oluşturmanız yeterli.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Gelecek ay görüşmek dileğiyle…&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kaynaklar&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://www.extremetech.com/&quot;&gt;www.extremetech.com&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://www.wincert.net/forum&quot;&gt;www.wincert.net/forum&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/windows-sag-tus-menusunu-yonetmek.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPfGo1tYu7ofsKyq5Wg1m5IoRzwwgtV3Lyxvc2gyHii5-4xI8I2PW4j0XKfVs_oQ3t1nBSPei-lTpR3kSnUoD_jPI3YTZBsRLdXn6jk09UZvGn_vOystRa0PtlGXL5abZSclsfsczgaWA/s72-c/programsagtikcrop.bmp" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4441160753951791897</guid><pubDate>Sat, 19 Mar 2011 00:10:00 +0000</pubDate><atom:updated>2011-03-19T02:25:26.679+02:00</atom:updated><title>Linux Sürücü Yazma-3</title><description>&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergisinde yayınlanmıştır. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Herkese merhabalar. İki aydır sürücü yazmak için gerekli bilgileri öğrendik. Artık bu kadar uğraşımızın meyvesini almaya, sürücümüzü yazmanın vakti geldi.&lt;br /&gt;
Daha önce öğrendiğimiz bilgiler ışığında ne yapmak istediğimizi kararlaştıralım. Biz kesmelerle çalışan, char tipli bir USB Fare için sürücü yazmaya çalışıyoruz.&lt;br /&gt;
Bu yazıda anlatılan kodların tamamı &lt;b&gt;David Olivera&lt;/b&gt;’nın &lt;b&gt;Logitech Media Play Cordless Mouse&lt;/b&gt; için yazdığı &lt;b&gt;lmpcm_usb.c&lt;/b&gt; sürücüsü temel alınarak yazılmış ve A4Tech R7 Mouse için bazı değişiklikler yapılmıştır. Benim de hala anlamadığım ve açıklamakta zorlandığım noktalar var. Ama elimden geldiğince açıklamaya çalışacağım.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Dikkat!!! İLERİ DERECE C BÖLGESİ&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;Yazının buradan sonrası ağır derecede C içerir. Okuyucuların ileri derece C konuları ile aşina olması gerekliliği vardır. Yoksa okuduğunuzdan hiçbir şey anlamayabilirsiniz. Alıcılarınızın ayarlarıyla oynamayın !!!&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Sürücümüzü bir modül halinde yazacağımızı daha önce belirtmiştik. Sürücüsünü yazacağımız farenin marka ve modeli A4Tech R7 olduğu için sürümüze &lt;b&gt;a4r7mouse &lt;/b&gt;ismini veriyoruz ve diskimizde &lt;b&gt;a4r7mouse.c&lt;/b&gt; adında bir C dosyası oluşturuyoruz. Bu dosyaya ilk önce aşağıdaki satırlar ile gerekli kütüphaneleri ekliyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;#include &amp;lt;linux kernel.h&amp;gt;
#include &amp;lt;linux slab.h&amp;gt;
#include &amp;lt;linux input.h&amp;gt;
#include &amp;lt;linux module.h&amp;gt;
#include &amp;lt;linux init.h&amp;gt;
#include &amp;lt;linux usb.h&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Sonra aşağıdaki tanımlamaları yapıp devamındaki makrolarla sürücünün bilgilerini çekirdeğe giriyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;#define DRIVER_VERSION &quot;v0.0.1&quot;
#define DRIVER_AUTHOR &quot;Hamza Apaydin hamzaapaydin@hotmail.com&quot;
#define DRIVER_DESC &quot;USB A4Tech Power Saver R7 Wireless Mouse Driver&quot;
#define DRIVER_LICENSE &quot;GPL&quot;

MODULE_AUTHOR ( DRIVER_AUTHOR );
MODULE_DESCRIPTION ( DRIVER_DESC );
MODULE_LICENSE ( DRIVER_LICENSE );
&lt;/pre&gt;&lt;br /&gt;
Sonra ne işe yaradığını benim de bilmediğim, ama çekirdeğin kullandığını tahmin ettiğim bazı koşullu derleme komutlarını ekliyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;#ifdef SLAB_ATOMIC
# define ATOMIC SLAB_ATOMIC
#else
# define ATOMIC GFP_ATOMIC
#endif
&lt;/pre&gt;&lt;br /&gt;
Sonra sürücümüzün en temel yapısını (struct) yazıyoruz. Bu yapı sisteme bağlanan A4Tech R7 Mouse’un çekirdekteki mantıksal (logic) karşılığı olacak. Biz bu yapının bir örneğini oluşturup yanına bu yapıdaki URB ‘ler için IH’ler yazıp, daha başka eklerle sisteme bir &lt;b&gt;struct usb_driver&lt;/b&gt; örneği olarak kaydedeceğiz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;typedef struct usb_a4r7mouse {
 // Cihazın adı
 char name[128];  
 // USB gelen interrupt verisi. İşte cihazdan gelen verilere buradan erişeceğiz.
 signed char *data;  
 //TODO bunun ne anlama geldiğini bul
 char phys[64];
 // cihazın DMA adresi
 dma_addr_t data_dma;
 //USB portuna takılan cihazın logic gösterimini tutan struct
 struct usb_device *usbdev;
 // cihazdan girdileri almada kullanacağımız struct
 struct input_dev *inputdev;
 // cihazdan gelen USB Request block
 struct urb *urb;
 // cihazın açılma sayısı
 int open;
} a4r7mouse_t;
//En son olarak bu yapıdan a4r7mouse_t adında bir örnek oluşturuyoruz.
&lt;/pre&gt;&lt;br /&gt;
Sonra bu oluşturduğumuz örneğe ilk değerlerini atayacak olan (initialize) fonksiyonu yazıyoruz. &lt;b&gt;memset &lt;/b&gt;ile hafızada &lt;b&gt;a4r7mouse &lt;/b&gt;yapısının boyutu kadar yer ayırıyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;void a4r7mouse_init ( a4r7mouse_t *a4r7mouse ) {
 memset(a4r7mouse, 0, sizeof(a4r7mouse_t));
 a4r7mouse-&amp;gt;inputdev = NULL;
 a4r7mouse-&amp;gt;urb = NULL;
 a4r7mouse-&amp;gt;data = NULL;
}
&lt;/pre&gt;&lt;br /&gt;
Burada cihaz sistemden kaldırıldığında cihazın kullandığı kaynakları serbest bırakan fonksiyonu yazıyoruz. Cihazın urb’si boş değilse usb_free_urb ile, data’sı boş değilse de cihazın kullandığı tampon usb_buffer_free ile serbest bırakıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;void a4r7mouse_free ( a4r7mouse_t *a4r7mouse ) {
 if ( a4r7mouse-&amp;gt;urb )
  usb_free_urb(a4r7mouse-&amp;gt;urb);
 if ( a4r7mouse-&amp;gt;data )
  usb_buffer_free(a4r7mouse-&amp;gt;usbdev,8,a4r7mouse-&amp;gt;data,a4r7mouse-&amp;gt;data_dma);
 kfree(a4r7mouse);
}&lt;/pre&gt;&lt;br /&gt;
Bu fonksiyon ise parametre olarak bir usb_device struct’ı alıp geriye yeni a4r7mouse nesnesi döndürüyor. Bu fonksiyonun kullanımını aşağıda probe fonksiyonu içinde çağırımından sonra daha iyi anlayacaksınız.&lt;br /&gt;
Buradaki usb_device sistemdeki USB Core’ı tarafından&lt;br /&gt;
Sisteme her USB cihaz bağlandığında cihazın bağlandığı USB interface alınır ve aşağıdaki probe fonksiyonunda &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;a4r7mouse_t *a4r7mouse_new ( struct usb_device *dev ) {
 a4r7mouse_t *a4r7mouse;
 // kmalloc ile struct’a bellekten yer ayrılıyor.
 if (!(a4r7mouse = kmalloc(sizeof(a4r7mouse_t), GFP_KERNEL)))
  return NULL;
 // az önce yazdığımız init fonk. Çağrılarak a4r7mouse örneği initialize ediyor.
 a4r7mouse_init(a4r7mouse);
 // Input device için yer ayrılıyor.
 if ( (a4r7mouse-&amp;gt;inputdev = input_allocate_device()) == NULL ) {
  a4r7mouse_free(a4r7mouse);
  return NULL;
 }
 //  urb handler için bellekte yer ayır.
 if (!(a4r7mouse-&amp;gt;urb = usb_alloc_urb(0, GFP_KERNEL))) {
  a4r7mouse_free(a4r7mouse);
  return NULL;
 }
 // urb deki data’yı göndermek ve almak için kullanılacak tamponu oluştur.
 if (!(a4r7mouse-&amp;gt;data = usb_buffer_alloc(dev,8,ATOMIC,&amp;amp;a4r7mouse-&amp;gt;data_dma))) {
  a4r7mouse_free(a4r7mouse);
  return NULL;
 }
 //  a4r7mouse nin  usb device alanına fonksiyona parametre olarak gelen usb_device’ı ata
 a4r7mouse-&amp;gt;usbdev = dev;
 return a4r7mouse;
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
İşte URB’den gelen datayı alıp, işleyip Linux çekirdeğine gönderen fonksiyonumuz. Burada data dizisinden bitmapte gösterildiği sırada verileri alıyoruz. input_report_key() fonksiyonları ile sisteme girdi tuşlarını kaydediyoruz. Bu fonksiyonun çağrılarında kullanılan BTN_LEFT gibi sabitler input.h’da tanımlıdır. Burada yapılacak herhangi bir değişiklik ile örneğin;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;input_report_key(dev, BTN_LEFT,    GETBIT(btn,0));&amp;nbsp;&lt;/pre&gt;satırında KEY_A yazılırsa farenin sol tuşuna basılınca, sol tıklama olayı değil de klavyeden A tuşuna basılmış gibi bir tepki verir bilgisayar.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;void input_send_data ( struct input_dev *dev, char *data ) {
 //data dizisindeki bitleri alıyoruz.
 char btn = data[0], // ilk 8 bit. Sol, sağ, orta tuş için
  x = data[1], // X  ekseninde hareket
  y = data[2], // Y ekseninde hareket
  w = data[3]; // tekerleğin hareketi&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Burada printk ile data bitlerini yazdırırsak tuşların bit karşılıklarını buluruz ve bir çeşit tersine mühendislik yapmış oluruz. Biz de burada bunu yaparak faremizdeki ekstra tuşların bit haritasını elde edebiliriz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;input_report_key(dev, BTN_LEFT,    GETBIT(btn,0));
 input_report_key(dev, BTN_RIGHT,   GETBIT(btn,1));
 input_report_key(dev, BTN_MIDDLE,  GETBIT(btn,2));
 input_report_key(dev, BTN_SIDE,   GETBIT(btn,3));
 input_report_key(dev, BTN_EXTRA,   GETBIT(btn,4));

 input_report_rel(dev, REL_X,     x);
 input_report_rel(dev, REL_Y,     y);
 input_report_rel(dev, REL_WHEEL, w);
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;GETBIT(btn,0)&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
İfadesi ise datanın bitlerini maskelemeye yarayan GETBIT makrosunun çağrısıdır. Bu makro data dizisinin ikinci parametrede belirtilen bitini döner. Tabii bu makronun tanımı da kodların arasına eklemelisiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;#define GETBIT(v,n)     ((v&amp;gt;&amp;gt;(n))0x01)
#define SETBIT(v,n)     (v |= (0x01&amp;lt;&amp;lt;(n)))&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Bu fonksiyon ise cihazımızdan her URB geldiğinde çalışacak olan Interrupt Handler. Burada URB’nin içinden fare nesnesi elde ediliyor. Taşıdığı data alınıyor. Az önce yazdığımız input_send_data() çağrısı ile basılan tuşlar sisteme kaydediliyor. En son usb_submit_urb çağrısı ile URB USB Core’a gönderiliyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static void usb_a4r7mouse_handle(struct urb *urb) {
 a4r7mouse_t *mouse = urb-&amp;gt;context;
 signed char *data = mouse-&amp;gt;data;
 struct input_dev *inputdev = mouse-&amp;gt;inputdev;
 // Check returned status
 if (urb-&amp;gt;status) return ;
 // Send data to input interface
 input_send_data(inputdev,data);
 input_sync(inputdev);
 usb_submit_urb(urb,ATOMIC);
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Cihazın açma ve kapatma fonksiyonları&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static int usb_a4r7mouse_open(struct input_dev *dev) {
 a4r7mouse_t *mouse = input_get_drvdata(dev);
 if (mouse-&amp;gt;open++)
  return 0;
 mouse-&amp;gt;urb-&amp;gt;dev = mouse-&amp;gt;usbdev;
 if (usb_submit_urb(mouse-&amp;gt;urb, GFP_KERNEL)) {
  mouse-&amp;gt;open--;
  return -EIO;
 }
 return 0;
}

static void usb_a4r7mouse_close(struct input_dev *dev) {
 //a4r7mouse_t *mouse = dev-&amp;gt;private;
 a4r7mouse_t *mouse = input_get_drvdata(dev);
 if (!--mouse-&amp;gt;open)
  usb_kill_urb(mouse-&amp;gt;urb);
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Yazdığımız modülün çekirdek tarafından sürücü olarak tanınması olarak tanınması için. Bir “struct usb_driver” örneği oluşturup, bu örneğin içini gerekli bilgilerle doldurmalıyız. Bu yapıda; name sürücünün adını belirtir ve sistemde benzersiz olmalıdır  probe ise sürücünün iş yapan fonksiyonuna bir işaretçidir. Donanım ile iletişime geçen fonksiyon budur.  Disconnect de cihaz sistemden kaldırıldığında çalışacak olan (muhtemelen cihaza ayrılan sistem kaynaklarının serbest bırakıldığı) fonksiyona bir işaretçidir. İd_table ise geçen sayıda anlattığımız bu sürücünün hangi cihazlar için yüklenmesi gerektiğini belirten, bu cihazların Vendor ve Product ID’lerinin tutulduğu bir “usb_device_id” dizisidir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static struct usb_driver usb_a4r7mouse_driver = {
 .name  = &quot;a4r7mouse_usb&quot;,
 .probe  = usb_a4r7mouse_probe,
 .disconnect = usb_a4r7mouse_disconnect,
 .id_table = usb_a4r7mouse_id_table
};&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Bizim cihazımız için bu dizi şu biçimdedir: &lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static struct usb_device_id usb_a4r7mouse_id_table [] = {
 { USB_DEVICE(0x09da, 0x021f) },
 { }
};&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Buradaki 09da değerinin geçen sayıda elde ettiğimiz Vendor ID’ye 021f değerinin ise Product ID’ye karşılık geldiğine dikkat edin. Bu yapının içini cihaz ve üretici numaraları ile değil de usb.h içinde tanımlı olan bazı sabitleri kullanarak sadece bir cihaz için değil de belli bir tür sınıf (cihazın ayar registerlarında tanımlı olan) cihaz için geçerli olmasını sağlayabiliriz. Şu makro ile id_table ımızın bir usb id_table’ı olduğunu belirtiyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;MODULE_DEVICE_TABLE (usb, usb_a4r7mouse_id_table);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Disconnect metodumuz ise şöyle:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static void usb_a4r7mouse_disconnect(struct usb_interface *intf) {
 a4r7mouse_t *mouse = usb_get_intfdata(intf);
 usb_set_intfdata(intf,NULL);
 if (mouse) {
  usb_kill_urb(mouse-&amp;gt;urb);
  input_unregister_device(mouse-&amp;gt;inputdev);
  a4r7mouse_free(mouse);
 }
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Burada cihazın bağlı olduğu usb interface’den somut bir a4r7mouse nesnesi oluşturuyoruz. Sonra bu interface’ı boşaltıyoruz. Cihaz sistemden ayrılmadan önce bir urb göndermiş olabilir bu yüzden geçerli urb’yi öldürüyoruz (kill). Cihazı sistemden silip (input_unregister_device), Mouse nesnemizi boşaltıyoruz. Sonra yazı dizimizin ikinci bölümünde bahsettiğim, modülümüzün init fonksiyonunu yazıyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static int __init usb_a4r7mouse_init(void) {
 int rv;
 // usb sürücüyü sisteme kaydet
 rv = usb_register(&amp;amp;usb_a4r7mouse_driver);
 return rv;
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Hatırlarsanız modülleri anlatırken “bir modül init fonksiyonu içinde sürücüyü sisteme kaydetmelidir” demiştir. İşte burada da&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;rv = usb_register(&amp;amp;usb_a4r7mouse_driver);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Çağrısı ile tam olarak bunu yapıyoruz.  Modülün exit fonksiyonunda sürücüyü sistemden kaldırıyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static void __exit usb_a4r7mouse_exit(void) {
 usb_deregister(&amp;amp;usb_a4r7mouse_driver);
}&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Ve şu iki makro ile init ve exit fonksiyonlarını çekirdeğe tanıtıyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;module_init(usb_a4r7mouse_init);
module_exit(usb_a4r7mouse_exit);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Dikkat ettiğiyseniz usb_a4r7mouse_driver  yapısının probe fonksiyonun açıklamadan geçtim. Asıl işi yapacak bu fonksiyon olduğu ve çok uzun olduğu için sona sakladım. Açıklamayı adım adım yapacağım önce fonksiyonun tanımı verelim sonra içini dolduralım.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static int usb_a4r7mouse_probe(struct usb_interface *intf, const struct usb_device_id *id) { }
&lt;/pre&gt;&lt;br /&gt;
Bu fonksiyonu yazdığımız sürücünün hiçbir yerinde çağırmadığımıza dikkat edin. Bu fonksiyonu çekirdek cihazın bağlı olduğu interface ve cihazın vendor ve product id bilgisi ile birlikte çağırır ve sürücünün çalışması başlar. İlk satır ile fonksiyona gelen interface bilgisinden bir usb_device nesnesi elde ediyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;struct usb_device *dev = interface_to_usbdev(intf);
struct usb_host_interface *interface;
struct usb_endpoint_descriptor *endpoint;
a4r7mouse_t *mouse;
int pipe, maxp;
char *buf;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Her USB interface için o interface’in bilgilerini tutan endpoint denilen bir yapı vardır. Burada interface üzerinden endpoint alınıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;// Get mouse endpoint
interface = intf-&amp;gt;cur_altsetting;
if ( interface-&amp;gt;desc.bNumEndpoints != 1 ) return -ENODEV;
endpoint = &amp;amp;interface-&amp;gt;endpoint[0].desc;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Burada endpoint özellikleri kontrol ediliyor. Eğer endpointimiz interrupt ile veri gönderen bir endpoint ise bizim cihazımızın özelliklerini taşıyor demektir.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;if (!(endpoint-&amp;gt;bEndpointAddress &amp;amp; USB_DIR_IN))
  return -ENODEV;
if ((endpoint-&amp;gt;bmAttributes &amp;amp; USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT)
  return -ENODEV;&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Endpoint ile iletişime geçecek pipe (kanal) oluşturuluyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;pipe = usb_rcvintpipe(dev, endpoint-&amp;gt;bEndpointAddress);
maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Artık elimizdeki cihaz bir a4r7mouse nesnesi olabilecek niteliktedir. Elimizdeki dev nesnesinde bir a4r7mouse nesnesi oluşturuyoruz.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;if (!(mouse = a4r7mouse_new(dev)))
 return -ENOMEM;
&lt;/pre&gt;Ve bir input_device oluşturuyor ve  initiliaze ediyoruz. Bu fonksiyonun açıklamasını daha sonra yapacağız.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;input_device_init(mouse-&amp;gt;inputdev,intf,mouse,dev);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Bunların ne yaptığını ben de bilmiyorum :)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;// Set device name
 if (!(buf = kmalloc(63, GFP_KERNEL))) {
  a4r7mouse_free(mouse);
  return -ENOMEM;
 }
 if (dev-&amp;gt;descriptor.iManufacturer &amp;amp;&amp;amp;
  usb_string(dev, dev-&amp;gt;descriptor.iManufacturer, buf, 63) &amp;gt; 0)
   strcat(mouse-&amp;gt;name, buf);
 if (dev-&amp;gt;descriptor.iProduct &amp;amp;&amp;amp;
  usb_string(dev, dev-&amp;gt;descriptor.iProduct, buf, 63) &amp;gt; 0)
   sprintf(mouse-&amp;gt;name, &quot;%s %s&quot;, mouse-&amp;gt;name, buf);
 if (!strlen(mouse-&amp;gt;name))
sprintf(mouse-&amp;gt;name, &quot;a4r7mouse.c: A4Tech Power Saver R7 Wireless Mouse on usb%04x:%04x&quot;,
   mouse-&amp;gt;inputdev-&amp;gt;id.vendor, mouse-&amp;gt;inputdev-&amp;gt;id.product);
 kfree(buf);&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
Burada bir başka önemli işlem yapılıyor. Bu cihaz için yazdığımız URB Handler (usb_a4r7mouse_handle) sisteme kaydediliyor. Ve cihazın dma modları ayarlanıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;usb_fill_int_urb(mouse-&amp;gt;urb,dev,pipe,mouse-&amp;gt;data,((maxp &amp;gt; 8)?8:maxp),usb_a4r7mouse_handle,mouse,endpoint-&amp;gt;bInterval);
 mouse-&amp;gt;urb-&amp;gt;transfer_dma = mouse-&amp;gt;data_dma;
 mouse-&amp;gt;urb-&amp;gt;transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
&lt;/pre&gt;&lt;br /&gt;
Cihaz input device olarak kaydediliyor. Artık bu cihazdan gelen sinyaller input API’ye gönderilecek. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;input_register_device(mouse-&amp;gt;inputdev);
&lt;/pre&gt;&lt;br /&gt;
Üzerinde çalışığımız inteface’in device bilgisi bizim Mouse nesnemize set ediliyor. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;usb_set_intfdata(intf,mouse);
 return 0;
&lt;/pre&gt;&lt;br /&gt;
Son olarak input_device_dev fonksiyonu.  &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;static void input_device_init ( struct input_dev *inputdev, struct usb_interface *intf, void *private, struct usb_device *dev ) {}
 &lt;/pre&gt;Tekrardan fonksiyona void pointer ile geçirilen a4r7mouse nesnemizi elde ediyoruz. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;char path[64];
a4r7mouse_t *mouse = (a4r7mouse_t *) private;
&lt;/pre&gt;&lt;br /&gt;
input device ın özellikleri atanıyor. Önce farenin tıklama ve bırakma olayları. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;inputdev-&amp;gt;evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
&lt;/pre&gt;&lt;br /&gt;
Temel tuşlar &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;inputdev-&amp;gt;keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE) |    BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA);
&lt;/pre&gt;&lt;br /&gt;
x-y ekreninde hareket &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;inputdev-&amp;gt;relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y);
&lt;/pre&gt;&lt;br /&gt;
Tekerin hareketi&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;inputdev-&amp;gt;relbit[0] |= BIT_MASK(REL_WHEEL); 
&lt;/pre&gt;&lt;br /&gt;
Cihazla ilgili özellikler ayarlanıp fonksiyon bitiriliyor. (üretici, ad, versiyon, adres, açma kapama fonk.)&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:cpp&quot;&gt;input_set_drvdata(inputdev, mouse);

 // Input file operations

 inputdev-&amp;gt;open = usb_a4r7mouse_open;
 inputdev-&amp;gt;close = usb_a4r7mouse_close;

 // Device

 inputdev-&amp;gt;name = mouse-&amp;gt;name;

 usb_make_path(dev,path,64);
 snprintf(mouse-&amp;gt;phys,64,&quot;%s/input0&quot;,path);

 inputdev-&amp;gt;phys = mouse-&amp;gt;phys;
 inputdev-&amp;gt;id.bustype = BUS_USB;
 inputdev-&amp;gt;id.vendor = dev-&amp;gt;descriptor.idVendor;
 inputdev-&amp;gt;id.product = dev-&amp;gt;descriptor.idProduct;
 inputdev-&amp;gt;id.version = dev-&amp;gt;descriptor.bcdDevice;
&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;Sürücüyü Çalıştır(ama)ma&lt;/b&gt;&lt;br /&gt;
Şimdi normalde daha önce verdiğim makefile ile bu modülü derleyip, insmod ile yüklediğinizde sürücünün çalışması lazım. Ancak daha önce sistemde hazır gelen sürücü fare sınıfındaki bütün cihazlar için tanımlandığı için bizim sürücümüzün önene geçmektedir. Yapmamız gereken bizim sürücümüzün bu genel sürücüden önce yüklenmesini sağlamaktır. Tabii bu söylendiği kadar kolay olmamaktadır. Bildiğiniz gibi linux’ta sürücüler modül olarak gelebildiği gibi çekirdeğin derlenmesinde sisteme yerleştirilerek gömülü olarak da gelebilmektedir. Burada yapmamız gereken dağıtımınıza bağlı olarak değişebildiği gibi genelde şudur. Linux’ta sisteme yüklenen bütün modüller “/etc/” dosyasında tanımlıdır. Bu dosyadan bizim sürücümüzü engelleyen sürücüyü bulup, “/etc/insmod/blacklist.conf” dosyasına “blacklist modüladi” şeklinde yazıp, sürücüyü kara listeye almak ve modülün yüklenmesini engellemektir.&lt;br /&gt;
Eğer sürücü çekirdeğe gömülü olarak geliyorsa yapmanız gereken bu sürücüyü çekirdekten çıkarıp tekrar derlemektir. Bu adımda yapacaklarınız bir yazı dizisinde daha bahsedilebilecek kadar bilgi gerektirdiğinden Allah size kolaylık versin diyorum.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Sonuç&lt;/b&gt;&lt;br /&gt;
Yukarıda anlattığım nedenlerden dolayı kendi sürücümüzü bir türlü sisteme yükleyemedik. Yani 3 aydır kafa patlattığımız yazımız sonucunda çalışır hiçbir kod elde edemedik (Hellomodül dışında). Eğer konu ilginizi çekti ve ben illaki bu sürücüyü çalıştıracağım diyorsanız, dağıtımınızın belgelerine bakmanızı, bizim örnek aldığımız David Olivera’nın Logitech sürücüsünü incelemenizi öneririm.&lt;br /&gt;
&lt;br /&gt;
Uzun ve yorucu bir dizi oldu. Gelecek ay görüşmek dileğiyle.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kaynaklar&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Linux Device Drivers, Robert Corbert, O’Reilly, 2005&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;Linux Kernel Development, Robert Love, Novell Press, 2005&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;www.kernel.org&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;David Olivera Logitech Sürücüsü&lt;/i&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/linux-surucu-yazma-3.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-3798199086769082587</guid><pubDate>Fri, 18 Mar 2011 20:17:00 +0000</pubDate><atom:updated>2011-03-18T22:43:10.500+02:00</atom:updated><title>Linux Sürücü Yazma-2</title><description>&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergisinde yayınlanmıştır. &lt;/i&gt;&lt;/div&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Herkese merhabalar. Geçen ay başladığımız Linux sürücüsü yazma serüvenimizin ikinci yazısıyla yine beraberiz (TV programı girişi gibi oldu :) Yazının birinci kısmında Linux çekirdeğine giriş yapmış ve sürücü yazarken işimize yarayacak çeşitli konulara (sistem çağrıları gibi) değinmiştik. Bu ay bu konulara kaldığımız yerden devam ediyoruz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kesmeler&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;İşletim sisteminin donanımdaki değişiklikleri ya da ondan gelen sinyalleri algılaması (örneğin klavyeden bir tuşa basılması) için iki genel yöntem bulunur. Bunlardan birincisi &lt;b&gt;polling&lt;/b&gt; denilen CPU’nun sürekli donanımda bir değişiklik var mı diye onu kontrol etmesidir. Ama bu yöntem sürekli işlemciyi meşgul edeceği için terk edilmiştir. İkinci ve en çok kullanılan bir yöntem ise donanımın CPU’ya kesme göndermesidir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Mesela bilgisayarınızda Half-Life oynuyorsunuz. İşlemci siz oyunu oynarken o sırada ekranda görülmesi gereken nesnelerinin durumlarını hesaplamakla meşguldür. Patlamalar, kurşunların hedefte zarara yok açması gibi... Birden klavyeden &lt;b&gt;W-A-S-D&lt;/b&gt; tuşlarına basarak konumunuzu değiştirdiniz. Artık ekranda farklı cisimlerin gözükmesi gerekir. İşte bu noktada klavye CPU’ya yaptığı işi KESME&#39;sini ve klavyeden basılan tuşlara göre oyuncunun yeni konumunu hesaplaması ve ekranda gösterilecek yeni nesnelerin durumlarını hesaplamasını söyler.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kesmeler temelde önce &lt;b&gt;kesme yönetici (interrupt controller)’ &lt;/b&gt;ne oradan da CPU’ya gönderilen elektrik sinyalleridir. İşlemci bu sinyalleri alır ve işlemek üzere işletim sistemine gönderir. İşletim sistemi tarafında bir Interrupt’a cevap verilmek üzere çalıştırılacak olan kodların bulunduğu fonksiyona &lt;b&gt;Interrupt Handler &lt;/b&gt;denir. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;İşletim sistemi de &lt;b&gt;Interrupt Handler&lt;/b&gt; ‘leri çağırarak bu kesmelere cevap verir. İşletim sistemi tarafından her donanıma farklı bir kesme numarası verilir. Böylece gelen kesmenin hangi donanım tarafından üretildiği belirlenir. Kesme numarasıyla birlikte bunlara &lt;b&gt;Interrupt Request (IRQ)&lt;/b&gt; denir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Günümüz PC’leri iç mimarilerinde donanımlar arası haberleşme için PCI veri yolunu kullanır. PCI veri yolunda IRQ’lar dinamik olarak belirlenebilir. Bu da tak ve kullan cihazların sistemin yeniden başlatılmasına gerek kalmadan hemen kullanılmasını sağlar.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Pn5iSR3FY4LmLMOFZP9yy2tDtWcr-lV2q9N1YmRNhKDZxjyPQmqbz_C9p531FAImMQo4npdZxKMY6j2gDGqanRQe4IuzwO-8325_4-Ixd2hytRcUSolI1QUrrBX9M1loKUC-Z9joZ8E/s1600/Foto-0015.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Pn5iSR3FY4LmLMOFZP9yy2tDtWcr-lV2q9N1YmRNhKDZxjyPQmqbz_C9p531FAImMQo4npdZxKMY6j2gDGqanRQe4IuzwO-8325_4-Ixd2hytRcUSolI1QUrrBX9M1loKUC-Z9joZ8E/s640/Foto-0015.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Çekirdek tarafında bir IRQ’ya cevap olarak çalışan fonksiyonlara &lt;b&gt;Interrupt Handler(IH)&lt;/b&gt; denir. Biz de sürücümüzü yazarken, donanımdan gelen isteklere cevap vermek üzere bir IH yazacağız. IH&#39;lar normal C fonksiyonlarıdır. Çekirdek bu fonksiyonları kesmelere cevap olarak çağırır. Bir IH donanımdan gelen isteğe göre istenilen işi yapmalı ve donanıma işin sonucuna göre bir cevap vermelidir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Bir IH&#39;yi Sisteme Kaydetmek&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bir IH’nin donanımdan gelen isteklere cevap vermesi için IRQ ile IH’nin birbirine bağlanması gerekir. Bu &lt;b&gt;request_irq()&lt;/b&gt; fonksiyonu ile yapılır. Bu fonksiyondaki ikinci parametre olan IH, birinci parametre olan kesmeyi işleyecek şekilde sisteme kaydedilir. Bundan sonra &lt;b&gt;irq&lt;/b&gt; numaralı kesme geldiğinde ikinci parametredeki fonksiyon çağrılacaktır.&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;pre class=&quot;brush:cpp&quot;&gt;int request_irq(int irq, irqreturn_t (*handler) (int, void *, struct pt_regs *),
long flags, char *devname, void *dev_id)
&lt;/pre&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Burada ilk parametre gelen kesmenin numarası, ikinci parametre bu kesmeyi işleyecek IH’yi işaret eden bir fonksiyona göstericisi, &lt;b&gt;flag&lt;/b&gt; parametresi çeşitli ayarlar için kullanılan bayrak değişkeni, dördüncü parametre cihazın adı, beşinci parametre cihazı gösteren işaretçidir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;IH Yazmak&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bir IH fonksiyonu şu prototipe uyar:&lt;/div&gt;&lt;pre class=&quot;brush:cpp&quot;&gt;static irqreturn_t int_handler(int irq, void *dev_id,
 struct pt_regs *regs)
&lt;/pre&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Burada &lt;b&gt;irq&lt;/b&gt; kesme numarası, &lt;b&gt;dev_id&lt;/b&gt; ise donanımı gösteren bir işaretçidir. Bu fonksiyonun içinde donanımdan gelen kesmelere cevap olacak işlemlerin yapılması gerekir. Örneğin kullanıcı klavyeden ‘A’ tuşuna bastıysa sisteme ‘A’ tuşuna basıldı sinyalinin verilmesi ve buna cevap bir işlem yapılmalıdır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRr9tsaQBMtkpYB5mjTFdpSrBzGBkR88XX0v-4Y3YiYBx5OedLNvmNxv2YAT_NSHaB36dkJF0ArYGF9T8tJe7hPrjYocYMUO-QBiflJqoCyDI2_gfb7qolVZVyW-fBa-prnceVw_SX4ps/s1600/Foto-0013.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;414&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRr9tsaQBMtkpYB5mjTFdpSrBzGBkR88XX0v-4Y3YiYBx5OedLNvmNxv2YAT_NSHaB36dkJF0ArYGF9T8tJe7hPrjYocYMUO-QBiflJqoCyDI2_gfb7qolVZVyW-fBa-prnceVw_SX4ps/s640/Foto-0013.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Resim 6.1 de donanımdan gelen bir kesmenin nasıl işlendiği görülüyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Modül Yazmak&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Yavaş yavaş sürücü yazımına geçmek üzereyiz. Ancak bahsetmemiz gereken bir kaç şey daha var. Daha önce de belirttiğimiz gibi biz sürücümüzü modül olarak yazacağız ve çekirdeğe sistem çalışırken dinamik olarak yükleyeceğiz. Şimdi bu konuya bakalım.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Modüller sistem çalışırken dinamik olarak çekirdeğe yüklenebilen çekirdek programcıklarıdır. Bu özelliklerine bakarak modülleri çekirdek yamaları olarak da nitelendirebiliriz. Basit bir modül tanımı aşağıda görülmektedir. Her modülde modül ilk yüklendiğinde çekirdek tarafından çağırılan bir &lt;b&gt;init&lt;/b&gt; fonksiyonu ve modül sistemden kaldırıldığında çağırılan bir &lt;b&gt;exit&lt;/b&gt; fonksiyonu tanımlanmış olmalıdır. En alttaki &lt;b&gt;module_init&lt;/b&gt; ve &lt;b&gt;module_exit&lt;/b&gt; makroları ise bu fonksiyonları çekirdeğe bildirir. &lt;b&gt;MODULE_LICENSE&lt;/b&gt; satırı dikkatinizi çekmiştir. Bu makro ile de modülün hangi lisans ile lisanslandığı belirtilir. Lisansın niye özellikle belirtildiği merak etmiş olabilirsiniz. Linux GPL ile dağıtıldığı için onu kullanan bütün kodların (buna modüller de dâhil) GPL ile dağıtılması gereklidir. Bu modül derlenirken açık kaynaktan başka bir lisans kullanılmışsa kod derleme sırasında hata verecektir. Açık kaynakçılar lisanslamayı bu kadar ciddi takip ediyorlar.&lt;/div&gt;&lt;pre class=&quot;brush:java&quot;&gt;#include &lt;linux module.h=&quot;&quot;&gt; /* Needed by all modules */
#include &lt;linux kernel.h=&quot;&quot;&gt; /* Needed for KERN_INFO */

MODULE_LICENSE(&quot;GPL&quot;);

int __init init_module(void)
{
 printk(KERN_INFO &quot; Merhaba Kernel Programlama \n&quot;); 
 return 0;
}

void __exit exit_module(void)
{
 printk(KERN_INFO &quot; Güle güle Kernel Programlama \n&quot;);
}

module_init(init_module);
module_exit(exit_module);&amp;nbsp;&lt;/linux&gt;&lt;/linux&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Bir sürücü yazılırken yapılması gereken init fonksiyonunun içinde sürücüyü sisteme kaydetmek ve gerekli ilk yükleme işlemlerini yapmak, exit fonksiyonunun içinde ise daha önceden sürücüye tahsis edilen sistem kaynaklarını sisteme geri vermektir.&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Modülü Derlemek&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Daha önce anlatıldığı gibi &lt;b&gt;linux-source&lt;/b&gt; ve &lt;b&gt;linux-headers&lt;/b&gt; paketlerini kurduysanız, basit bir &lt;b&gt;makefile&lt;/b&gt; yazıp modül derleme işlemini kolayca halledebilirsiniz. İçinizden makefile da ne diye soruyorsanız, makefile Linux&#39;ta C derleyicileri için çeşitli derleme parametrelerinin ve komutlarının toplu olarak bulunduğu bir dosyadır. Derleyici bu dosyadaki ayarlara göre kaynak kodun derlemesini yapar. Biz de böylece komut satırından onlarca satır komut girmek zorunda kalmayız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu da hello modülümüzü derleyecek makefile dosyasının içeriği:&lt;/div&gt;&lt;pre class=&quot;brush:plain&quot;&gt;ifneq ($(KERNELRELEASE),) 
 obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
Endif
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;Bu makefile’da shell’e bazı komutlar gönderilip &lt;b&gt;(shell uname -r),&lt;/b&gt; Linux başlık dosyalarının nerede olduğu bulunuyor ve buna göre kaynak kodumuzu derleniyor. Bu dosyadaki modülle ilgili en önemli komut;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;i&gt;obj-m :=hello.o&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Derleyici &lt;b&gt;hello.c&lt;/b&gt;’yi derledikten sonra oluşan &lt;b&gt;hello.o&lt;/b&gt; dosyasından &lt;b&gt;hello.ko&lt;/b&gt; biçiminde bir modül oluşturacaktır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu makefile ile modülümüzü derledikten sonra elimizde hello.ko modülü oluşur. &lt;b&gt;insmod&lt;/b&gt; programı modülü çekirdeğe yüklemek için kullanılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;i&gt;insmod hello.ko&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu komut çağırılır çağrılmaz, modülün init fonksiyonu çağrılır ve komut satırında printk ile yazdırdığımız mesaj gözükür. Bazı dağıtımlarda bu çıktılar komut satırı yerine sistem loglarına basılabilir. &lt;b&gt;/var/log/syslog&lt;/b&gt; dosyasına bakabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKEVHKaxwUNlcN6-h7zW2n4biv_R-ElFuX2faBczVO6XbpsLF6EjU4Scvt0PgNgJS2cGvsslje1SLjmhK6lYYYTGZJxWiHcYSPcb0wMZ1f83MGsqx14ipWLEc7tJNXlb8cY5IX70z41o/s1600/syslog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKEVHKaxwUNlcN6-h7zW2n4biv_R-ElFuX2faBczVO6XbpsLF6EjU4Scvt0PgNgJS2cGvsslje1SLjmhK6lYYYTGZJxWiHcYSPcb0wMZ1f83MGsqx14ipWLEc7tJNXlb8cY5IX70z41o/s640/syslog.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;rmmod&lt;/b&gt; ise modülü sistemden kaldırmak için kullanılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;i&gt;rmmod hello.ko&lt;/i&gt;&lt;/b&gt; komutunu çalıştırdığınızda modül sistemden kaldırılır ve modülün exit fonksiyonu çağrılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Donanım Çeşitleri&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Donanımlar bilgisayarla haberleşme yöntemlerine göre 3&#39;e ayrılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;char:&lt;/b&gt; char donanımlar giriş-çıkış portlarına elektrik sinyalleri halinde tekli sırada, stream (akış) şeklinde veri gönderen cihazlardır. Klavye, fare, yazıcı, projeksiyon cihazı bunlara örnek verilebilir. Örneğin klavyeden basılan tuşlar bir akış halinde sırayla bilgisayara gönderilir. Bu cihazlar bilgisayara &lt;b&gt;interrupt&lt;/b&gt; verisi gönderir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;block&lt;/b&gt;: içindeki verilere tek bir akıştan sabit hızda değil de, donanımın farklı konumlarından aynı anda rastgele ve farklı hızlarda erişilen donanımlardır. En iyi örnek hard disk gibi depolama birimleridir. Bu cihazlar ise bilgisayarla haberleşmek için &lt;b&gt;bulk&lt;/b&gt; verisi gönderir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;network&lt;/b&gt;: ağ iletişimi için kullanılan, aynı anda hem okuma hem yazma yapabilen ve işlemleri ağın trafiğine ve topolojiye göre belirli bir sürede yapmak zorunda olan donanımlardır. Kablosuz ağ kartları örnek verilebilir. Bu cihazlar bilgisayara &lt;b&gt;tty&lt;/b&gt; verisi gönderir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilgisayarla haberleşme biçimleri farklı olduğu için, bu 3 farklı cihaz türünün de sürücüsü yazılırken farklı yollar izlenir. Açıklamalardan da anlayabileceğiniz sürücüsünü yazacağımız fare char tipli bir donanımdır ve iletişim için bilgisayara interrupt gönderir. Bu yüzden biz sürücü yazmayı sadece char donanımlara göre anlatacağız ve sadece interrupt verisi işleyen bir sürücü yazacağız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;USB Cihazlar&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;USB sürücüsü yazmaya çalıştığımız için bu noktada, USB’nin hangi türe girdiğini merak etmiş olabilirsiniz. &lt;b&gt;Cevap E Hepsi :)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Usb arayüzü genel amaçlı bir arayüz olduğu için yukarıda sayılan türdeki cihazların hepsi (fare, usb hard disk, kablosuz ağ kartı) bu porta takılabilir. Bu yüzden USB sürücüsü yazma diğer arayüzlere sürücü yazmaktan daha karmaşıktır. USB sürücülerin bir sorunu da şudur ki, bir bilgisayarda genelde birden fazla USB girişi vardır. Bu yüzden USB portuna takılan bir cihazın bilgisayarın I/O portları üzerindeki adresi sabit değildir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;PCI Sistem İletişim Yolu&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Güncel PC mimarisi donanımlar arası haberleşme için PCI veri yolunu kullanır. I/O portları bilgisayarın içinde hep PCI veri yollarına bağlıdır. Linux’ta &lt;b&gt;lspci&lt;/b&gt; komutu bütün PCI cihazlarının listesini verir. Aşağıdaki komut satırı çıktısından bütün I/O portlarının ve bunların bağlı olduğu microcontroller’ların PCI veri yoluna bağlı olduğu görülür.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOO_Xgtrj4H0ePtIOWSOq18vLo-BpK5hR8wNaCP2UW_f5HiVQuHXgLJfeWO-NWMhT6gXKdwz-YwDtdrrKbvjJxrQ0HIUye1-cEcC2j-kMy_BpEp8GsQnPqY8ebMoYiOynEk81Hkh5-vpM/s1600/Foto-0014.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOO_Xgtrj4H0ePtIOWSOq18vLo-BpK5hR8wNaCP2UW_f5HiVQuHXgLJfeWO-NWMhT6gXKdwz-YwDtdrrKbvjJxrQ0HIUye1-cEcC2j-kMy_BpEp8GsQnPqY8ebMoYiOynEk81Hkh5-vpM/s640/Foto-0014.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;brush:plain&quot;&gt;hamza@hamza-laptop:~$ lspci
00:00.0 Host bridge: Intel Corporation Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (rev 03)
00:01.0 PCI bridge: Intel Corporation Mobile 945GM/PM/GMS, 943/940GML and 945GT Express PCI Express Root Port (rev 03) 
00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)                 
00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 02)
00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 02)
00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 02)
00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 02)
00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)
00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)
00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Controller (rev 02)
00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 02)
01:00.0 VGA compatible controller: nVidia Corporation G73 [GeForce Go 7600] (rev a1)
05:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)
07:06.0 CardBus bridge: Texas Instruments PCIxx12 Cardbus Controller
07:06.1 FireWire (IEEE 1394): Texas Instruments PCIxx12 OHCI Compliant IEEE 1394 Host Controller
07:06.2 Mass storage controller: Texas Instruments 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)
07:06.3 SD Host controller: Texas Instruments PCIxx12 SDA Standard Compliant SD Host Controller
07:08.0 Ethernet controller: Intel Corporation PRO/100 VE Network Connection (rev 02)
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Sürücüler Donanımlarla Nasıl Eşleştirilir?&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilmiyorum daha önce hiç aklınıza geldi mi ama (benim bu konuyu araştırmadan önce hiç aklıma gelmemişti) sürücülerin donanımlarla nasıl eşleştirildiğini hiç merak ettiniz mi? Soruyu daha açık bir şekilde sorarsam: Sistemimizde kullandığımız bütün cihazlar için sürücüler yüklenmiş durumda. Cihazımızı PC’mize bağlayınca hiç sorunsuz şekilde o cihaza ait sürücü çekirdek tarafından otomatik olarak yükleniyor ve cihazın isteklerine cevap vermek üzere çalıştırılıyor. Peki, çekirdek o kadar sürücü arasından hangisinin hangi cihaza (örneğin fare) ait olduğunu nereden anlıyor?&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bunun için bir PCI cihazın içindeki kontrol registerlarına bakmamız gerekiyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;PCI Cihazların Kontrol Registerları&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Pn5iSR3FY4LmLMOFZP9yy2tDtWcr-lV2q9N1YmRNhKDZxjyPQmqbz_C9p531FAImMQo4npdZxKMY6j2gDGqanRQe4IuzwO-8325_4-Ixd2hytRcUSolI1QUrrBX9M1loKUC-Z9joZ8E/s1600/Foto-0015.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;396&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Pn5iSR3FY4LmLMOFZP9yy2tDtWcr-lV2q9N1YmRNhKDZxjyPQmqbz_C9p531FAImMQo4npdZxKMY6j2gDGqanRQe4IuzwO-8325_4-Ixd2hytRcUSolI1QUrrBX9M1loKUC-Z9joZ8E/s640/Foto-0015.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Yukarıdaki fotoğrafta bir PCI cihazın ayar registerları görülüyor. Bu registerlarda cihazla ilgili çeşitli özellikler (Üretici numarası, cihaz numarası, cihazın sınıfı, adres hatları ile ilgili bilgiler, IRQ numarası…) saklanıyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Buradaki registerlardan Vendor ID, PCI cihazlarının standardizasyonunu yapan kuruluş tarafından cihazın üreticisine verilmiş bir üretici numarasıdır. Bu numaranın verilmesindeki mantığın aynısı ağ kartlarına MAC numarası verilmesinde de uygulanır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Device ID ise, o cihaza üreticisi tarafından verilmiş cihaz numarasıdır. Vendor ID ile birleşince dünyadaki bütün PCI cihazların benzersiz bir ürün numarası olmuş olur. Cihazlara sürücü yazılırken de bu numaralar sürücülerin içine koyulur. Böylece çekirdek sürücüde belirtilen numaralı cihaz sisteme bağlandığında, bağlanan cihazla ilişkilendireceği sürücüyü bu numaralar bakarak belirler.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Cihaz sürücüleri sadece belli bir cihazı çalıştıracak şekilde özel olarak yazıldığı gibi, belli bir tür cihazı çalıştıracak şekilde, genel sürücüler de yazılabilir. Buna USB Fare veya Klavye sürücüleri örnek verilebilir. Bilgisayar dünyasında bu tür genel cihazların yapıları standarttır. Böylece, örneğin bir USB Fare bağlandığında bu genel sürücü yüklenerek, cihaza özel bir sürücüye gerek kalman çalıştırılabilir (Zaten sürücüsünü yazacağımız fare bizim yazacağımız sürücü olmadan da çalışıyor. Ancak USB standardı dışındaki ekstra tuşları çalışmıyor. Biz bu yüzden bu cihaza özel sürücü yazacağız). Peki çekirdek bağlanan cihazın bir fare olduğunu ve ona özel sürücü değil de genel fare sürücüsünü yüklemesi gerektiğini nerden anlıyor? Bunu da yine yukarıdaki registerlara bakarak anlıyor. Şekilde &lt;b&gt;Class Code&lt;/b&gt; registerı cihazın hangi tür bir cihaz olduğunu belirtiyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;USB Portu&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVKgKg9XVG740kF4YWDBrXrJu69YG2RGxhrrP7G5v9s3Zd8TybjbqK_PckCGNgcWMpuxDVwBgRkKIOjNgCM7YmqOGSjzKOwUVPaDLHrLI7FI6ZXzfPmgpODKIxL7Pp5K-NODG3PQuB4HY/s1600/Foto-00161.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVKgKg9XVG740kF4YWDBrXrJu69YG2RGxhrrP7G5v9s3Zd8TybjbqK_PckCGNgcWMpuxDVwBgRkKIOjNgCM7YmqOGSjzKOwUVPaDLHrLI7FI6ZXzfPmgpODKIxL7Pp5K-NODG3PQuB4HY/s640/Foto-00161.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;USB portunda kullanıcıdan gelen istekleri donanıma ulaştırırken, isteğin geçtiği katmanlar şekilde görülüyor. Buna göre, gelen istek USB cihazı hangi tür bir cihaz ise (char, network, block) o türe göre farklı işlemlerden geçip önce sürücüye geçiyor, sürücüden isteklerin yorumlandığı USB Core’a, oradan da ilgili cihaza donanımsal olarak bağlı olan USB Host Controller (ki isteğin hangi adresteki cihaza gideceğini controller biliyor) üzerinden donanıma erişiliyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Buraya kadar anlattığım her şey genel bilgisayar mimarisi için geçerlidir. USB portu söz konusu olunca anlatılan birçok şey farklı isimlendirilme ya da bakış açılarına tabii tutuluyor. Örneğin;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;USB portundan gelen kesmelere özel olarak &lt;b&gt;URB (USB Request Block)&lt;/b&gt; deniyor. Biz sürücümüzde bu URB’leri alıp içindeki veriye göre sistemimizde farklı tepkiler oluşmasını sağlayacağız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Tabii IRQ’dan URB ‘ye olan değişim sadece isimde olmuyor. URB’lere cevap verecek IH’ler ve bunların sisteme kaydı işlemi normalden farklı hale geliyor. Sürücüyü yazarken ayrıca inceleyeceğiz ama şimdilik şunu söyleyebilirim ki, bu işlem &lt;b&gt;usb_fill_int_urb() &lt;/b&gt;isminde daha özel bir fonksiyonla yapılıyor. Burada fonksiyon adında geçen &lt;b&gt;int &lt;/b&gt;bu fonksiyonun interrupt yani kesme ile çalışan bir cihaza ait URB’lere cevap vereceğini belirtiyor. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;PCI cihazlarınkine benzer şekilde, ancak USB’lere özel daha ayrıntılı bilgiler listeleyen bir komutumuz var: &lt;b&gt;lsusb&lt;/b&gt;.&lt;/div&gt;&lt;div style=&quot;border-color: -moz-use-text-color -moz-use-text-color windowtext; border-style: none none dotted; border-width: medium medium 3pt; padding: 0cm 0cm 1pt;&quot;&gt;&lt;div class=&quot;MsoNormal&quot; style=&quot;border: medium none; padding: 0cm;&quot;&gt;&lt;b&gt;lsusb&lt;/b&gt; komutu bilgisayara bağlı bütün USB cihazlarını tüm detayına kadar listeler.&lt;/div&gt;&lt;pre class=&quot;brush:java&quot;&gt;hamza@hamza-pardus ~ $ lsusb
Bus 001 Device 004: ID 058f:6387 Alcor Micro Corp. Transcend JetFlash Flash Drive
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 002: ID 0930:0508 Toshiba Corp. Integrated Bluetooth HCI
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 09da:021f A4 Tech Co., Ltd
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;Bu çıktıda : ile ayrılmış hex numaraların birincisi cihazın Vendor ID’si, ikincisi ise Device ID’sidir. İşte biz bu numaraları sürücünün içinde belirteceğiz. Yani çekirdeğe “&lt;b&gt;bu numaralı cihazlar sisteme bağlandığında bu sürücüyü yükle diyeceğiz.” &lt;/b&gt;Buna göre sürücüsü yazmaya çalıştığımız cihazın Vendor ID: 09da&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;Device ID’si: 021f&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Lsusb komutu çeşitli parametrelerle çalıştırıldığında cihazla ilgili tüm bilgileri listeler. Cihaz adı, üreticisi, numarası, iletişim şekli, türü, gücü, tipi, tamponu…&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Usb Interface, Usb Endpoint&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilgisayarın USB cihazların takıldığı USB portlarına özel bir adlandırmayla &lt;b&gt;USB Interface&lt;/b&gt; denir. Bu USB Interface’lerin mantıksal karşılılıkları &lt;b&gt;USB Endpoint&lt;/b&gt;’lerdir. USB Endpoint’ler, karşılık geldikleri USB Interface’ler hakkında bazı bilgileri bize sağlar. Bu bilgilerden bizim işimize yarayacak olan, cihazın Vendor ve Product ID’si, cihazın tipi (char, block, network), tamponunun boyutu, türü bilgileridir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;USB Potu Bit Haritası&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;USB Portu 64 bitlik bir porttur. USB’den haberleşen cihazlar 64 bitlik bir veri yolu kullanır. Yani her USB isteği, sinyali, URB’si sisteme 64 bitlik veri gönderir. Aşağıdaki şekilde bir USB Fare için bit haritası görülüyor. Bu haritaya göre en anlamlı 8 bit temel tuşlar için, sonraki byte’lar ise sırayla X, Y eksenlerinde ve tekerin hareketi için kullanılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sürücü yazarken bizim yapacağımız URB deki bu 64 biti teker teker alıp hangi tuşa karşılık geliyorsa Linux çekirdeğine kayıt ettirmek olacak. Böylece fareden bir tuşa basıldığında ve bu tuşun bit sinyali USB Controller’a geldiğinde, Linux Çekirdeği hangi tuşa basıldığını bilebilecektir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Swo6E-BgVP4JcivIvUC1oV4RH048JGw-jOlt5QXlNY6kGBXRhqTFyxOCR19RQE34Pnl3alj6B0BYQLjubMvW6XLyXZNDIR0CSUFb28iW-I80rk5JHxA13rsHLCmnv1ctVhAxG8UJVIk/s1600/usb_bitap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;316&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_Swo6E-BgVP4JcivIvUC1oV4RH048JGw-jOlt5QXlNY6kGBXRhqTFyxOCR19RQE34Pnl3alj6B0BYQLjubMvW6XLyXZNDIR0CSUFb28iW-I80rk5JHxA13rsHLCmnv1ctVhAxG8UJVIk/s640/usb_bitap.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sayısal örnek vermek gerekirse;&lt;/div&gt;&lt;pre class=&quot;brush:java&quot;&gt;10000000-00000000-00000000-0000000-00000000-00000000-0000000-00000000 : Sol Tuş
01000000-00000000-00000000-0000000-00000000-00000000-0000000-00000000 : Sağ Tuş
00100000-00000000-00000000-0000000-00000000-00000000-0000000-00000000 : Orta Tuş&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;Yazarken kendimi kaptırmışım. Çok uzun bir yazı olmuş. Bu aylık veda vakti geldi. Sürücüyü yazmak için öğrenmemiz gereken bilgiler bu kadardı. Bir sonraki yazıda artık sürücümüzü yazmaya başlayacağız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sağlıcakla Kalın.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kaynaklar&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux Device Drivers, Robert Corbert, O’Reilly, 2005&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux Kernel Development, Robert Love, Novell Press, 2005&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://www.kernel.org/&quot;&gt;www.kernel.org&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/linux-surucu-yazma-2.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1Pn5iSR3FY4LmLMOFZP9yy2tDtWcr-lV2q9N1YmRNhKDZxjyPQmqbz_C9p531FAImMQo4npdZxKMY6j2gDGqanRQe4IuzwO-8325_4-Ixd2hytRcUSolI1QUrrBX9M1loKUC-Z9joZ8E/s72-c/Foto-0015.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-5380878676692735859</guid><pubDate>Fri, 18 Mar 2011 19:59:00 +0000</pubDate><atom:updated>2011-03-18T22:00:25.979+02:00</atom:updated><title>Linux Sürücü Yazma-1</title><description>&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergisinde yayınlanmıştır.&amp;nbsp;&lt;/i&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Herkese merhabalar. Bu ay Linux&#39;ta donanım sürücülerini inceleyeceğiz ve bir sürücü yazmaya çalışacağız. Konu detaylı ve uzun olduğundan makaleyi bir yazı dizisi şeklinde yayınlamayı düşünüyorum. Yolumuz uzun olduğundan hemen başlayalım. Ne demişler: &quot;&lt;b&gt;Erken kalkan yol alır&lt;/b&gt;.&quot;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Elimde çok sevdiğim, kullanışlı, güzel bir farem var (A4Tech Power Saver R7). Farenin sevdiğim özelliklerinden birisi de üzerinde fazladan tuşlarının olması ve Windows sürücü yazılımıyla bu tuşlara çeşitli kısayollar atanabilmesi. Bu kısayollar sayesinde fare bilgisayar deneyiminizi çok eğlenceli hale getiriyor. Ancak ne yazık ki bu farenin bir Linux sürücüsü bulunmuyor. Bu yazı dizisinde bahsettiğim fazlalık tuşlara Linux altında işlevlik kazandırmak için sürücü yazmaya çalışacağız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqBXV62SR_OtiW3bY9vqVS6BfkHbmaxc4Mipg6UIohJqi5_1rPT_aHUNQP8CBwLakBrKZScc5gV58JHlkCDuAxo_c9Ef_-WNKQXzhqZiZPQqKurUIIZ5OtCEB2KZYJUIhlDUEcqDWicuk/s1600/Foto-0022.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqBXV62SR_OtiW3bY9vqVS6BfkHbmaxc4Mipg6UIohJqi5_1rPT_aHUNQP8CBwLakBrKZScc5gV58JHlkCDuAxo_c9Ef_-WNKQXzhqZiZPQqKurUIIZ5OtCEB2KZYJUIhlDUEcqDWicuk/s320/Foto-0022.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;  &lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;Sürücü yazmaya girişmeden önce bazı önemli Linux Kernel (Çekirdek) özelliklerinden ve terimlerinde bahsedeceğiz. Sonra bunları bir USB Fare sürücüsü yazmada kullanacağız.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux&#39;ta sürücüler genelde iki ayrı yöntem izlenerek yazılıyor. Birincisi Linux çekirdeğine inip çekirdek seviyesinde kodlar yazıp, bu kodları çekirdeğe gömmek. İkincisi ise çeşitli 3. parti API&#39;ler kullanarak sürücü yazmak. Aslında bu 3. parti API&#39;ler de yine çekirdek programlamayla yazılmış biraz daha üst seviye C fonksiyonları. &lt;b&gt;Standart C&lt;/b&gt;&#39;yi kullanmaya izin verdiği için kodlanması ve baş edilmesi daha kolay. Şimdi aklınıza &quot;Yoksa Kernel kodları Standart C&#39;yi kullanmıyor mu?&quot; diye bir soru gelebilir. O zaman &lt;b&gt;Linux Kernel&#39;a Giriş - 101&lt;/b&gt; &#39;e hoş geldiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Linux Kernel&#39;a Giriş - 101&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel bir işletim sisteminin çekirdeğidir (Gerçekten çok açıklayıcı oldu :) Sistemde çalışan programların ve proseslerin önceliğini, çalışma sırasını, bellek erişimini ve belleğin prosesler arasında nasıl paylaşılacağını, sisteme gelen kesmeleri ve bu kesmelere göre işlemcinin nasıl davranacağını, dosya sistemine erişimi ve dosyaların burada nasıl tutulacağını, bilgisayarın donanımla nasıl haberleşeceğini belirlediği giriş-çıkış portlarını yönetir -ki biz bu konuya değineceğiz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux çekirdeği ilk olarak 1991 tarihinde Finlandiyalı bir üniversite öğrencisi olan Linus Torvalds tarafından, o zamanın önemli işletim sistemlerinde Minix&#39;in eksikliklerini tamamlamak için yayınlanmıştır. İlk olarak Intel 80386 mikroişlemcisi için yazılmıştır. Bugün içlerinde AMD, ARM, Compaq Alfha, CRIS, DECVAX, H8/300, Hitachi SuperH, HP/PA-RISC, IBM S/390, Intel IA-64, MISP, Motorola 6800 Serisi, PowerPC, Sun SPARC &#39;ın da bulunduğu 20 ye yakın mimariyi desteklemektedir. İlk yayınladığında yaklaşık olarak 10000 satırdır ve bunun %80 &#39;i C ile %20 si Assembly ile yazılmıştır. Bu yazı yazıldığında Linux&#39;un 2.6.33 çekirdeği yayınlanmıştı. 2.6.30 versiyonundan alınan istatistiklere göre, Linux çekirdeği 11.5 M satır ve tar.gz sıkıştırma ile yaklaşık 62 MB tutmakta. Bir ilginç istatistik daha: Her gün 5000 geliştirici Linux çekirdeğine yaklaşık 13 K satır eklemektedir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux çekirdeği işletim sistemi seviyesinde çok önemli işler gerçekleştirdiği için geliştirilmesinde kullanılan yöntemler, performansı en üst düzeye çıkarmak amaçlıdır. Bu amaç için geliştiriciler bazı önemli kısıtlamalar doğrultusunda geliştirmeler yapmaktadır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;İşletim sistemlerinde prosesler işlemci düzeyi olarak iki ayrı düzeyde çalıştırılır: Kernel ve User. User düzeydeki prosesler sistemi etkilemeyen, kullanıcının çalıştırdığı programlar gibi çekirdeği kullanan proseslerdir. Kernel prosesler ise sistemi yöneten proseslerdir. Giriş-çıkış portlarına erişim, kullanılan veya boş olan belleğin hesaplanması ve burada dinamik yer tahsisi gibi işlemler kernel modda çalışır. Çekirdek thread’leri, dinamik kütüphane eklenmesini (sistem çalışırken modüller halinde çekirdeğe yazılım parçaları yüklenmesini destekler. Bu konuya sonradan detaylı bir şekilde değineceğiz. Çünkü sürücümüzü modül olarak yazıp çekirdeğe yükleyeceğiz).&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux çekirdeği &lt;b&gt;GNU C&lt;/b&gt; ile yazılmıştır. Bu özellik çekirdek programlamaya önemli kısıtlamalar getirir. Hiçbir standart C Kütüphanesi bir çekirdek koduna ekleyip, hiçbir C çağrısını çekirdek içinde kullanamazsınız. Kernel geliştiricileri çekirdeğin daha performanslı çalışması için, kullanacakları bütün C fonksiyonlarını baştan yazmışlardır. Örneğin &lt;b&gt;printf()&lt;/b&gt; metodu kernel kodunda çalışmaz, onun yerine kernel programcıları çok benzeri olan &lt;b&gt;printk() &lt;/b&gt;metodunu sıfırdan yazmışlardır&lt;b&gt;.&lt;/b&gt; Bu fonksiyonun örnek kullanımı şöyle:&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;printk(KERN_INFO &quot;Merhaba Kernel Programlama&quot;);&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;KERN_INFO&lt;/b&gt; &#39;dan sonra virgül koyulması gerektiğini düşünebilirsiniz. Ama bu gösterimde hiçbir yanlışlık yok. Bu fonksiyonun çıktısı normalde konsola yapılması gerekiyor. Ama bu özellik dağıtımdan dağıtıma değişiyor. Örneğin Pardus&#39;da bu çıktı &lt;b&gt;/var/log&lt;/b&gt; altındaki sistem loglarına yazılıyor (&lt;b&gt;syslog, ken.log&lt;/b&gt;) Baştaki KERN_INFO bildirisi log&#39;lama için kullanılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKEVHKaxwUNlcN6-h7zW2n4biv_R-ElFuX2faBczVO6XbpsLF6EjU4Scvt0PgNgJS2cGvsslje1SLjmhK6lYYYTGZJxWiHcYSPcb0wMZ1f83MGsqx14ipWLEc7tJNXlb8cY5IX70z41o/s1600/syslog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;315&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHKEVHKaxwUNlcN6-h7zW2n4biv_R-ElFuX2faBczVO6XbpsLF6EjU4Scvt0PgNgJS2cGvsslje1SLjmhK6lYYYTGZJxWiHcYSPcb0wMZ1f83MGsqx14ipWLEc7tJNXlb8cY5IX70z41o/s640/syslog.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Ya da şöyle bir fonksiyon tanımı görebilirsiniz. &lt;b&gt;(&quot;__&quot;&lt;/b&gt; ile başlayan isimlendirmeler kernel’a özeldir.) &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;static int __init usb_a4r7mouse_init(void) {}&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Burada fonksiyonun dönüş değeri (int) ile adı arasında (usb_a4r7mouse_init) &lt;b&gt;&quot;__init&lt;/b&gt;&quot; ifadesi fonksiyonun modülün sadece ilk yükleme &quot;&lt;b&gt;init&lt;/b&gt;&quot; sırasında kullanılacağını belirtir. Böylece kernel bu fonksiyondaki değişkenler için ayırdığı belleği ilk yükleme işleminden sonra sisteme geri verebilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Her tanımlandığı yerde tekrar derlenen, böylece çalışma performansını artıran &lt;b&gt;inline&lt;/b&gt; fonksiyonlar görebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;asm() çağrısı ile doğrudan assembly çağrıları görebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel’ın bellek koruması yoktur. User-space bir program yasaklı bir bellek bölgesine erişmek istediğinde ya &lt;b&gt;null&lt;/b&gt; döndürülür ya da bir hata bildirilir. Böyle bir mekanizma kernel seviyesinde yoktur. Yanlış bir bellek bölgesinde değişiklik yaparsanız... Yani yapmamaya çalışın.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel belleği sayfalanamaz (paging).&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel prosesler floating point işlem yapamaz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel-space bir proses’in stack&#39;i sadece 4KB dır ve dinamik olarak değiştirilemez.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux Kernel&#39;ı ücretsiz olarak &lt;b&gt;www.kernel.org&lt;/b&gt; &#39;dan indirilebilir. tar.gz şeklinde indirdiğiniz sıkıştırılmış dosyanın içindeki dizin yapısı şöyledir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB76lcy9KfstN2AbmrGnORE8HHRmMEbTEnNAVNa-CHra_b9sONQ3BgQyCPrUm0gTc3xCBYJ3akLv66EyUQVklg1fWPIvdqcFwwOgtVvHcuKkx9bpwFWXZxFYw-4YRs6iviJMj6YCPwwiM/s1600/L%25C4%25B0NUX-SOURCE.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB76lcy9KfstN2AbmrGnORE8HHRmMEbTEnNAVNa-CHra_b9sONQ3BgQyCPrUm0gTc3xCBYJ3akLv66EyUQVklg1fWPIvdqcFwwOgtVvHcuKkx9bpwFWXZxFYw-4YRs6iviJMj6YCPwwiM/s1600/L%25C4%25B0NUX-SOURCE.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;arch&lt;/b&gt; - Mimariye bağımlı fonksiyonların bulunduğu kaynak      kodlar.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;crypto&lt;/b&gt; - Şifreleme API&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Documantation&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;drivers&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;fs&lt;/b&gt; - File System&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;include&lt;/b&gt; - C başlık dosyaları&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;init&lt;/b&gt; - İlk yükleme kodları&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;ipc&lt;/b&gt; - inter proses com.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;kernel&lt;/b&gt; - çekirdek sistem&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;lib&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;mm&lt;/b&gt; - hafıza yönetimi (memory management)&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;net&lt;/b&gt; - network&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;scripts&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;security&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;sound&lt;/b&gt;&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;usr&lt;/b&gt; - user space code&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;IDE Ayarları&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kernel geliştirmesini bir IDE üzerende yapacaksınız, buradaki klasörlerden &lt;b&gt;include&lt;/b&gt; içindeki başlık dosyalarını ve &lt;b&gt;arch&lt;/b&gt; altında kendi platformunuza uygun başlık dosyalarını (yine &lt;b&gt;include&lt;/b&gt; altında) projenize eklemelisiniz. (Biz Netbeans kullandık, Netbans&#39;te projeye sağ tıklayıp &lt;b&gt;Code Assintance&lt;/b&gt; kısmından ya da &lt;b&gt;Properties&lt;/b&gt; kısmından &lt;b&gt;C Complier&lt;/b&gt; altında &lt;b&gt;Include Directories&lt;/b&gt; kısmından bu klasörlerin yollarını gösterin.) Her ne kadar kaynaklarda &quot;&lt;b&gt;Kernel kodu geliştirmek için gerekli herşey buradadır&lt;/b&gt;&quot; diye yazsa da, Linux dağıtımları temel kernel kodunu aşırı biçimde yamalanmış halde kullanmaktadır. Kullandığınız dağıtıma özel kodlar ve başlık (.h) dosyaları bulunabilir. Bunları internetten bulup kullandığınız derleyici ve IDE ye tanıtmanız gerekebilir. Örneğin Ubuntu için &lt;b&gt;autoconf.h&lt;/b&gt; dosyası özeldir. Kernel koduyla birlikte gelmez. Bu dosyayı elde etmenin en kolay yolu &lt;b&gt;Synaptic Paket&lt;/b&gt; Yöneticisinde &lt;b&gt;linux-source&lt;/b&gt; ve &lt;b&gt;linux-headers&lt;/b&gt; paketlerini kurmaktır. &lt;b&gt;Pardus’ta&lt;/b&gt; ise &lt;b&gt;PİSİ&lt;/b&gt; paket yöneticisinden adında &lt;b&gt;kernel-header&lt;/b&gt; ve &lt;b&gt;kernel-source&lt;/b&gt; geçen bütün paketleri kurmalısınız. Kurulan başlık dosyaları &lt;b&gt;/usr/src/linux-headers-2.6.31-19-generic/include&lt;/b&gt; altına yerleştirilir. Bu dizini de projenin başlık dosyaları kısmına eklemeniz gerekebilir. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2S9XvdGEFHcUz2AqhCDn-DaHICza5xrwXu0cRm32Kx0ELTDENe1ukGPRpehrnidmasjGT0DVGf-QSB8a_5NcXAh36YRcUMJeLXcAMy0KLL7T3ZpjgmmrmRkwOvt7yIXO4mpm0kxECN_Q/s1600/P%25C4%25B0S%25C4%25B0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;398&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2S9XvdGEFHcUz2AqhCDn-DaHICza5xrwXu0cRm32Kx0ELTDENe1ukGPRpehrnidmasjGT0DVGf-QSB8a_5NcXAh36YRcUMJeLXcAMy0KLL7T3ZpjgmmrmRkwOvt7yIXO4mpm0kxECN_Q/s640/P%25C4%25B0S%25C4%25B0.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;IDE ayarlanması ile ilgili son bir şey daha: Bütün kernel kodları bir &lt;b&gt;#ifdef-#endif&lt;/b&gt; içerisinde &lt;b&gt;&quot;__KERNEL__&quot;&lt;/b&gt; önişlemci bildirimini yapmak zorundadır. Netbeans&#39;te bu başlık dosyalarını eklediğimiz kısımda &quot;&lt;b&gt;Preprosesor Definitions&lt;/b&gt;&quot; kısmında &lt;b&gt;&quot;__KERNEL__&quot;&lt;/b&gt; önişlemci bildiriminin yapılması gerekir. Aksi halde Netbeans bazı başlık dosyalarında bazı tanımlamaları bulamayacağını söyleyip, projede hatalar veriyor. Siz de bu ayarları kendi IDE’nize göre özelleştirmelisiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYc8qz3eFDbxeMQzGhwTMXPHcjGIt8O8A6hTutRlb0KdnlTJ8u84p_sYefY0c4NaDnAk8zfwT7nNMTlRfPPqilrJCn-wSDJ6In9cUMw7cBpdw-9YWpQ6la8faaVct2ugCcWzZbna23uUw/s1600/NETBEANS-crop.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYc8qz3eFDbxeMQzGhwTMXPHcjGIt8O8A6hTutRlb0KdnlTJ8u84p_sYefY0c4NaDnAk8zfwT7nNMTlRfPPqilrJCn-wSDJ6In9cUMw7cBpdw-9YWpQ6la8faaVct2ugCcWzZbna23uUw/s1600/NETBEANS-crop.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Sistem Çağrıları&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux çekirdeği user-space’te çalışan proseslere sistemle etkileşim, kaynaklara ve donanım&#39;a erişim, için bir arayüz sunar. Bu sayede user -space programlar sistemin kritik noktalarını bozmadan kritik kaynaklara erişimi çekirdeğe bırakır ve isteklerini çekirdeğe yaparlar, çekirdek de bu isteklere cevap verir. Bellek tahsisi buna örnek verilebilir. Çünkü bir user-space program belleğin hangi gözünün boş hangisinin kullanımda olduğunu bilemez ama çekirdek bilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bugün Linux&#39;ta x86 platformu için 250 ye yakın sistem çağrısı vardır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Programcılık açısından bakıldığında sistem çağrıları çekirdek tarafından user-space programlara kullandırılan C fonksiyonlarıdır. Hepsi &lt;b&gt;sys_xxx&lt;/b&gt; yapısındadır. Dönüş değeri olarak başarı ya da hata kodu belirten &lt;b&gt;long&lt;/b&gt; tipinde bir veri döner.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL6SlAQ2kPeNdlYRwcFsFxaWDbvn-ORjxApmWADB1tFiwWG7Gttsny7V-TPCKEWTdpjx_-idQd3PgZmhf8c5Ert3kpApPZCIUNN07iEC-E2GCZhvv1LlOxkjCpd75C1U2Bws_fkkm0KJA/s1600/Foto-0012.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;176&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL6SlAQ2kPeNdlYRwcFsFxaWDbvn-ORjxApmWADB1tFiwWG7Gttsny7V-TPCKEWTdpjx_-idQd3PgZmhf8c5Ert3kpApPZCIUNN07iEC-E2GCZhvv1LlOxkjCpd75C1U2Bws_fkkm0KJA/s640/Foto-0012.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;En çok kullanılan sistem çağrılarına bir örnek &lt;b&gt;write()&lt;/b&gt; dır. Bir user-space program C dilinde &lt;b&gt;printf()&lt;/b&gt; çağrısı ile bir dosyaya yazmak istediyse, önce bunun C kütüphanesinde karşılığı olan &lt;b&gt;write(),&lt;/b&gt; sonra da &lt;b&gt;sys_write()&lt;/b&gt; sistem çağrısı çağrılır ve bu fonksiyonun içinde hard diske yazma işlemi yapılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEsXnrxI0eNzulxXK3YwPxV2dav_ECobpQFEdf03rLoHnQo8q6rGY_nRUhu4pCL_iuwunIlIx4WSB0Z81SdPKxokXoz40HgsmdlW6Q7y8LezgP9YXbyTdTcvO8jBLH0DsdSXXTFUt-MyY/s1600/SYS_CALL_TABLE.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;378&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEsXnrxI0eNzulxXK3YwPxV2dav_ECobpQFEdf03rLoHnQo8q6rGY_nRUhu4pCL_iuwunIlIx4WSB0Z81SdPKxokXoz40HgsmdlW6Q7y8LezgP9YXbyTdTcvO8jBLH0DsdSXXTFUt-MyY/s640/SYS_CALL_TABLE.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sistem çağrıları mimariye bağımlıdır. x86 mimarisi için sistem çağrıları tablosu &lt;b&gt;/arch/x86/kernel/syscall_table_32.S&lt;/b&gt; altındadır. Dosyanın uzantısının &lt;b&gt;.S&lt;/b&gt; olduğuna dikkat edin. Bu uzantı assembly dosyalarının uzantısıdır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Gelecek Ay Yazının Devamıyla Görüşmek Üzere.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kaynaklar&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux Device Drivers, Robert Corbert, O’Reilly, 2005&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Linux Kernel Development, Robert Love, Novell Press, 2005&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;a href=&quot;http://www.kernel.org/&quot;&gt;www.kernel.org&lt;/a&gt;&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/linux-surucu-yazma-1.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqBXV62SR_OtiW3bY9vqVS6BfkHbmaxc4Mipg6UIohJqi5_1rPT_aHUNQP8CBwLakBrKZScc5gV58JHlkCDuAxo_c9Ef_-WNKQXzhqZiZPQqKurUIIZ5OtCEB2KZYJUIhlDUEcqDWicuk/s72-c/Foto-0022.jpg" height="72" width="72"/><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-2243428860366926528</guid><pubDate>Fri, 18 Mar 2011 19:35:00 +0000</pubDate><atom:updated>2011-03-18T21:46:04.972+02:00</atom:updated><title>Katılımsız Kurulum</title><description>&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-derginin Ocak 2010 sayısında yayınlanmıştır.&amp;nbsp;&lt;/i&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;-- ...zaten %95&#39;imiz Windows&#39;a program kurarken bütün seçeneklere &quot;Next&quot; deyip programın bir an önce kurulmasını istiyoruz. Keşke programlar varsayılan ayarlarıyla kendileri otomatik kurulsa, yani şu &quot;Next&quot; lere de basmasak. Mesela kurulacak program Program Files&#39;da kendi varsayılan yerine kurulsa, başlat menüsüne, hızlı başlata, masaüstüne kısayol koysa, sağ tuş menüye kaydolsa, uygun dosya tipleriyle kendini ilişkilendirse. Ama bunların hepsini otomatik yapsa, biz bir şekilde kurulumu tetiklesek sonra da &quot;ta taaa&quot; program hazır...&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;-- Okumaya devam.&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Konuyu özetlemeye çalışan bu diyalog girişten sonra yazımıza başlayabiliriz. Bu ayki konumuz Katılımsız Kurulum (Unattended Setup). Giriş diyalogundan anlamış olacağız üzere katılımsız kurulumda kullanıcı bir şekilde kurulumu tetikler (çift tıklama, ya da bir script yardımıyla) sonrasında kullanıcı kurulumla ilgilenmeden program kurulmuş olur.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Nerelerde Kullanılır?&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kullanım yerleri hayal gücünüzle sınırlı olmakla birlikte katılımsız kurulum, internet kafe, bilgisayar laboratuarları gibi aynı programın defalarca kurulması gerektiği durumlarda işe yarayabilir. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Kurulduğunda çeşitli programlar ve sürücüleriyle birlikte kurulan, kullanıcı ismi, şifre, yerel ayarları sormayan Windows CD&#39;leri oluşturmada kullanılır. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Nasıl Yapılır?&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Katılımsız kurulumlu programlar genelde üç şekilde oluşturulur.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;i.Bir script yardımıyla&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;ii.Bir program yardımıyla&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;iii.Elle&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;i.Bir script yardımıyla&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu yöntemde katılımsız kurulum yapılacak programlar zaten önceden bu işleme hazır halde gelirler. Yapmamız gereken kurulum dosyasını programın katılımsız kurulum parametresiyle çalıştırmaktır. Bunun için önce programın katılımsız kurulum parametresini bulmamız gerekiyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Katılımsız kurulum parametresi bulmak&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Windows&#39;ta bir programın kurulum dosyasını çeşitli parametrelerle çalıştırarak farklı ayarlarla ve farklı biçimlerle kurulmasını sağlayabiliriz. Örneğin bu ayarların bazıları kurulacak yer, program herkes için mi yoksa sadece oturum açmış kullanıcı için mi kurulacağı olabilir. Zaten normal program kurarken karşımıza gelen arayüzler de (hani şu &quot;Next&quot; lere bastığımız) programın setup dosyasına parametre gönderen InstallShield, NSIS gibi programlardır. Bir programın hangi parametrelerle kurulabileceğini programı &lt;b&gt;/?&lt;/b&gt; parametresiyle çalıştırarak öğrenebilirsiniz. Çıkan pencerede çeşitli parametreler ve ne işe yaradıkları yazar. Bunlardan &lt;b&gt;Silent Install, No User Interaction, Unattended Setup&lt;/b&gt; vb. özellikler programın katılımsız kurulmasını sağlar. Setup dosyasını bu parametrelerle çalıştırıp programı katılımsız kurabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpWeSVTG6jd-YV7uM3YUwtHNtOAOWVWZj-z7J-y9uD8U3hAT8quf-fxMf2R-HsIJ-FLU5-7HDnPwOA9WcDNq3RRCuaOMPGerovD0Gqmy94EDXNYfExA4jagWs9YlIiq_kyfJcqTYb9pf8/s1600/silentSoruIsareti.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;486&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpWeSVTG6jd-YV7uM3YUwtHNtOAOWVWZj-z7J-y9uD8U3hAT8quf-fxMf2R-HsIJ-FLU5-7HDnPwOA9WcDNq3RRCuaOMPGerovD0Gqmy94EDXNYfExA4jagWs9YlIiq_kyfJcqTYb9pf8/s640/silentSoruIsareti.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Katılımsız kurulum parametresi bulmanın bir diğer yolu &lt;b&gt;USSF (Universal Silent Switch Finder)&lt;/b&gt; kullanmak. Bu programla birçok programın katılımsız kurulum parametresini bulabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixPWeNbtxZHpzwZGJjarnIxL9baypTh4R6gScCSniLERbBZarWoW7piS8iLwepMpEUQTRuB61JPDZZ8MEkjtDKfU2WmFfIwuezSgk8KQEQRtht5eFOxcu3ucwaj1q5Z6tArrqgSv8c_nA/s1600/ussf.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixPWeNbtxZHpzwZGJjarnIxL9baypTh4R6gScCSniLERbBZarWoW7piS8iLwepMpEUQTRuB61JPDZZ8MEkjtDKfU2WmFfIwuezSgk8KQEQRtht5eFOxcu3ucwaj1q5Z6tArrqgSv8c_nA/s1600/ussf.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Uzantısı &lt;b&gt;(*.msi)&lt;/b&gt; olan kurulum dosyaları Microsoft&#39;un kendi yükleyici dosyalarıdır. Genelde bu uzantıya sahip dosyalar &lt;b&gt;/?&lt;/b&gt; ile çalıştırıldığında ekran görüntüsündeki çıktıyı verir.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQQmVs42zNsGoLFWG7JeYQvy0gEu-RBR6EwtqwaUAlrgQn3XrmtK08vmyoqdsq8AHI7HPh8T8xUjTMCT66-_xuFfYS3hYg3HkakFWuvKihy29gd3fFYc_7bzzoxFc6KGS9Uha8VCLOt5g/s1600/msi.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQQmVs42zNsGoLFWG7JeYQvy0gEu-RBR6EwtqwaUAlrgQn3XrmtK08vmyoqdsq8AHI7HPh8T8xUjTMCT66-_xuFfYS3hYg3HkakFWuvKihy29gd3fFYc_7bzzoxFc6KGS9Uha8VCLOt5g/s1600/msi.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;En son internette araştırma da yapabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;1) 7zip&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Katılımsız kurulum parametremizi bulduktan sonra, şimdi sadece çift tıklamayla kurulan bir kurulum dosyası yapalım.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Birinci ve en çok kullanılan yöntem 7zip installer oluşturmak. 7zip temelde bir sıkıştırma programı olsa da bazı ek dosyalar yardımıyla yükleyici dosyaları da oluşturmaya da yarar.&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;Önce içinde çalışacağınız      bir klasör oluşturun, sonra bu klasörün içinde &lt;b&gt;&quot;Bin&quot;&lt;/b&gt; adında bir klasör oluşturun.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Katılımsız kurulumunu      oluşturacağınız programı bütün gerekli dosyalarıyla birlikte bin içine      kopyalayın.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;İnternetten &lt;b&gt;7za.exe,7zsd.sfx,upx.exe&lt;/b&gt; dosyalarını      indirin ve içinde çalıştığınız klasöre kopyalayın.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Yine bu klasörde &lt;b&gt;&quot;Config.txt&quot;&lt;/b&gt; dosyasını      oluşturun. İçine şunları yazın:&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;;!@Install@!UTF-8!&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;GUIMode=&quot;2&quot;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;RunProgram=&quot;tvc.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-&quot;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;;!@InstallEnd@!&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Burada,&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;RunProgram=&quot;tvc.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-&quot;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;satırında tırnaklar arasına bin klasöründeki kulum dosyasının tam adını katılımsız kurulum parametresi ile birlikte yazın.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;Aynı klasöre &lt;b&gt;Create.cmd&lt;/b&gt; dosyası oluşturun ,      içine şunları yazın:&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;upx --ultra-brute 7zsd.sfx&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;cd Bin&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;..\7za a -mx=9 &quot;..\Program.7z&quot; *&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;cd ..&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;copy /b 7zsd.sfx + Config.txt + Program.7z tvc.exe&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;del Program.7z&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Create.bat&lt;/b&gt; çift tıklayıp çalıştırın.&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;İşlem tamamlandıktan aynı      klasörde &lt;b&gt;Program.exe&lt;/b&gt; adıyla      katılımsız kurulum dosyanız hazır.&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Yöntemle ilgili ayrıntılı bilgiyi şu adreste bulabilirsiniz: &lt;a href=&quot;http://www.wincert.net/forum/index.php?/topic/3846-anlatm-7-zip-katlmsz-kurulum-dosyas-hazrlamak-svcpack/&quot;&gt;http://www.wincert.net/forum/index.php?/topic/3846-anlatm-7-zip-katlmsz-kurulum-dosyas-hazrlamak-svcpack/&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;2) AutoIt Script&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;AutoIt&lt;/b&gt; scriptleriyle çalışmakta olan processlere çeşitli klavye, fare sinyalleri gönderebilirsiniz. Örneğin bir autoit scriptiyle bir kurulum dosyasını çalıştırıp, sonra ona bu script yardımıyla butonlara (kurulum dosyasındaki &quot;Next&quot;), checkbox&#39;lara tıklatabilir, klavye girdisi verebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Script&#39;i yazdıktan sonra AutoIt ile derleyip kuracağınız programla aynı klasöre koyup,scripti tetiklediğinizde katılımsız kurulumun gerçekleştiğini göreceksiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Örneğin KMPlayer&#39;ın katılımsız kurulum parametresi &lt;b&gt;/S&lt;/b&gt; dir. KMP&#39;nin kurulum dosyasını bu parametreyle çalıştırsanız bile ilk başta kurulum dilini soruyor, sonra katılımsız kurulumu gerçekleştiriyor. AutoIt ile kurulum dilini sorduğu ekranda &quot;Next&quot; e tıklatmamız yeterli. Aşağıdaki kodları &lt;b&gt;.ac3&lt;/b&gt; uzantılı bir dosyaya kaydedip AutoIt ile derleyip, &lt;b&gt;kmpsetup.exe&lt;/b&gt;&#39;nin yanında çalıştırın. Katılımsız kurulumun gerçekleştiğini göreceksiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Run(&quot;kmpsetup.exe /S&quot;)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;WinWait(&quot;Installer Language&quot;,&quot;Please select the language of the installer&quot;)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;ControlClick(&quot;Installer Language&quot;,&quot;Please select the language of the installer&quot;,&quot;Button1&quot;)&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;ii.Bir program yardımıyla&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;1) WinRAR SFX Arşiv&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;WinRAR ile &lt;b&gt;.exe&lt;/b&gt; uzantılı &lt;b&gt;Kendi Açılır Arşivler (Self Extractor Archive)&lt;/b&gt; oluşturabilirsiniz. Bu dosyalar çift tıklandıklarında katılımsız kurulumda olduğu gibi kullanıcıya soru sormadan belirlenen konumlara dosyaları çıkarır. Ayarlamalar yapılırsa çıkarma başlamadan önce ve sonra çeşitli script ve programları çalıştıracak komutlar girebilirsiniz. &lt;b&gt;&quot;SFX Arşivi Oluştur&quot;&lt;/b&gt; u seçip&lt;b&gt;, &quot;Gelişmiş&quot;&lt;/b&gt; sekmesinde &lt;b&gt;&quot;SFX Ayarlarına&quot; &lt;/b&gt;tıklamanız yeterli.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;2)Çeşitli Programlar&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Program Files&#39;daki dosyaları bir setup dosyasında toplayan, WinRAR SFX Arşiv gibi ama daha gelişmiş özelliklere sahip kurulum dosyası oluşturan programları kullanabilirsiniz. Bu programlarla şu dosyaları Program Files&#39;a kopyalara, şunlara kısayol oluştur, şu kayıtları kayıt defterine ekle, falanca .dll leri sisteme kaydet, kurulumu da katılımsız yap diyebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;iii.Elle&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;inf Dosyası Yazmak&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Windows&#39;ta kurulumların nasıl yapılacağını belirten &lt;b&gt;.inf&lt;/b&gt; uzantılı ayar dosyaları vardır. Katılımsız yapacağınız programın kurulmuş (Program Files’a çıkartılmış) dosyalarını bir &lt;b&gt;.CAB&lt;/b&gt; dosyasında sıkıştırıp, bir inf ayar dosyası ile bu dosyaları istediğiniz yere kopyalayabilir, istediğiniz programları çalıştırabilir, kayıt defterine kayıt girebilir, sisteme&amp;nbsp; dll kaydedebilir, masaüstü, başlat menüsüne kısayol atabilirsiniz. Kurulum yapmak için inf dosyasına sağ tıklayıp &lt;b&gt;Yükle&lt;/b&gt;’yi tıklayın.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Ama bunların hepsini elle yamanız gerekir. Bu konu burada anlatılmayacak kadar karmaşık ve uzun. Yazmaya kalksam 3 sayılık yazı dizisi olur. Merak edenler internette araştırabilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Katılımsız Kurulum CD’si Oluşturmak&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Katılımsız kurumlar en çok, katılımsız kurulumlu Windows CD&#39;leri oluşturmada kullanılır. Bahsettimiz yöntemlerle oluşturulan dosyalar, katılımsız kurulum &lt;b&gt;addon&lt;/b&gt; larına dönüştürülür ve &lt;b&gt;nLite, RVMintegrator&lt;/b&gt; gibi programlarla CD&#39;lere entegre edilir. Kurulumda lazım olan bilgiler (kullanıcı ismi, ürün şifresi, klavye düzeni...) bir dosyaya &lt;b&gt;(winnt.sif)&lt;/b&gt; yazılır. Sistem yüklenirken, katılımsız kurulumlar bir script tarafından tetiklenir &lt;b&gt;(WPI, RunOnce..).&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Gelecek ay buluşmak dileğiyle...&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/katlmsz-kurulum.html</link><author>noreply@blogger.com (Unknown)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpWeSVTG6jd-YV7uM3YUwtHNtOAOWVWZj-z7J-y9uD8U3hAT8quf-fxMf2R-HsIJ-FLU5-7HDnPwOA9WcDNq3RRCuaOMPGerovD0Gqmy94EDXNYfExA4jagWs9YlIiq_kyfJcqTYb9pf8/s72-c/silentSoruIsareti.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-8141479760347768350</guid><pubDate>Fri, 18 Mar 2011 19:24:00 +0000</pubDate><atom:updated>2011-03-18T21:46:53.772+02:00</atom:updated><title>Google Arama Püfleri</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.google.com.tr/logoyapsana/images/templates/google_logo_01.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;141&quot; src=&quot;http://www.google.com.tr/logoyapsana/images/templates/google_logo_01.gif&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergisinde yayınlanmıştır. &lt;/i&gt;&lt;br /&gt;
&lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
İnterneteki içeriğin forumlar, bloglar gibi sistemlerle kullanıcı tarafından dinamik olarak oluşturulduğu web 2.0 mantığının yayılmasıyla internet bir bilgi deryasına dönüştü. Öyle ki artık internete bağlanabilen ve klavye başında yazı yazabilen herkes istediği içeriği zametsizce paylaşabiliyor. Paylaşım tarafı güzel de doğruluğuna ve kalitesine dikkat edilmeden paylaşılan bilgi interneti bir bilgi cennetinden çok bir çöplüğe dönüştürüyor. Öyle ki ödevinizi araştırırken sizinle hiçbir alakası olmayan birinin blog’undan geçen gün öğle yemeğinde ne yediğini öğrenebiliyorsunuz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bir konu hakkında bilgi edinmek istediğimizde hepimiz öncelikle internete başvuruyoruz. İnternet öyle bir derya ki ne başı - sonu belli, ne bir kullanma kılavuzu var ne de içindekiler listesi. Biz de aradığımız bilgiye en kolay şekilde ulaşabilmek için arama motorlarını, en çok da Google’ı kullanıyoruz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Google’da arama yapan kullanıcılar sonuçlarda hep aynı kopyalanmış bilgilerin çıkmasından ve kaliteli içerik ile sadece siteye ziyaretçi çekmek için oluşturulmuş çöp içeriği ayırt edememekten şikayetçi. Bilmiyorum aranızda gerçekten samanlıkta iğne arayanınız oldu mu ama, sanal alemde yaptığımız tam anlamıyla da bu.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu yazıda google aralamalarında verimliliği artıracak, milyonlarca sonuç içerisinde kaybolmadan ihtayacınız olan içeriği bulmanızı sağlayacak olan bazı püf noktalarına değineceğiz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Genel Taktikler&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Google arama sonuçlarını yerelleştirerek size sunar. Türkiye için düşünürsek, bulunan sitenin dili Türkçe olmasa bile arattığınız anahtar kelimelerin sonuçları önce meta verinde &quot;Tr&quot; bilgisi olan siteler görüntülenir. Yani google.com.tr “TR” öncelikli arama yapar. Arama dilini İngilizce bile yapsanız, google size sonuçları bu özelliklere göre ama bu sefer ingilizce olarak verir. Bu yüzden yabancı bir ülkeye ait bir içerik arıyorsanız, Google’un o ülkeye ait yerel sitesine gidip o sitede arama yapmanız daha sağlıklı sonuçlar verir. &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Tek tek kelime değil de birkaç kelimeden oluşan bir ifade arıyorsanız, ifadeyi tırnak işaretleri içine alın. Örneğin &lt;b&gt;medeni kanun&lt;/b&gt; diye arama yaparsanız &lt;b&gt;medeni&lt;/b&gt; ve &lt;b&gt;kanun&lt;/b&gt; kelimelerini ayrı ayrı aranırken &lt;b&gt;&quot;medeni kanun&quot;&lt;/b&gt; ifadesini ise birlikte aranır. Ayrıca &quot;&quot; işaretini aramalarda tam olarak eşlenmesini istediğniz ifadelerde de kullanabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Arama motorlarına doğrudan soru yazabilirsiniz. Örneğin bilgisayarda karşılaştığınız bir sorunun çözümünü arıyorsanız “how to... – nasıl yapılır...” diye arama sizi doğrudan forumlardaki o sorunlarla ilgili iletilere götürür.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Düzenli ifadeleri (RegEx) kullanabilirsiniz. Aşağıdaki gibi bir ifade içinde &lt;b&gt;ebook, ebooks, books, book&lt;/b&gt; tan en az birinin geçtiği belirtilen uzantılardan birine sahip aramaları getirir. Bunu ebook ararken kullanabilirsiniz.&lt;/div&gt;&lt;pre class=&quot;brush:plain&quot;&gt;(ebook | ebooks | books | book) (*.pdf | *.chm | *.lit | *.rar | *.zip) &quot;parent directory&quot; intitle:&quot;index of /&quot; kitap ismi
&lt;/pre&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Aramaların daha sağlıklı olması için mantıksal işaretleri kullanabilirsiniz.:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;(+): Örneğin, &lt;b&gt;Sakarya+üniversitesi&lt;/b&gt; ifadesi içerisinde hem sakarya hem de üniversitesi kelimelerinin bulunduğu sayfaları bulur.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;(-): Arama sonuçlarında olmamasını istediğiniz kelimelerin önüne – işareti koyabilirsiniz. Free kelimesi reklam amaçlı bütün siteler tarafından kullanıcı çekmek için kullnılır. Aramalarınıza&amp;nbsp; ”-f&lt;b&gt;ree” &lt;/b&gt;ekleyerek reklam, spam amaçlı, illegal içerikli bir çok sitenin listelenmesini engelleyebilirsiniz.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: Symbol;&quot;&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;(|)-(OR): Veya. Anahtar kelimelerin arasına veya işareti koyabilirsiniz. Sonuçlarda bu kelimelerden herhangi birinin bulunduğu siteler listelenir. Aynı anlamdaki kelimeler ile yapılan aramalarda kullanılabilir. Örneğin;&lt;/li&gt;
&lt;/ul&gt;&lt;pre class=&quot;brush:plain&quot;&gt;ebook | ebooks | books | book
&lt;/pre&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Anahtar Kelimeler&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;inurl:&lt;/b&gt; Adreslerinde arattığınız sözcükler bulunan sayfaları listeler. Çok etkilidir. Sayfanın adresinde aranan kelime varsa sonuç neredeyse garantidir. Örnek: &amp;nbsp;&lt;b&gt;+inurl:wma|mp3|ogg site:rapidshare.com&lt;/b&gt;. Rapidshare.com ‘da adresinde wma veya mp3 veya ogg kelimeleri geçen sayfaları arar. Bildiniz müzik araması&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;allinurl: &lt;/b&gt;Birden fazla kelime için inurl özelliği kullanacaksanız hepsine ayrı ayrı inurl: yazmak zorunda değilsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;intitle: &lt;/b&gt;Aranılan kelimelerin sayfanın başlığında bulunduğu sayfaları listeler. Başlığa göre aradığı için verimli sonuç döndürür. Örnek: &lt;b&gt;altyazı intitle:”Pulp Fiction”. &lt;/b&gt;Başlığında Pulp Fiction, içinde altyazı geçen sayfaları bulur.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;allintitle:&lt;/b&gt;Birden fazla kelime için intitle özelliği kullanabilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;intext:&lt;/b&gt; Aranılan kelimelerin sayfanın metin kısmında olduğu sayfaları döndürür. Örnek &lt;b&gt;bilgisayar intext:saltokunur. &lt;/b&gt;Sayfanın metin kısmında saltokunur kelimesinin geçtiği sonuçları döndürür.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;site:&lt;/b&gt; Anahtar kelimelerden önce &lt;b&gt;site:siteadi&lt;/b&gt; yazarsanız yalnızca o sitede arama yapar. Örn: &lt;b&gt;site:saltokunur.org e-dergi&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;cache: &lt;/b&gt;Bu kelimenin ardından bir site yazarsanız, sitenin google hafızasındaki görüntüsü verilir. Örnek: &lt;b&gt;cache:www.siteadi.org&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;link:&lt;/b&gt; Link komutu bir web adresiyle birlikte girildiğinde, belirtilen adrese giden link içeren bütün sayfa ve belgeler görüntülenir. Örneğin: &lt;b&gt;link:www.siteadi.org&lt;/b&gt; satırı siteadi.org sitesine link içeren sayfa ve belgeleri bulur.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;info:&lt;/b&gt; Bu komutla Google, komut satırında adı geçen web sitesine dair kendi arşivinde tuttuğu kısa bilgileri görüntüler. Örnek: &lt;b&gt;info:www.siteadi.org&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;filetype:&lt;/b&gt; Dosya türene göre de arama yapabilirsiniz. Örneğin: &lt;b&gt;filetype:doc bilgisayar. &lt;/b&gt;&amp;nbsp;Araması adında bilgisayar kelimesi geçen DOC uzantılı dosyaları bulur.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;define:&lt;/b&gt; Google bir sözlük gibi de kullanılabilir. Bunun için tanımlanmasını istediğiniz kelime ya da kelimelerin önüne define yazarak arattığınız kelimenin açıklamasını öğrenebilirsiniz. Örnek: &lt;b&gt;define:php&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;book: &lt;/b&gt;Verilen kelime ile ilgili kitpları bulur. Örnek: &lt;b&gt;book firefox&lt;/b&gt; (book operatöründen sonra “:” işareti kullanılmaz). Filetype ile birlikte kullanıldığında mükemmel sonuç verir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;İpuçları&lt;/b&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;ProgramAdi adi ile belirtilen programları bulur: &lt;b&gt;&quot;parent directory&quot; ProgramAdi -xxx -html -htm -php -shtml -opendivx -md5 -md5sums&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Sitedeki belirli türdeki dosyaları bulmak istiyorsanız &lt;b&gt;*.pdf, *.zip *.jpg&lt;/b&gt; gibi yazmanız yeterli. Örn: &lt;b&gt;www.ebook.com .pdf&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Google’u hesap makinesi olarak kullanabilirsiniz. &lt;b&gt;32+2345*3-234=&lt;/b&gt; yazdığınızda sonucu size söylecektir.&lt;/li&gt;
&lt;li&gt;Birim dönüştürme yapabilirsiniz. &lt;b&gt;100F=?C&lt;/b&gt; ile Fahrenheit Celcius’a çevrilir.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;?intitle:index.of? .*avi Konu&lt;/b&gt; : Satırı ile &lt;b&gt;konu&lt;/b&gt; hakkında &lt;b&gt;avi&lt;/b&gt; dosyası araması yapabilirsiniz.&lt;/li&gt;
&lt;/ul&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/google-arama-pufleri.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4721680045066667582</guid><pubDate>Fri, 18 Mar 2011 19:12:00 +0000</pubDate><atom:updated>2011-03-18T21:14:41.358+02:00</atom:updated><title>JavaFx</title><description>&lt;div class=&quot;MsoNormal&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://blogs.sun.com/arungupta/resource/images/javafx_logo_color_1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; src=&quot;http://blogs.sun.com/arungupta/resource/images/javafx_logo_color_1.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;i&gt;Bu yazı daha önce saltokunur.org e-derginin Temmuz 2009 sayısında yayınlanmıştır.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bilgisayar teknolojileri ilerledikçe ve bilgisayar destekli, hayatımızı kolaylaştıran teknolojiler geliştirildikçe, hepimiz bilgisayarla daha fazla vakit geçirir olduk. Kullanıcıların gündelik ihtiyaçlarına yönelik çözümler üreten yazılım firmaları, rakip ürünler arasından kendi ürünlerini ön plana çıkarıp, kullanıcıların kendi ürünlerini kullanmalarını sağlama yarışı içindeler. Bu amaçla bazı firmalar var olan teknolojilerle hep daha kullanışlı ve daha görsel ürünler üreterek pazarda yer tutmaya çalışıyorlar. Olaya internet kullanımı tarafından bakarsak, bunlara şu aralar etrafta mantar gibi biten sosyal ağ sitelerini örnek verebiliriz (Facebook, Flickr, FriendFeed). Hepsi kullanıcı sayısıyla birlikte reklam gelirlerini de artırma peşinde.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%;&quot;&gt;Zengin İnternet Uygulamaları (RIA)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sektöre yön veren büyük yazılım firmaları ise, diğerlerinin kullandığı bu teknolojileri ya da platformları üreterek kullanıcılara ve geliştiricilere yeni dünyalar açıyorlar. Gene internet teknolojileri açışından olaya bakarsak, bu teknolojilerin ilk büyük örneğini Macromedia (daha sonra Adobe tarafından satın alındı) tarafından Flash&#39;la gördük. Bu gün neredeyse flash kullanmayan internet sitesi yok gibi (bakınız bizim derginin sitesi :). Bunlara verilebilecek diğer güzel örnekler Sun&#39;un Applet teknolojisi, AJAX, Adobe&#39;nin Flex&#39;i, son dönemde büyük ses getiren Microsoft&#39;un Silverlight&#39;ı... Hepsi geliştiricilere daha kolay, çabuk ve görselliği yüksek ürünler geliştirmesi imkanını sağlamak üzere üretildiler ve günümüzde Facebook, Google Maps, Google Doc, v.b. Zengin İnternet Uygulamaları (RIA - Rich Internet Applications) geliştirmede kullanılıyorlar.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Sun Microsystems bugüne Java ile sunduğu Applet teknolojisi dışında görsel uygulamalar geliştirmeler dışında geliştiricilere hiçbir teknoloji sunmuyordu. Zaten o da AWT (Abstract Window Toolkit) ve Swing (Java&#39;nın Arayüz geliştirme kütüphanesi) tabanlı olduğu için geliştiriciler &quot;deveye hendek atlatmaktansa&quot; başka teknolojilere yönelmeyi tercih ediyorlarlardı. Gerçektende Java&#39;da Swing&#39;le program yazmak çok uğraş gerektici bir işlemdir. Geliştiriciler programın işi yapacak kodundan çok onu arayüze taşıyacak olan koduna daha fazla zaman ayırırlar (kendimden biliyorum :). Sanırım Sun bu konuda gerilere düşmekte olduğunu farketti ve Mayıs 2007&#39;de San Francisco&#39;da RIA ve multimedia uygulama geliştirme amaçlı yeni teknolojisi JAvaFx&#39;in 1.0 sürümünü tanıttı. Şimdilerde 1.2 sürümüyle karşımızda olan JavaFx bu ayki yazımızın konusu.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%;&quot;&gt;JavaFx&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx, Zengin İçerikli İnternet Uygulamaları (RIA) geliştirmek ve Java&#39;nın fakir arayüz ve multimedia özeeliklerini zenlinleştirmek için geliştirdiği açık kaynak bir teknolojidir. Gelişmiş güncel ses, video ve grafik desteği sunar. Yazılım geliştiricilerin zengin içerikli, etkileşimli ve etkileyici uygulamalara Web tabanlı vektör grafiği, animasyon, ses ve video gibi öğeler yerleştirmelerine olanak verir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Java teknolojisi halen masaüstü ve dizüstü bilgisayarların yüzde 90’ından fazlasında (yaklaşık 800 milyon), mobil araçların ise yüzde 85’inden fazlasında, TV, taşınabilir oyun platformları ve diğer taşınabilir cihazlarda kullanılıyor. Sun JavaFx&#39;de Java ile getirdiği &quot;Bir kere yaz heryerde çalıştır&quot; felsefesini devam ettiriyor. Yani JavaFx, JVM (Java Sanal Makinesi) kurulu olan herhangi bir cihazda değişikliğe uğratılmadan çalışabiliyor. Bu da JavaFx&#39;in kullanım alanlarının çok geniş olacağını vaat ediyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFX uygulamalarında her tür Java kitaplığının kullanılmasına olanak sağlayarak Java&#39;nın gücünü artırır. JavaFx, 2D, AWT ve Swing gibi Java API&#39;lerini kullanabiliyor. Bu da demek oluyorki Java ile oluşturduğumuz bir programa, JavaFx kullanarak, program ile ilgili hesap yapan kodları değiştirmeden daha iyi görünüm ve kolay kullanım özellikleri katabiliriz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%;&quot;&gt;Dil Yapısı&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx dil yapısı olarak iki kısma ayrılıyor. Daha çok RIA geliştirmek için web tarafında kullanılan JavaFx Script ve mobil cihazlara yönelik JavaFx Mobile.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFX Mobile bir platform olarak düşünülmüş. JavaFx Mobile ile geliştirilen uygulamalar mesajlaşma, grafik yönetimi, GPRS/EDGE/UMTS, WiFi, yüksek tanımlı video (HD) gibi özellikleri barındırır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx Script, ise deklaratif bir dil. Yani geliştiriciler programa işlerin nasıl yapılacağını değil de, ne yapacağını, ekranda ne göstereceğini söylüyor. Bunu HTML gibi düşünebilirsiniz, bildiğiniz gibi HTML&#39;de&amp;nbsp; neyi göstereceğini tarayıcıya söylememiz yeterli. Böylece JavaFx çok daha hızlı GUI geliştirmeye olanak sağlıyor. Hali hazırda bulunan Swing ve Java kütüphanelerini kullanımına imkan sağlıyor. Kodlama yapısı da benzer script dilleri gibi. Ana penceremizde bir sahne var ve bu sahneye görsellerimizi ekliyoruz. Eklenen her görsele bir düğüm deniliyor. Sonra bu düğümlere en, boy, renk gibi özellikler atanıyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Örnek:&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Stage sahne{&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cirle cember{&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height:100&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; weight:100&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; color:blue&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;}&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Ayrıca JavaFX Script ile gelen olay oluşturma ve yürütme konusundaki iyileştirmelerden Swing uygulamaları da faydalanacak ve yakın zamanda daha performanslı Swing uygulamaları göreceğiz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%;&quot;&gt;Özellikleri&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx diğer RIA geliştirme ortamlarına göre sistem kaynaklarını daha az kullanır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Browser içinde çalışan JavaFX uygulaması sürükle-bırak yöntemi ile masaüstüne taşınarak sanki bir masaüstü uygulamasıymış gibi çalıştırılabilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt; line-height: 115%;&quot;&gt;JavaFx ile neler yapılabilir?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx ile yapabilecekleriniz hayal gücünüzle sınırlı olsa da (çok klişe oldu), işte size fikir verebilecek bazı örnekler.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Mash-Up uygulamaları.&lt;/b&gt; Çeşitli servislerin sağladığı özellikleri bir uygulamada birleştirmek. Örn, Google Map ten istenilen yerin haritasını alıp, Flickr&#39;dan oraya ait fotoğrafları bulmak.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Yol Animasyonları.&lt;/b&gt; Ekran üzerinde bir yolu takip eden araba animasyonu gibi.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Video Oynatımı.&lt;/b&gt; JavaFx &#39;in kendi kütüphaneleri sayesinde (kendi video oynatıcı bile var) uygulamanızda online videolar gösterebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;JavaFx uygulamaları geliştirebilmek için &lt;b&gt;javafx.com&lt;/b&gt; &#39;dan ücretsiz ve açık kaynak JavaFx SDK &#39;sını (yaklaşık 50 MB) indirmeniz yeterli. Ayrıca Sun&#39;ın açık kaynaklı IDE&#39;si Netbeans de (&lt;b&gt;netbeans.org&lt;/b&gt;) JavaFx geliştirmek isteyenlere güzel bir çalışma ortamı sunuyor. JavaFx’i daha geniş incelemek için resmi sitesinde (&lt;b&gt;javafx.com&lt;/b&gt;)&amp;nbsp; yayınlanan kaynaklara başvurabilirsiniz.&lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/javafx.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3584817823557811623.post-4190469787941822327</guid><pubDate>Fri, 18 Mar 2011 19:00:00 +0000</pubDate><atom:updated>2011-03-18T21:00:50.924+02:00</atom:updated><title>SQLite</title><description>&lt;!--[if !mso]&gt; &lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
&lt;/style&gt; &lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:TrackMoves/&gt;   &lt;w:TrackFormatting/&gt;   &lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:DoNotPromoteQF/&gt;   &lt;w:LidThemeOther&gt;TR&lt;/w:LidThemeOther&gt;   &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:Compatibility&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:SplitPgBreakAndParaMark/&gt;    &lt;w:DontVertAlignCellWithSp/&gt;    &lt;w:DontBreakConstrainedForcedTables/&gt;    &lt;w:DontVertAlignInTxbx/&gt;    &lt;w:Word11KerningPairs/&gt;    &lt;w:CachedColBalance/&gt;   &lt;/w:Compatibility&gt;   &lt;m:mathPr&gt;    &lt;m:mathFont m:val=&quot;Cambria Math&quot;/&gt;    &lt;m:brkBin m:val=&quot;before&quot;/&gt;    &lt;m:brkBinSub m:val=&quot;--&gt;    &lt;m:smallfrac m:val=&quot;off&quot;&gt;    &lt;m:dispdef&gt;    &lt;m:lmargin m:val=&quot;0&quot;&gt;    &lt;m:rmargin m:val=&quot;0&quot;&gt;    &lt;m:defjc m:val=&quot;centerGroup&quot;&gt;    &lt;m:wrapindent m:val=&quot;1440&quot;&gt;    &lt;m:intlim m:val=&quot;subSup&quot;&gt;    &lt;m:narylim m:val=&quot;undOvr&quot;&gt;   &lt;/m:narylim&gt;&lt;/m:intlim&gt; &lt;/m:wrapindent&gt;&lt;!--[endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;
  DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;
  LatentStyleCount=&quot;267&quot;&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot;/&gt;   &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot;/&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;
 /* Style Definitions */
 table.MsoNormalTable
 {mso-style-name:&quot;Normal Tablo&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-qformat:yes;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:10.0pt;
 font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;}
&lt;/style&gt; &lt;![endif]--&gt;  &lt;/m:defjc&gt;&lt;/m:rmargin&gt;&lt;/m:lmargin&gt;&lt;/m:dispdef&gt;&lt;/m:smallfrac&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.sqlite.org/images/sqlite370_banner.gif&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://www.sqlite.org/images/sqlite370_banner.gif&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot; class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16pt; line-height: 115%;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 16pt; line-height: 115%;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;i&gt;Bu yazı daha önce saltokunur.org e-dergide yayınlanmıştır. &lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Şu senaryodaki durum masaüstü uygulamalar geliştiren çaylak-tecrübeli tüm geliştiricilerin başına gelebilir. Benim başına geldi oradan biliyorum &lt;span style=&quot;font-family: Wingdings;&quot;&gt;&lt;span&gt;:)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Programcının Çilesi&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Hikâyemizde geliştiricimiz güzel bir program fikri bulur. Fikri gerçekleştirmek için platform, uygulama çatısı (Framework), programın yazılacağı dil... vb hazırdır. Geliştiricimiz programın işleyeceği verileri bir veri tabanında tutup, ilişkisel veri tabanlarının nimetlerinden faydalanmak istemektedir. İşte sorun da tam burada baş gösterir. Veri tabanı sunucusuna nasıl erişecektir? Uygulama masaüstü uygulama olduğu için çalışması için internet bağımlılığının olmaması gerekmektedir. Günümüz Türkiye şartlarında programı kullanan bütün bilgisayarların internete bağlı olamayacağı, olanların da zırt pırt kesilen bağlantı yüzünden programı adam gibi kullanamayacağı açıktır. Hem programcımız bu riski göze alıp, programı sürekli çevrimiçi olan veri tabanı (VT) sunucusuna bağlarsa, ücretsiz dağıttığı bir uygulama için bir VT sunucusu kiralamak zorunda kalacak, gelecekte belki programın kullanıcı kitlesi genişlediğinde o kadar veriyi tutacak VT sunucusu (VTS) bile bulamayabilecektir. Burada bir çözüm VTS&#39;yi localhost&#39;a kurup verileri bu şekilde işlemek olabilir. Ama şöyle bir gerçek var ki son kullanıcıların hepsi bir VT Yöneticisi değil. Düşünün bir kere dünyanın en çok kullanılan (bu yazıdan sonra aslında 2. olduğunu anlayacağınız :) MySQL&#39;i uygulamanızla birlikte dağıttığınızı. Bugün en güncel MySQL 5.1 sürümü 104 MB, bir önceki 5.0 sürümü 22 MB &lt;b&gt;[1]&lt;/b&gt;. Bu boyutta bir programı uygulama ile birlikte dağıtmak, kurulum dosyasını şişirmeye yarar, başka bir şeye değil. Hem MySQL&#39;i kurduğumuzu düşünelim, kurmakla bitmiyor ki, root şifresi ayarlanacak, programın kullanacağı VT uygun karakter-kodlamayla oluşturulacak, MySQL hata verdiği zaman takip edilip düzeltilecek, dahası Windows güvenlik duvarı çalışmasına izin vermeyecek, gerekli olan port kullanımda olacak ve MySQL servisi başlatılamayacak. Biraz abartı gelebilir ama bu sorunlarım hepsi Windows üzerinde MySQL çalıştırılmak istenirken çok sık karşılaşılan sorunlar. Son kullanıcı bu sorunların hiçbiriyle baş edemez, onun için sadece &quot;&lt;b&gt;Next&lt;/b&gt;&quot; vardır. &quot;&lt;b&gt;Next-Next-Next-(Bazen de Install :)&lt;/b&gt;&quot;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Çözüm&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Bu sorunun bir çözümü şu olabilir. Tecrübeli programcıların bile &quot;&lt;b&gt;Benden-Uzak-Allah&#39;a-Yakın-Olsun&lt;/b&gt;&quot; dediği, verileri bir dosyaya kaydetmek. Evet, çözüm basit gibi gözükse de programın işleyeceği verilerin yapısı karmaşıklaştıkça (bir VT&#39;deki foreign key, trigger, function gibi yapıların getirdiği kolaylıkları düşünün) bunları bir dosya yapısına dökmek çoğu zaman geliştiricileri projelerinden soğutuyor. İşte bu ahval ve şerait içinde şöyle dediğinizi duyar gibiyim: &quot;&lt;b&gt;Keşke şöyle ne internete, ne sunucuya ne de ayara ihtiyaç duyan bir küçük program-kütüphane (library) olsa da, verileri VT biçiminde bir dosyaya kaydetse...&lt;/b&gt;&quot;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Aslında yukarıda tırnak içinde yaptığım tanım SQLite için en basit ve anlaşılır tanım oldu. SQLite sunucu olmadan çalışan, hafif, küçük (tek bir dosya ve 500 KB den az), hiçbir ayara ihtiyaç duymayan, hızlı, SQL komutları kullanarak veri alış-verişi yapabilen bir ANSI-C kütüphanesidir. Kullanımı ise çok basittir. SQLite&#39;ın kütüphane dosyasına (sqlite3.dll) SQL komutları gönderirsiniz, o da bu komutları işler ve bir VT dosyasına kaydeder. İstediğiniz zaman da SELECT sorguları çekerek bu dosyadan verilerinizi alabilirsiniz. Bu işlemler için ne bir ayar ne de bir kurulum gereklidir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;SQLite&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite, ilk olarak D. Richard Hipp tarafından geliştirilmeye başlandı ve 17 Ağustos 2000 tarihinde ilk sürümü yayınlandı. &lt;b&gt;[2]&lt;/b&gt; İlk yayınlandığından bugüne kadar ki geçen zaman içinde temel VT işlemlerinin neredeyse tamamını gerçekleştirebilecek şekilde geliştirildi. Bu yazı yazıldığında en güncel sürümü 3.6.17 idi.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite sadece bir C Kütüphanesi olduğu için, taşınabilirliği çok yüksektir. Günümüzün bilinen tüm platformlarında çalışabilir. Windows, Mac OS X, Linux, BSD, Solaris, UNIX, AmigaOS, Symbian, z/OS 1. &lt;b&gt;[2]&lt;/b&gt;Gelecekte başka bir Veri Tabanı Yönetim Sistemi (VTYS)&#39;ne geçilmek istendiğinde basit bir SQL sorgusuyla tüm veri alınıp rahatça diğer bir VTYS’ye geçilebilir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Lisanslama&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite &quot;&lt;b&gt;Halka Açık&lt;/b&gt;&quot; bir yazılımdır. Dağıtımı “&lt;b&gt;Public Domain&lt;/b&gt;” &lt;b&gt;[3]&lt;/b&gt; altında yapılmaktadır. Kaynak kodu açıktır. Yani SQLite&#39;i istediğiniz gibi kullanabilir, kodunu değiştirebilir (uygulamanızın kullanmayacağı özellikleri kaldırıp yeni özellikler ekleyebilir), ücretsiz-ticari, açık-kapalı kaynak bütün uygulamalarda hiçbir kısıtlama altına girmeksizin kullanabilir, SQLite ile geliştirdiğiniz bir uygulamadan gelir de elde edebilirsiniz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Teknik Özellikler [2]&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Teknik özelliklerinden bahsetmek gerekirse SQLite için boyundan büyük işler başarıyor diyebiliriz. &lt;/div&gt;&lt;ul style=&quot;margin-top: 0cm;&quot; type=&quot;disc&quot;&gt;&lt;li class=&quot;MsoNormal&quot;&gt;En Fazla VT dosyası      boyutu: 32 TB&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;Bir Tablodaki En Fazla      Sütun Sayısı: 32767&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;En Fazla Metin      (String-Char) Veri Boyutu: 1 GB&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;En Fazla Blob (Binary)      Veri Boyutu: 1 GB&lt;/li&gt;
&lt;li class=&quot;MsoNormal&quot;&gt;En Fazla Number      (Int-Double) Veri Boyutu: 64 bit&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite’in bir güzel özelliği de tam Unicode desteği sağlamasıdır. UTF-8 ve UTF-16 kodlamayı destekler.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite transactional (işlemsel) bir VT kütüphanesidir. Sık kullanılan birçok ilişkisel SQL cümleciğini destekler. Bunlar: Union, Intersect, Except, Inner join, Outer join, Inner select, Merge join. Ayrıca VT içinde Trigger tanımlamaya da izin verir.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Tarih (date) veri tipini ve data domain, cursor, function, procedure gibi işlemleri desteklememesi SQLite’in şu anki sürümü itibariyle eksik yönleri.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite&#39;in en geniş dağıtıma ulaşmış VT motoru olduğu tahmin ediliyor. Bugün birçok program, işletim sistemi, cep telefonu, PDA hatta Mp3 oynatıcılar bile gömülü olarak SQLite kullanıyor. SQLite siz farkına bile varmadan çoktan bilgisayarınıza girmiş olabilir. Örnek vermek gerekirse, Firefox (120 milyon kopya) internet geçmişinizi tutmak için bir SQLite VT&#39;si kullanıyor. Eğer Windows ortamında Firefox kullanıyorsanız &quot;&lt;b&gt;C:\Program Files\Mozilla Firefox&lt;/b&gt;&quot; dizini altında &quot;&lt;b&gt;sqlite3.dll&lt;/b&gt;&quot; dosyasını bulabilirsiniz. Ya da bir müzik oynatıcı olan AIMP2 şarkı listelerini yine SQLite VT&#39;sinde tutuyor. Bunun Linux dünyasındaki karşılığı ise KDE kullanıcılarının çok iyi bildiği &lt;b&gt;amorak&lt;/b&gt;. Yine amorak playlist&#39;lerini SQLite VT&#39;sinde saklıyor. Örnekler çoğaltılabilir, bugün PHP5 (20 milyon kopya) varsayılan olarak SQLite desteğiyle geliyor. Solaris (10 milyon kopya) sistemi boot ekmek için,&lt;span&gt;&amp;nbsp; &lt;/span&gt;Philips mp3 çalarlar yine playlist&#39;leri saklamak için, Skype (100 milyon kopya), iPhone da SMS’leri saklamak için hep gömülü olarak SQLite kullanıyor. Tüm bu dağıtımların toplamının yaklaşık 300 milyon olduğu tahmin ediliyor. Bu da SQLite’i dünyanın en geniş dağıtımlı SQL motoru yapıyor. &lt;b&gt;[4]&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kullanımı&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite harici uygulama olarak çalıştırılacaksa Linux&#39;ta konsoldan ya da Windows&#39;ta komut satırından &quot;&lt;b&gt;SQLite3 vt_dosyasi_adi&lt;/b&gt;&quot; komutuyla çalıştırılır. &lt;b&gt;vt_dosyasi_adi&lt;/b&gt; dosyası yoksa SQLite kendi oluşturur. Bundan sonra (;) ile biten SQL komutlarını programa girerek normal bir VT sunusu gibi kullanılır.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite’in VT hakkında bilgi veren ve üzerinde çeşitli işlemler yapan, komut satırından çalıştırılan bazı özel komutları da vardır. &lt;b&gt;[8]&lt;/b&gt;&lt;/div&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Veritabanındaki tabloları görmek:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;.tables&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Veritabanı konsolundan çıkmak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;.exit&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Kolon adlarını almak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;pragma&amp;nbsp;table_info(&lt;tablo_adi&gt;)&amp;nbsp;&lt;/tablo_adi&gt;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Yardım:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;.help&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Select çıktısına format vermek:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; 1. sqlite&amp;gt;&amp;nbsp;.mode&amp;nbsp;col 2. sqlite&amp;gt;&amp;nbsp;.headers&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;on&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Otomatik artan kolonun son değerini ele almak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&amp;nbsp;last_insert_rowid();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Veritabanını dışa aktarmak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;.dump&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Veritabanını sql scriptine aktarır:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite&amp;gt;&amp;nbsp;.&lt;span class=&quot;keyword&quot;&gt;output&lt;/span&gt;&amp;nbsp;file.sql&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;Konsolda veritabanını kopyalamak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite3&amp;nbsp;test.db&amp;nbsp;.dump&amp;nbsp;&amp;gt;&amp;nbsp;test.sql&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;margin-left: 36pt; text-indent: -18pt;&quot;&gt;&lt;span style=&quot;font-family: Symbol; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt;&lt;span&gt;·&lt;span style=&quot;font: 7pt &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; line-height: 115%;&quot;&gt;SQL script ile veritabanında tablolar oluşturmak:&lt;/span&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-size: 11pt; font-weight: normal; line-height: 115%;&quot;&gt; sqlite3&amp;nbsp;test2.db&amp;nbsp;&amp;lt;&amp;nbsp;test.sql&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite kütüphanesi bir program içinde gömülü olarak kullanılacaksa &quot;&lt;b&gt;#include &lt;sqlite3.h&gt;&lt;/sqlite3.h&gt;&lt;/b&gt;&quot; ile SQLite&#39;in başlık dosyası kaynak koda eklenir. &lt;b&gt;sqlite3_open()&lt;/b&gt; ile VT dosyası açılır, &lt;b&gt;sqlite3_exec()&lt;/b&gt; ile SQL komutu işletilir ve &lt;b&gt;sqlite3_close()&lt;/b&gt; ile VT bağlantısı kapatılır. &lt;b&gt;[5]&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite&#39;i gömülü olarak kullanmak için ille de C bilmeniz gerekmiyor. SQLite&#39;in bilinen programlama dillerinin neredeyse tamamı için (&lt;strong&gt;&lt;span style=&quot;font-family: &amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;; font-weight: normal;&quot;&gt;C#, D, Delphi, Fortran, Java, Perl, PHP, Python, Ruby, Smalltalk…&lt;/span&gt;&lt;/strong&gt;) sarıcı (wrapper) API’leri bulunuyor&lt;b&gt;.[6]&lt;/b&gt; Böylece istediğiniz dilde uygulama geliştirirken SQLite’i kullanabiliyorsunuz.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Hız Karşılaştırmaları [7]&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite diğer VTYS&#39;lerle karşılaştırıldığında INSERT sorgularında biraz geride kalıyor ama SELECT sorgularında çok daha hızlı sonuçlar veriyor.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;Aşağıda SQLite 2.7.6, PostgreSQL 7.1.3 ve MySQL 3.23.41 kullanılarak yapılan hız testlerinin sonuçları yer alıyor. Süreler saniye cinsindendir. SQLite’in Nosync değerleri thread senkronlaması kapatılarak alınmıştır.&lt;/div&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoNormalTable&quot; style=&quot;border-collapse: collapse; border: medium none; width: 658px;&quot;&gt;&lt;tbody&gt;
&lt;tr style=&quot;height: 20.6pt;&quot;&gt;   &lt;td style=&quot;border: 1pt solid black; height: 20.6pt; padding: 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 77.95pt;&quot; valign=&quot;top&quot; width=&quot;104&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;25000 INSERT Bir sorguda&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 63.75pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;100 SELECT indeksiz&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 70.85pt;&quot; valign=&quot;top&quot; width=&quot;94&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;1000 UPDATE indeksiz&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;SELECT’ten INSERT&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;DELETE indeksli&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: black black black -moz-use-text-color; border-style: solid solid solid none; border-width: 1pt 1pt 1pt medium; height: 20.6pt; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;h3&gt;&lt;span style=&quot;font-size: 11pt;&quot;&gt;5000 SELECT indexli&lt;/span&gt;&lt;/h3&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;PostgreSQL&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;&quot; valign=&quot;top&quot; width=&quot;104&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;4.900&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 63.75pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;3.629&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 70.85pt;&quot; valign=&quot;top&quot; width=&quot;94&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.739&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;61.364&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.316&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;4.614&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;MySQL&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;&quot; valign=&quot;top&quot; width=&quot;104&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.184&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 63.75pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.760&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 70.85pt;&quot; valign=&quot;top&quot; width=&quot;94&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;8.410&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.537&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.262&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.270&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;SQLite&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;&quot; valign=&quot;top&quot; width=&quot;104&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;0.914&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 63.75pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.494&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 70.85pt;&quot; valign=&quot;top&quot; width=&quot;94&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;0.637&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.787&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.068&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.121&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black; border-style: none solid solid; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 83.4pt;&quot; valign=&quot;top&quot; width=&quot;111&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;SQLite (nosync)&lt;/b&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;&quot; valign=&quot;top&quot; width=&quot;104&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;0.757&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 63.75pt;&quot; valign=&quot;top&quot; width=&quot;85&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;2.526&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 70.85pt;&quot; valign=&quot;top&quot; width=&quot;94&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;0.638&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.599&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;0.752&lt;/div&gt;&lt;/td&gt;   &lt;td style=&quot;border-color: -moz-use-text-color black black -moz-use-text-color; border-style: none solid solid none; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 65.8pt;&quot; valign=&quot;top&quot; width=&quot;88&quot;&gt;   &lt;div class=&quot;MsoNormal&quot;&gt;1.162&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;SQLite üzerinde daha geniş araştırma yapmak isteyenler &lt;b&gt;www.sqlite.org&lt;/b&gt; daki wiki&#39;de kullanım, yönetim, bakım hakkında çok yararlı makaleler bulabilirler.&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;Kaynaklar&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[1] &lt;/b&gt;&lt;a href=&quot;http://www.mysql.com/&quot;&gt;www.mysql.com&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[2] &lt;/b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems&quot;&gt;http://en.wikipedia.org/wiki/Comparison_of_relational_database_management_systems&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[3] &lt;/b&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Public_Domain&quot;&gt;http://en.wikipedia.org/wiki/Public_Domain&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[4] &lt;/b&gt;&lt;a href=&quot;http://sqlite.org/mostdeployed.html&quot;&gt;http://sqlite.org/mostdeployed.html&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[5] &lt;/b&gt;M. Ali Vardar, Linux ve UNIX Sistemler İçin Açık Kaynak Kodlu Yazılım Geliştirme, Temmuz 2008&lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[6]&lt;/b&gt; &lt;a href=&quot;http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers&quot;&gt;http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[7]&lt;/b&gt; &lt;a href=&quot;http://www.sqlite.org/speed.html&quot;&gt;http://www.sqlite.org/speed.html&lt;/a&gt; &lt;/div&gt;&lt;div class=&quot;MsoNormal&quot;&gt;&lt;b&gt;[8] &lt;/b&gt;&lt;a href=&quot;http://gurcanyavuz.wordpress.com/2009/04/15/sqlite-veritabani/&quot;&gt;http://gurcanyavuz.wordpress.com/2009/04/15/sqlite-veritabani/&lt;/a&gt; &lt;/div&gt;</description><link>http://kahveninhatiri.blogspot.com/2011/03/sqlite.html</link><author>noreply@blogger.com (Unknown)</author><thr:total>0</thr:total></item></channel></rss>