<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MetehanUs</title>
	<atom:link href="http://www.metehan.us/feed" rel="self" type="application/rss+xml" />
	<link>http://www.metehan.us</link>
	<description>Bir Başka Belgelendirme Projesi…</description>
	<lastBuildDate>Thu, 29 Dec 2011 17:42:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>South ile Django da Migration İşlemi</title>
		<link>http://www.metehan.us/south-ile-django-da-migration-islemi.html</link>
		<comments>http://www.metehan.us/south-ile-django-da-migration-islemi.html#comments</comments>
		<pubDate>Sun, 18 Dec 2011 21:54:04 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django göç işlemi]]></category>
		<category><![CDATA[django south migration]]></category>
		<category><![CDATA[django türkçe kaynak]]></category>
		<category><![CDATA[django-south]]></category>
		<category><![CDATA[göç]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[South]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=144</guid>
		<description><![CDATA[Django da oluşturduğunuz bir uygulamada Modelinizi yazdınız ve syncdb parametresi ile veritabanı tablolarını oluşturdunuz. Daha sonra model sınıfınızda tablo yapısını etkileyecek düzenlemeler yaptınız ve tekrar syncdb ile tablonuzu oluşturmaya çalıştınız. Bir baktınız ki tablo da bir değişiklik yok, olduğu gibi duruyor. Bu Django&#8217;nun zayıf yanı oluyor ve güncel veritabanı tablonuzu oluşturmak için önceki tabloyu silmeniz <a href='http://www.metehan.us/south-ile-django-da-migration-islemi.html' class='excerpt-more'>[...]</a>
Benzer Yazılar:<ol>
<li><a href='http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html' rel='bookmark' title='Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı'>Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Django da oluşturduğunuz bir uygulamada Modelinizi yazdınız ve <strong>syncdb</strong> parametresi ile veritabanı tablolarını oluşturdunuz. Daha sonra model sınıfınızda tablo yapısını etkileyecek düzenlemeler yaptınız ve tekrar <strong>syncdb</strong> ile tablonuzu oluşturmaya çalıştınız. Bir baktınız ki tablo da bir değişiklik yok, olduğu gibi duruyor. Bu Django&#8217;nun zayıf yanı oluyor ve güncel veritabanı tablonuzu oluşturmak için önceki tabloyu silmeniz gerekiyor. Ayrıca tablonuzun varolan sütunlarını etkilemeyen bir düzenleme varsa; bu değişiklik yeni sütun ekleme gibi bir şeyse ve tablonuz da ki mevcut veriler yerinde dursun diyorsanız Django&#8217;dan bunu şimdilik beklemeyin. Belki ileride bu özelliği eklerler&#8230;</p>
<p>Yukarıdaki gibi bir durum ile karşı karşıyaysanız South modülünü kullanmak durumundasınız. Öncelikle South modülünü kuralım: Bu modülü kurmanız için; ya <a href="http://www.aeracode.org/releases/south/">buradan</a> istediğiniz sürümü indirip kuracaksınız, ya setuptools modülü kuruluysa</p>
<pre>
easy_install South
</pre>
<p>komutuyla kuracaksınız, ya da easy_install ile pip modülünü kurup</p>
<pre>
pip install South
</pre>
<p>komutuyla modülü kurabilirsiniz.</p>
<p>South modülünü kurduysanız bir Django projesi oluşturup, uygulama oluşturalım&#8230;<span id="more-144"></span></p>
<pre>
django-admin.py startproject southdenemesi
cd southdenemesi
python manage.py startapp blog
</pre>
<p>southdenemesi adında bir proje oluşturduk. Sonra bu proje dizinine girip blog adında bir uygulama oluşturduk. blog dizinine girip models.py dosyasını metin düzenleyici ile açıp basit olarak şunu yazalım:</p>
<pre>
from django.db import models

class Post(models.Model):
	title = models.CharField(max_length=255)
	content = models.TextField()
</pre>
<p>Sonra proje dizinine dönüp settings.py dosyasını metin düzenleyicisi ile açalım.</p>
<pre>
INSTALLED_APPS = (
    # ...
    'south',
    'blog',
    # ...
)
</pre>
<p>Veritabanı ayarınızı yaptıktan sonra south ile birlikte blog uygulamamızı projemize ekliyoruz ve dizin içerisinde konsolu açıp tablolarımızı oluşturuyoruz.</p>
<pre>
python manage.py syncdb
</pre>
<p>Ardından</p>
<pre>
python manage.py convert_to_south blog
</pre>
<p>ile uygulamamızı south modülü için ilklendiriyoruz. Sonra models.py dosyamızı şu şekilde değiştiriyoruz.</p>
<pre>
from django.db import models

class Post(models.Model):
	title = models.CharField(max_length=255)
	content = models.TextField()
	pub_date = models.DateTimeField(auto_now_add=True)
</pre>
<p>Modelimizdeki değişikliği southa bildiriyoruz.</p>
<pre>
python manage.py schemamigration blog --auto
</pre>
<p>Bu komutu verince bize iki seçenek sunacaktır. &#8220;2&#8243; yazıp devam ettiğimizde bize sütunun boş bırakılamayacağı için tarih bilgisi girmemizi istiyor(Eğer veri varsa her satır için aynı tarih verisi işleniyor sanırım). Bunu da </p>
<pre>
datetime.datetime.now()
</pre>
<p>kodunu yazarak hallediyoruz ve migration yani göç dosyamız, blog uygulamamızın içinde oluşturulan migrations dizininde 0002 ile başlayan bir Python dosyası olmuş oluyor. Oluşturulan göç dosyasını uygulamak için</p>
<pre>
python manage.py migrate blog
</pre>
<p>komutunu veriyoruz ve yeni tablo sütunu tablomuzdaki yerini alıyor. Eğer south uygulamasını projeye ekleyip syncdb ile tablosunu oluşturduktan sonra bir uygulama eklerseniz ilklendirmek için</p>
<pre>
python manage.py schemamigration uygulama --initial
</pre>
<p>işlemek için de</p>
<pre>
python manage.py migrate uygulama
</pre>
<p>komutunu veriyoruz. Daha sonraki düzenlemeleri yukarıdaki gibi &#8211;auto parametresi ile işleyebilirsiniz&#8230; Benim bilgim bu kadar. Daha fazla bilgi için <a href="http://south.aeracode.org/docs/index.html">buraya</a> bakabilirsiniz. Hatam varsa bildiriniz.</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/south-ile-django-da-migration-islemi.html" data-text="South ile Django da Migration İşlemi" data-count="horizontal">Tweet</a><p>Benzer Yazılar:</p><ol>
<li><a href='http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html' rel='bookmark' title='Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı'>Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/south-ile-django-da-migration-islemi.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı</title>
		<link>http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html</link>
		<comments>http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html#comments</comments>
		<pubDate>Wed, 07 Dec 2011 12:51:08 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[çevirimiçi kullanıcı sayacı]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django middleware]]></category>
		<category><![CDATA[django türkçe kaynak]]></category>
		<category><![CDATA[online counter]]></category>
		<category><![CDATA[online kullanıcı sayacı]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python django]]></category>
		<category><![CDATA[türkçe django dersi]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=136</guid>
		<description><![CDATA[İlk Django yazımda çevirimiçi ziyaretçilerin hesabını yapan bir uygulama yapımını anlatacağım. Bu dersten bir şey anlamak için Django hakkında biraz bilgi sahibi olmanız gerekecektir. Türkçe kaynak için Google araması yaptığınızda karşınıza çıkacak kaynaklar büyük ihtimal şöyle olacaktır: Django ile blog yapımı Django belgelemelerindeki tutorialın aynısı, yani anket uygulaması Ve başlangıç düzeyinde; internet üzerinde Türkçe olarak <a href='http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html' class='excerpt-more'>[...]</a>
Benzer yazı yok.]]></description>
			<content:encoded><![CDATA[<p>İlk Django yazımda çevirimiçi ziyaretçilerin hesabını yapan bir uygulama yapımını anlatacağım. Bu dersten bir şey anlamak için Django hakkında biraz bilgi sahibi olmanız gerekecektir.</p>
<p>Türkçe kaynak için Google araması yaptığınızda karşınıza çıkacak kaynaklar büyük ihtimal şöyle olacaktır:</p>
<ul>
<li>Django ile blog yapımı</li>
<li>Django belgelemelerindeki tutorialın aynısı, yani anket uygulaması</li>
</ul>
<p>Ve başlangıç düzeyinde; internet üzerinde Türkçe olarak zaten yaygın olan başlangıç konuları&#8230; Benim anlatacağım konu da belki bu seviyede olacaktır, ama daha önce kafamın almadığı middleware konusunu azcık kavramış olmak ve bunu pratik olarak kullanmak olacak.</p>
<p>Öncelikle uygulamamızı deneyebilmek için bir proje oluşturmamız gerekiyor:</p>
<pre>
django-admin.py startproject sayacprojesi
</pre>
<p>Bu komutu konsolda veriyoruz ve projemizi oluşturuyoruz. Şimdi proje dizinine girip konsoldan şu komutu veriyoruz:</p>
<pre>
python manage.py startapp onlinecounter
</pre>
<p>Sayaç uygulamamızın temelini atmış olduk. Uygulamanın içine girelim ve çevirimiçi kullanıcıların veritabanında saklanması için gerekli olan model sınıfımızı models.py içine yazalım.<span id="more-136"></span></p>
<pre>
#-*- coding: utf-8 -*-
from django.db import models

class OnlineCounter(models.Model):
    ip = models.IPAddressField(verbose_name="IP Address", db_column="visitor_ip")
    is_user = models.BooleanField(verbose_name="User ?", db_column="is_user", default=False)
    visited_time = models.TimeField(verbose_name="Visited Time", db_column="visitor_time", auto_now_add=True)

    class Meta:
        db_table = "online_counter"
        verbose_name_plural = "Online Counter"
</pre>
<p>OnlineCounter adında bir Model sınıfı oluşturduk ve ip, is_user ve visited_time adında üç değişken tanımladık. Bunlardan ip değişkenine ip adresi kayıt edileceğinden &#8220;models&#8221; modülünün sağladığı IPAddressField sınıfını kullandık. Bu sınıf ip adresi için oluşturacağınız sütun için gerekli sql kodunu sağlar. Bu sütunun adının ise visitor_ip olarak gözükmesini sağlıyoruz.</p>
<p>is_user değişkenine ise BooleanField sınıfını kullandık. Siteyi ziyaret eden kişinin kayıtlı bir üye mi yoksa misafir mi olduğunu True ve False olarak veritabanında saklayacağız. BooleanField sınıfına db_column parametresiyle girdiğimiz &#8220;is_user&#8221; verisiylede sütun adını belirlemiş olduk. verbose_name parametresi Django yönetici panelinde verinin ne olduğu belirten bir ayrıntı olarak kullanılır.</p>
<p>Ziyaretçinin siteye girdiği anı belirlemek için de visited_time değişkenine TimeField sınıfını atadık. Sütun adını &#8220;visitor_time&#8221; olarak ayarladık ve veritabanına kayıt yapıldığında o anki zamanı sütuna yazması için auto_now_add parametresini True olarak belirledik.</p>
<p>Meta sınıfında ise OnlineCounter sınıfıyla ilgili düzenlemeler yapıyoruz. django.contrib.admin uygulamasını kullananların yönetici panelinde uygulamamızı &#8220;Online Counter&#8221; olarak görmeleri için verbose_name_plural değişkenini oluşturuyoruz ve tablo adını db_table değişkenine girdiğimiz değer ile online_counter yapıyoruz.</p>
<p>Şimdi uygulama dizinimizde middleware.py adında bir dosya oluşturuyoruz ve şunları yazıyoruz:</p>
<pre>
from onlinecounter.models import OnlineCounter
from datetime import datetime, time

class OnlineCounterMiddleware(object):
    def process_request(self, request):
        now_time = datetime.now().time()
        limit = time(now_time.hour, now_time.minute-5, now_time.second, now_time.microsecond)
        OnlineCounter.objects.filter(visited_time__lt=limit).delete()
        online, create = OnlineCounter.objects.get_or_create(ip=request.META["REMOTE_ADDR"])
        if request.user.is_authenticated():
            online.is_user = True
        else:
            online.is_user = False
        if not create:
            online.visited_time = now_time
        online.save()
        request.online = self

    def total(self):
        total = OnlineCounter.objects.all().count()
        return total

    def guest(self):
        guest = OnlineCounter.objects.filter(is_user=False).count()
        return guest

    def users(self):
        users = OnlineCounter.objects.filter(is_user=True).count()
        return users
</pre>
<p>models.py modülümüzü ve datetime modülünün datetime ve time fonksiyonlarını içe aktardık ve OnlineCounterMiddleware adında bir sınıf oluşturduk. </p>
<p>Django, her istek(request) yaptığında projeye ekli middleware sınıflarının process_request() methodunu çağırır. Bu da siteye giren herkesin sayacımız tarafından yakalanmasını sağlar. Php de olduğu gibi gerekli her php dosyasına kod eklemek zorunda kalmayız.</p>
<p>process_request() methodumuz çağırılacağına göre kodumuzu da bu method altına yazıyoruz.</p>
<p>Methoda request adında bir parametre atıyoruz. Bir kullanıcı istek yaptığında gerekli verileri Django, methodun bu parametresine atamaya çalışır. </p>
<p>now_time değişkenine istek yapıldığı anda ki zamanı öğrenmek için gerekli kodu yazıyoruz. limit değişkenine ise bir ziyaretçinin kaç dakika işlem yapmadığında veritabanından atılacağını belirten zamanı ayarlıyoruz. Hemen altındaki satırda limit değişkenindeki zamanın veritabanındaki zamandan küçük olan ziyaretçileri veritabanından siliyoruz. filter() methoduna girdiğimiz visited_time değişkenine eklediğimiz __lt ise &#8220;< " operatörünün sihirli method adı verilen methodlardaki adını temsil ediyor. Bu sayede zaman karşılaştırılmasını yapıyoruz.</p>
<p>Bir sonraki satırda ise get_or_create() methodu ile eğer request.META["REMOTE_ADDR"] ile belirtilen ziyaretçi sitede ise verisini çek, yoksa veri oluştur diyoruz. Geriye dönüş olarak bir tuple döndürür. Tuple verisinin ilk elemanı OnlineCounter nesnemiz, ikincisi ise veri çekildiyse False veri oluşturduysa True olur. Bu verileri de online ve create değişkenine pay ettik.</p>
<p>request.user.is_authenticated() kodu bize kullanıcı girişi yapıldıysa if blokunu isletmemizi sağlar ve is_user niteliğini True olarak ayarlarız. Giriş yapılmadıysa else bloku çalışır ve is_user niteliğini False olarak ayarlarız. Sonraki if blokunda ise eğer veri oluşturulmayıp çağırıldıysa, ziyaretçinin ziyaret zamanını güncelleriz.</p>
<p>online.save() ile değişiklikleri kaydediyoruz ve request e online adında bir nitelik oluşturup "self" ile sınıfımızı atıyoruz.</p>
<p>Oluşturduğumuz total() methodunda bütün veriyi çağırıp nesnemizin count() methoduyla kaç çevirimiçi kişi olduğunun verisi alıyoruz. guest() ve users() methodlarında ise OnlineCounter sınıfının is_user niteliğini kullanarak misafir mi, üye mi diye filtreleme yapıyoruz ve sonucu döndürüyoruz. Middleware sınıfımızla işimiz bu kadar.</p>
<p>Şimdi proje dizinine dönüp views.py adında bir dosya oluşturun ve şu şekilde yazın:</p>
<pre>

from django.shortcuts import HttpResponse

def main(request):
    online = &quot;&quot;&quot;&lt;p&gt;Toplam: %s
    &lt;p&gt;Misafir: %s&lt;/p&gt;
    &lt;p&gt;Kullanıcı: %s&lt;/p&gt;&quot;&quot;&quot;%(request.online.total(), request.online.guest(), request.online.users())
    return HttpResponse(online)
</pre>
<p>urls.py dosyasını ise şöyle düzenleyin:</p>
<pre>
from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    url(r'^onlinecounter/$', 'views.main'),

)
</pre>
<p>settings.py dosyasına ise aşağıdaki şekilde düzenleyin:</p>
<pre>
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'visitors.db', # veritabanı ayarları.

MIDDLEWARE_CLASSES = (
    'onlinecounter.middleware.OnlineCounterMiddleware', # middleware sınıfını ekleyin.
)

INSTALLED_APPS = (

    'onlinecounter', # uygulamamızı ekliyoruz.
)
</pre>
<p>Uygulamamız hazır olduğuna göre veritabanı tablomuzu eklemek için</p>
<pre>
python manage.py syncdb
</pre>
<p>komutunu veriyoruz ve ardından</p>
<pre>
python manage.py runserver
</pre>
<p>komutunu verip sunucuyu başlatıyoruz. İnternet tarayıcınızın adres çubuğuna localhost:8000/onlinecounter/ yazarak sonucu görebilirsiniz. admin uygulaması ekliyse ve giriş yaptıysanız kullanıcı sayacında, aksi halde misafir sayacında gözükeceksiniz. middleware sınıfımız sayesinde de istediğiniz bir template dosyanıza</p>
<pre>
{{ request.online.total }}
{{ request.online.guest }}
{{ request.online.users }}
</pre>
<p>şeklinde yazarak sonucu görebilirsiniz. Anlattığım gibi bir modül yazdım ve github hesabımda proje oluşturdum ve 1.0 sürümü ile kullanıma hazır.</p>
<pre>
easy_install django-online-counter
ya da
pip install django-online-counter
</pre>
<p>komutlarıyla kurabileceğiniz gibi</p>
<pre>
git clone https://mthnzbk@github.com/mthnzbk/django-online-counter.git
</pre>
<p>komutuyla dosyaları indirip</p>
<pre>
python setup.py install
</pre>
<p>ile kurabilirsiniz. Tabii ki bunları yapabilmeniz için; easy_install için python-setuptools paketini, git için git paketini, pip için ise</p>
<pre>
easy_install pip
</pre>
<p>komutuyla pip uygulamasını kurmanız gerekmektedir...</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html" data-text="Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı" data-count="horizontal">Tweet</a><p>Benzer yazı yok.</p>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/django-ile-cevirimici-ziyaretci-sayaci-yapimi.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 2 Son</title>
		<link>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-2-son.html</link>
		<comments>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-2-son.html#comments</comments>
		<pubDate>Mon, 28 Nov 2011 19:00:02 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Modüller]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[2b fizik motoru]]></category>
		<category><![CDATA[2d fizik motoru]]></category>
		<category><![CDATA[chipmunk]]></category>
		<category><![CDATA[pygame]]></category>
		<category><![CDATA[pygame türkçe kaynak]]></category>
		<category><![CDATA[pyglet]]></category>
		<category><![CDATA[pymunk]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[pysfml]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=133</guid>
		<description><![CDATA[Bu dersimizde simülasyonumuzu geliştirmeye devam ediyoruz. Düşen topların bir engelle karşılasmasını sağlayacağız. def sabit_cizgi_ekle(space): govde = pymunk.Body(pymunk.inf, pymunk.inf) govde.position = (300,200) l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0) l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0) l3 = pymunk.Segment(govde, (200.0, 0), (200.0, 50.0), 5.0) space.add_static(l1, l2,l3) return l1,l2,l3 def to_pygame(p): """pymunk-pygame koordinat düzenlemesi yapar.""" <a href='http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-2-son.html' class='excerpt-more'>[...]</a>
Benzer Yazılar:<ol>
<li><a href='http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html' rel='bookmark' title='pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 1'>pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 1</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-1-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Bu dersimizde simülasyonumuzu geliştirmeye devam ediyoruz.</p>
<p>Düşen topların bir engelle karşılasmasını sağlayacağız.</p>
<pre>
def sabit_cizgi_ekle(space):
    govde = pymunk.Body(pymunk.inf, pymunk.inf)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    l3 = pymunk.Segment(govde, (200.0, 0), (200.0, 50.0), 5.0)

    space.add_static(l1, l2,l3)
    return l1,l2,l3

def to_pygame(p):
    """pymunk-pygame koordinat düzenlemesi yapar."""
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)
</pre>
<p>sabit_cizgi_ekle() fonksiyonuna yine space adında bir parametre veriyoruz. Fonksyionumuzda bir gövde tanımladık ve kütlesiyle momentini pymunk.inf değişkeniyle sonsuz yaptık. Bir nevi duvara monteleme işlemide denebilir sanırım&#8230; Gövdemizin pozisyonunu vektörel olarak 300&#215;200 olarak belirledik. l1, l2, l3 değişkenlerine Segment nesnesi tanımladık. İlk parametreyle gövdesini diğer iki parametresini pygame.draw.line() da gördüğümüz gibi çizgi koordinatlarını belirledik. Son koordinat ise çizginin çapını belirliyor; daha doğrusu kalınlığı diyebiliriz&#8230;<span id="more-133"></span></p>
<p>Sabit olarak ekleyeceğimiz nesneleri Space sınıfımızın add_static() methodu ile ekliyoruz ve fonksiyonumuzda bu şekilde ekledikten sonra fonksiyonumuzun bu çizgileri döndürmesini sağladık.</p>
<p>cizgileri_ciz() fonksiyonuna, çizgileri çizeceği yüzeyi belirtmek için ekran parametresiyle; sabit_cizgi_ekle() fonksiyonundan dönen Segment nesnelerini grafik olarak çizdirmek için de cizgiler parametresini ekledik. Çizgileri bir for döngüsü yardımıyla tek tek pygame.draw.line() ile ekrana çizdirilmesini sağladık. pv1 ile pv2 de çizgilerin Space deki pozisyonlarını ayarladık. rotated(body.angle) da ise çizgilerin bir açısı varsa ona göre bir düzenleme yapılması sağlanıyor. Eğer bir çizgi 45 derece aksi yöne yatıksa Vektörde o kısımın değeri artış ya da azalış gösterecektir.</p>
<p>p1 ve p2 de ise önceki dersimizde pygame&#8217;e özgü koordinat çevirme işlemi yapılıyor. Bu çevrimi yapılmış koordinatlar çizginin simülasyondaki yerine göre çizilmesini sağlıyor.</p>
<pre>
#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.color import *
import pymunk

#def top_ekle(space):
#def top_cizdir(ekran, top):
# Yer kaplamaması için bu şekilde gösterildi. Siz kodunuzu olduğu gibi bırakın.

def sabit_cizgi_ekle(space):
    govde = pymunk.Body(pymunk.inf, pymunk.inf)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    l3 = pymunk.Segment(govde, (200.0, 0), (200.0, 50.0), 5.0)
    space.add_static(l1, l2,l3)
    return l1,l2,l3

def to_pygame(p):
    """pymunk-pygame koordinat düzenlemesi yapar."""
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        print cizgi.a.rotated(1.0), cizgi.b.rotated(0.0)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

cizgiler = sabit_cizgi_ekle(space)
toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)
            pass

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        top_cizdir(ekran, top)
    cizgileri_ciz(ekran, cizgiler)
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)
</pre>
<p>Örnekteki kodda cizgiler değişkenine sabit çizgilerin listesini tutturduk ve oyun döngümüzde cizgileri_ciz() fonksiyonumuza bu değişkeni parametre olarak vererek çizgilerimizi ekrana çizilmesini sağladık. Şimdi bu kodu çalıştırdığınızda bir hata yapmadıysanız fare tıklamalarınızda tepsi gibi bir alana top doldurabilirsiniz.</p>
<p>Şimdi sabit duran bu çizgileri bir pervanenin kanadı gibi bir noktasından iğneleyelim. Bunun için sabit_cizgi_ekle() fonksiyonunun adını cizgi_ekle() olarak değiştiriyoruz ve</p>
<pre>
def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    space.add(l1, l2, govde, devir_eklemi)
    return l1,l2
</pre>
<p>bu şekilde bir kod ortaya çıkarıyoruz&#8230; İlk olarak devir_govdesi adında yeni bir Body nesnesi oluşturuyoruz ve diğer Body nesnemizle aynı pozisyona getiriyoruz. Çizgileri tutan gövdemiz artık sabit olmayacağı için 50 kütleli ve 10000 momente sahip oluyor. Sağ taraftaki l3 çizgisinide çıkarıyoruz.</p>
<p>devir_eklemi adında bir PinJoint nesnesi oluşturduk. Bunu bir çubuğun ortasına saplanmış iğne gibi düşünebilirsiniz. PinJoint sınıfının ilk iki parametresi a ve b noktaları olmak üzere koordinat verisi alır; diğer iki parametree farklı bir değer vermeyecekseniz yazmanıza gerek yoktur. Hakkında pek bilgim yok; onun için rasgele değerler vererek ne işe yaradığını çıkartabilirsiniz.</p>
<p>Space sınıfının add_static() methodu yerine de add() methodunu kullandığımıza dikkat edin&#8230;</p>
<p>Son olarak şu satırı</p>
<pre>
cizgiler = sabit_cizgi_ekle(space)
</pre>
<p>şu şekilde değiştiriyoruz:</p>
<pre>
cizgiler = cizgi_ekle(space)
</pre>
<p>Kodumuzu çalıştırıp fare sol tuşuyla top oluşturarak topun çizgilere temas etmesiyle çizgilerin pervane gibi döndüğünü göreceksiniz. Tabii ki; bunu bu şekilde bırakmayacağız. Pervane gibi dönmesini engelleyip kısıtlı olarak sağ-sol aşağı doğru eğilmesini sağlayacağız.</p>
<pre>
def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    sinirli_devir_govdesi = pymunk.Body()
    sinirli_devir_govdesi.position = (200,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    eklem_siniri = 25
    sinirli_devir_eklemi = pymunk.SlideJoint(govde, sinirli_devir_govdesi, (-100,0), (0,0), 0, eklem_siniri)
    space.add(l1, l2, govde, devir_eklemi, sinirli_devir_eklemi)
    return l1,l2
</pre>
<p>Fonksiyonumuz biraz daha gelişti&#8230; sinirli_devir_govdesi adında yeni bir Body nesnesi tanımladık ve 200&#215;200 pozisyonuna ayarladık. sinirli_devir_eklemi adında ise SlideJoint nesnesi tanımladık. İlk iki parametre PinJoint sınıfındaki gibidir. Üç ve dördüncü parametrelerde PinJoint sınıfının son iki parametresiyle aynı işleve sahiptir. parametre adı anchor olduğundan en uygun anlamı çapa oluyor. Buna göre x koordinatı -100 olan yere çapa atılmış oluyor. Belgelendirme yeterli düzeyde olmadığından ancak bu kadarı çıktı malesef&#8230; Son parametre eklem_siniri ise çizginin ne kadar kaydırılılabileceğini(?) söylüyor. Buna da farklı değerler vererek pekiştirme yapabilirsiniz. Son olarakta Space nesnemizin add() methoduna SlideJoint nesnemizi ekliyoruz. Fonksiyonla işimiz burada bitiyor&#8230;</p>
<p>Önceki derste listeye eklenen topların ekranda olmamasına rağmen listede yer işgal ettiğini ve bunlarında programın ekrana çizmeye çalıştığını söylemiştik. Ekleyeceğimiz tek satır kod ile y koordinatı sıfırın altına düşen topları listeden çıkartacağız ve olası şişme ve performans sorununun önüne geçeceğiz.</p>
<pre>
for top in toplar:
    top_cizdir(ekran, top)
</pre>
<p>Oyun döngümüzdeki bu for döngüsüne</p>
<pre>
if top.body.position.y < 0: toplar.remove(top)
</pre>
<p>kodunu ekleyerek</p>
<pre>
for top in toplar:
    if top.body.position.y < 0: toplar.remove(top)
    top_cizdir(ekran, top)
</pre>
<p>Bu şekle getiriyoruz. Artık kodumuz sağlıklı bir şekilde çalışmalı. Kodumuzun son hali şu şekilde:</p>
<pre>
#-*- coding: utf-8 -*-
import sys
import pygame
from pygame.color import *
import pymunk

def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)

def cizgi_ekle(space):
    devir_govdesi = pymunk.Body()
    devir_govdesi.position = (300,200)
    sinirli_devir_govdesi = pymunk.Body()
    sinirli_devir_govdesi.position = (200,200)
    govde = pymunk.Body(50, 10000)
    govde.position = (300,200)
    l1 = pymunk.Segment(govde, (-200, 0), (200.0, 0.0), 5.0)
    l2 = pymunk.Segment(govde, (-200.0, 0), (-200.0, 50.0), 5.0)
    devir_eklemi = pymunk.PinJoint(govde, devir_govdesi, (0,0), (0,0))
    eklem_siniri = 25
    sinirli_devir_eklemi = pymunk.SlideJoint(govde, sinirli_devir_govdesi, (-100,0), (0,0), 0, eklem_siniri)
    space.add(l1, l2, govde, devir_eklemi, sinirli_devir_eklemi)
    return l1,l2

def to_pygame(p):
    return int(p.x), int(-p.y+600)

def cizgileri_ciz(ekran, cizgiler):
    for cizgi in cizgiler:
        body = cizgi.body
        pv1 = body.position + cizgi.a.rotated(body.angle)
        pv2 = body.position + cizgi.b.rotated(body.angle)
        p1 = to_pygame(pv1)
        p2 = to_pygame(pv2)
        pygame.draw.line(ekran, THECOLORS["red"], p1, p2)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

cizgiler = cizgi_ekle(space)
toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)
            pass

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        if top.body.position.y < 0: toplar.remove(top)
        top_cizdir(ekran, top)
    cizgileri_ciz(ekran, cizgiler)

    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)
</pre>
<p>Ne yazık ki pymunk hakkında pek fazla belge yok ve Kaynak altında verdiğim linkler ne kadar yeterli olur bilemiyorum, ama İngilizcesi yeterli olanlar sınıf isimlerinden vs. öğrenmekte zorluk çekmeye bilirler. Bende bu yazıyı yazarken bu modülü öğrendiğim için sorularınıza cevap veremezsem kusuruma bakmayın...</p>
<p>Kaynak:</p>
<p>http://code.google.com/p/pymunk/wiki/SlideAndPinJointsExample</p>
<p>http://pymunk.googlecode.com/svn/trunk/docs/api/index.html</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-2-son.html" data-text="pymunk 2B Fizik Kütüphanesi - Bölüm 2 Son" data-count="horizontal">Tweet</a><p>Benzer Yazılar:</p><ol>
<li><a href='http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html' rel='bookmark' title='pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 1'>pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 1</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-1-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-2-son.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Özgürlük Savaşı</title>
		<link>http://www.metehan.us/ozgurluk-savasi.html</link>
		<comments>http://www.metehan.us/ozgurluk-savasi.html#comments</comments>
		<pubDate>Sun, 27 Nov 2011 09:00:48 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Genel Öyküler]]></category>
		<category><![CDATA[edebiyat]]></category>
		<category><![CDATA[mustafa kemal]]></category>
		<category><![CDATA[öykü]]></category>
		<category><![CDATA[özgür yazılım]]></category>
		<category><![CDATA[pardus]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=132</guid>
		<description><![CDATA[Bu yazımı da bir zamanlar pardus-linux.org un düzenlediği yarışma için yazmıştım. Özgür yazılım adına bir şeyler yazmaya çabalamışım&#8230; Özgürlük Savaşı Yıl 2019&#8230; “Memleketin her köşesi bilfiil işgal edilmiş durumda&#8230;” 16 Mayıs&#8230; Ankara&#8217;ya ayak bastığımda memleketin durumu ile ilgili edindiğim bilgiler şöyleydi: Hükumet, dar görüşlülüğün neticesi olarak kaynağı belli olmayan yazılımları kamu kuruluşlarında kullandırmaya devam ediyordu. <a href='http://www.metehan.us/ozgurluk-savasi.html' class='excerpt-more'>[...]</a>
Benzer yazı yok.]]></description>
			<content:encoded><![CDATA[<p>Bu yazımı da bir zamanlar pardus-linux.org un düzenlediği yarışma için yazmıştım. Özgür yazılım adına bir şeyler yazmaya çabalamışım&#8230;</p>
<h1 align="CENTER"><span style="font-family: 'Times New Roman', serif;">Özgürlük Savaşı</span></h1>
<p><em style="font-family: 'Times New Roman', serif; text-align: justify;">Yıl 2019&#8230;</em></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> <em>“Memleketin her köşesi bilfiil işgal edilmiş durumda&#8230;”</em></span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> <em>16 Mayıs&#8230;</em></span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Ankara&#8217;ya ayak bastığımda memleketin durumu ile ilgili edindiğim bilgiler şöyleydi: Hükumet, dar görüşlülüğün neticesi olarak kaynağı belli olmayan yazılımları kamu kuruluşlarında kullandırmaya devam ediyordu. Yıllar önce başbakanlığın sessiz sedasız başlattığı özgürlük hareketi birilerinin çıkarları yüzünden daha sonuçlandırılamamıştı. Millet, geleceği görememiş ve herhangi bir yazılımda casus kodların olup olmamasına aldırış etmeden zevkleri uğruna; kişisel bilgilerini ve sohbet kayıtlarını kimliği meçhul kişilerin kullanımına sunmaya devam ediyordu. Ülke güvenliği kaynak kodları okunamayan sistemlerin elinde.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Bu kötü duruma karşın Milli Güvenlik Bakanlığı&#8217;nın ASAL&#8217;ı devlet destekli olan Pardus Linux dağıtımını kullanmaya yıllar öncesinden başlamıştı. Bazı kurum ve kuruluşlar ise ya özgür yazılımları tercih ettiler ya da yavaş adımlarla bu yolda ilerlemeye çalışıyorlardı. </span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Özgür yazılımı savunan binlerce insan ise yıllardır sivil toplum hareketleriyle halkı bilinçlendirmeye çalışıyorlardı.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> &#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Devlet erkanıyla görüşmelerim oldu ve aldığım yanıtlar hiçte iç açıcı değildi. Kimi siyasi bürokratlar mandasoft yazılımlarını ve yardakçılarını istiyordu, kimileri de kurumlara gereken yazılımların ve teknik desteğin yabancı devletlere bırakılması görüşündeydiler. Bu düşüncelerin hiç biri, özgürlüğe timsal olmuş Atamızın kabul etmeyeceği cinstendi&#8230; Son olarak en yüksek makamdaki kişiyle görüştüm.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> “Evlat!.. Bu ülkeyi kurtarabilirsin&#8230;” dedi. Acaba benim düşüncelerimi mi kastediyordu? Arkasından gelen sözlerle hiçte düşüncelerimle bağdaşmayan bir konuşma dinlediğimi fark ettim.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> &#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Ne yapmalıydım?.. Elimdeki imkanlarla özgürlüğü savunan tüm sivil toplum örgütlerini ve halkı ayaklandırmalı, seminerlerle yürüyüşler düzenlenmesine önayak olmalıydım.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> &#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Öğleden sonra birkaç yakın arkadaşım ile birlikte Amasya&#8217; ya doğru yola çıktık. Amacımız özgür yazılımın en az kullanıldığı Doğu Anadolu da halkı bilinçlendirmek ve yardım etmekti. Onlara, özgür ve Türk mühendisleri tarafından geliştirilen Pardus&#8217;u dağıtacak ve özgürlükleri için çaba sarf edecektik. Amasya&#8217;ya yolculuğumuz sırasında bize engel olmak isteyen bir takım çıkarcı kişilerle karşılaştık, ama engelleri kolayca aştık.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Amasya&#8217;da bilinçli kişilerle ve meraklı insanlarla beraber bir toplantı yaptık. Toplantı sonucunda aldığımız kararları bir genelge halinde ülke çapına yaydık. Aldığımız kararlar ise şunlardı:</span></p>
<ol>
<li>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;">Vatanın bütünlüğü ve milletin özgürlüğü tehlike altındadır.</span></p>
</li>
<li>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;">Çıkarcı hükumetler bu tehlikenin farkına varamamıştır.</span></p>
</li>
<li>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;">Devlet daireleri ve tüm kamu kuruluşları bir an önce özgür yazılımlara yönelmelidir.</span></p>
</li>
<li>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;">Milli güvenliği sağlayan bütün uçak, radar vs. araçların yazılımları özgürleştirilmelidir.</span></p>
</li>
</ol>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> &#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> <em>Yıl 2023 Cumhuriyetin 100. yılı&#8230;</em></span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Ülke çapında yapılan seçimlerle beraber hükumeti kurduk ve özgürlüğün temellerini sağlamlaştırmak için çalışmalara başladık. Öncelikle kamu kuruluşlarında kullanılan yazılımların açık kaynak ve özgür alternatiflerini araştırdık ve personellere gerekli eğitimleri verdikten sonra geçiş işlemini başardık. Alternatifi olmayan yazılımların ise devlet için proje geliştiren firmalar sayesinde kısa sürede alternatifini geliştireceğiz. Bilgisayar ve vs. sistemlerde GNU/Linux dağıtımı olan Pardus işletim sistemine geçtik. 2003 yılından beri üzerinde çalışılan proje bu süre zarfında ihtiyaçlarımızı karşılayacak şekle geldiği için pek fazla problem yaşayacağımızı sanmıyorum&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Mandasoft&#8217;un işletim sistemlerinin tekelini kırabilmek için gerekli kanuni düzenlemeleri kısa sürede gerçekleştirip, bilgisayar satışlarında işletim sistemi satılması zorunluluğunu kaldıracağız. Bilgisayardan bağımsız satılan işletim sisteminde de tekeli kırabilmek için şirketlerin GNU/Linux dağıtımlarının da beraber satımı ve/veya ücretsiz verimi zorunluluğunu getireceğiz&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> GNU/Linux dağıtımları hızla gelişmesiyle pazar payını artırdı. Lakin büyük oyun firmalarının tek bir işletim sistemi için oyun çıkartma alışkanlığı son bulmadıkça Linux daha uzun süre arka planda kalabilir. Ümit ediyorum ki o şirketlerin bulunduğu ülkeler gerekli kanuni düzenlemeleri gerçekleştirir. Bu sayede daha fazla özgür yazılım kullanıcıları artacaktır.</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> &#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> <em>3 Kasım</em></span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Gereken kanuni düzenlemeleri gerçekleştirmiş bulunmaktayım. Bununla beraber yol arkadaşlarımında yardımları sayesinde bu günleri görmüş oldum&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> Gençliği de yazılımcılığa yönlendirmek için gerekli her şeyi yapmak için çalışmalara başlamak üzereyim&#8230; Yedi gün sonra Atamızın ölümünün 85. yıl dönümü ve O&#8217;nun karşısına alnı dik olarak çıkacağım için mutluyum. Çünkü, özgürlüğe timsal olmuş biriydi ve bugün yaşasaydı çok önceleri, benim bugün yapabildiğim şeyleri çoktan başarmıştı&#8230;</span></p>
<p align="JUSTIFY"><span style="font-family: 'Times New Roman', serif;"> <em>Mustafa Kemal</em></span></p>
<p align="CENTER"><span style="font-family: 'Times New Roman', serif; font-size: medium;"><br />
</span></p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/ozgurluk-savasi.html" data-text="Özgürlük Savaşı" data-count="horizontal">Tweet</a><p>Benzer yazı yok.</p>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/ozgurluk-savasi.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>pymunk 2B Fizik Kütüphanesi &#8211; Bölüm 1</title>
		<link>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html</link>
		<comments>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html#comments</comments>
		<pubDate>Sat, 26 Nov 2011 07:00:44 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Modüller]]></category>
		<category><![CDATA[Pygame]]></category>
		<category><![CDATA[2b fizik motoru]]></category>
		<category><![CDATA[2d fizik motoru]]></category>
		<category><![CDATA[chipmunk]]></category>
		<category><![CDATA[pygame]]></category>
		<category><![CDATA[pygame türkçe kaynak]]></category>
		<category><![CDATA[pyglet]]></category>
		<category><![CDATA[pymunk]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[pysfml]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=121</guid>
		<description><![CDATA[pymunk kullanımı basit 2 boyutlu oyunlar için hazırlanmış 2B fizik motorudur. Bu modül chipmunk üzerine inşa edilmiştir. pymunk&#8217;u pygame, pyglet, PySFML gibi oyun kütüphaneleriyle kullanabileceğiniz gibi PyQt gibi grafik arayüz kütüphaneleriyle de kullanabilirsiniz. pymunk modülünü öğrenirken pygame modülünden faydalanacağız&#8230; pymunk ile daire, dikdörtgen ve çokgen şekilleri fizik kurallarına uydurabileceğimiz sınıflar ile eklem oluşturmak, engel oluşturmak <a href='http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html' class='excerpt-more'>[...]</a>
Benzer Yazılar:<ol>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-1-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-2-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 2. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 2. Bölüm</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-3-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 3. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 3. Bölüm</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/pymunk/" title="pymunk">pymunk</a> kullanımı basit 2 boyutlu oyunlar için hazırlanmış 2B fizik motorudur. Bu modül <a href="http://code.google.com/p/chipmunk-physics/" title="Chipmunk">chipmunk</a> üzerine inşa edilmiştir. pymunk&#8217;u <a href="http://www.pygame.org" title="Pygame">pygame</a>, <a href="http://www.pyglet.org/">pyglet</a>, <a href="http://www.sfml-dev.org">PySFML</a> gibi oyun kütüphaneleriyle kullanabileceğiniz gibi <a href="http://www.riverbankcomputing.co.uk/news">PyQt</a> gibi grafik arayüz kütüphaneleriyle de kullanabilirsiniz.</p>
<p>pymunk modülünü öğrenirken pygame modülünden faydalanacağız&#8230;</p>
<p>pymunk ile daire, dikdörtgen ve çokgen şekilleri fizik kurallarına uydurabileceğimiz sınıflar ile eklem oluşturmak, engel oluşturmak gibi işlemler için de sınıflar mevcuttur.</p>
<p>pymunk modülünü; GNU/Linux kullanıcıları python-setuptools paketini depolarından kurduktan sonra &#8220;easy_install pymunk&#8221; ya da &#8220;easy_install pip&#8221; dedikten sonra &#8220;pip install pymunk&#8221; komutunu vererek kurabilir, Windows kullanıcıları ise <a href="http://code.google.com/p/pymunk/downloads/list">buradan</a> uygun buldukları setup dosyasını indirerek kurabilirler. Tabii GNU/Linux kullanıcıları komutları verirken yönetici yetkisi almalıdır. Yani komutunuzun başına &#8220;sudo&#8221; komutunu eklemelisiniz&#8230;</p>
<p>Kurulum tamamlandıktan sonra Python yorumlayıcısına</p>
<pre>
import pymunk
</pre>
<p>yazarak test edebilirsiniz. Eğer ImportError hatası almıyorsanız sorun yok demektir. O zaman motoru çalıştıralım <img src='http://www.metehan.us/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>pymunk&#8217;ta fizik kurallarını uygulayacağımız bir alan oluşturmamız gereklidir. Bu işi Space() sınıfı ile yapıyoruz. Daha sonra gravity özelliği ile yer çekiminin uygulanacağı yönü belirliyoruz&#8230;<span id="more-121"></span></p>
<pre>
import sys
import pygame
from pygame.color import *
import pymunk

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()

    ekran.fill(THECOLORS["white"])
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)
</pre>
<p>Örnekte görüldüğü gibi space değişkenine Space sınıfımızı atadık ve gravity özelliğine (0.0, -900.0) olarak atadık. İster bu şekilde yazalım, ister pymunk.Vec2d(0.0, -900.0) yazalım fark etmez. Sınıfımız doğru şekilde girilen veriyi kendisi Vec2d vektör nesnesine dönüştürecektir.</p>
<span class="notice">gravity özelliğine girilen ilk değer X koordinatını, ikincisi ise Y koordinatını temsil eder. Artı değer verilirse X için sağa, Y için yukarı doğru yer çekimi oluşur. Eksi değer girilirse tersi yönlere yer çekimi oluşur. Tabii yer çekimine maruz kalan nesnelerin vektörel değer girdiğimizden pygame koordinat tarzını ona göre ayarlamak gerekir.</span>
<p>Oyun döngümüzde 60 fps olarak ayarladığımız döngü sayısını fizik hesaplama süresiyle eşit tutuyoruz. step() methoduna girdiğimiz değerde oyun döngüsüyle eşit hesaplama yapmasını sağlıyor. Burada amaç simülasyonun uyumlu olmasını sağlamaktır.</p>
<p>Alanımızı oluşturduğumuza göre şimdi geometrik şekilleri çizdirmeye çalışabiliriz&#8230;</p>
<p>İlk olarak fare imleciyle ekrana tıkladığımızda bir daire çizdirelim ve fizik kurallarına göre yer çekimiyle aşağı doğru hareket etmesini sağlayalım&#8230;</p>
<pre>
def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)
</pre>
<p>top_ekle ve top_cizdir adında iki fonksiyon yazdık. top_ekle fonksiyonundan başlayalım:</p>
<p>Çizdireceğimiz şekle göre bir moment hesabı yapılması gerekiyor. Daire çizdireceğimiz zaman moment_for_circle fonksiyonunu dairenin moment hesabını yapmak için kullanırız. Değişken adlarından anlayacağınız gibi ilk parametresine kütle değerini, üçüncü parametresine de dairenin yarıçapını giriyoruz. 0 olan ikinci parametre ise dairenin iç yarıçapını temsil ediyor. Yani delikli para gibi bir şey düşünüyorsanız ikinci parametreye yarıçap verebilirsiniz.</p>
<p>Oluşturacağımız şekiller Body adında bir gövdeye ait olmalıdırlar. Body nesnemizi oluştururken şeklimizin momentinden ve kütlesinden haberdar olmasını sağlıyoruz. Sonra da çizileceği an gelince fare imleci pozisyonuna göre, ama y ekseni ekran yüksekliğinden çıkartılarak çizilmesi sağlanıyor. Çünkü matematikten hatırlarsanız y ekseni aşağı doğru eksilere inerken pygame de aşağı doğru artar. Bunu tersine çevirmek için böyle bir şey yapıyoruz.</p>
<p>Body nesnemiz ve yarıçap bilgisiyle bir Circle nesnesi oluşturuyoruz ve space parametresinden yararlanarak Space nesnemize gövdemizi ve şeklimizi ekliyoruz. Fonksiyonumuz bize Circle nesnemizi döndürüyor&#8230;</p>
<p>top_cizdir fonksiyonumuza ise ekran ve top parametrelerini almasını sağlıyoruz. p değişkeninde pygame&#8217;in anlayacağı koordinat verisini ayarlıyoruz ve draw.circle() fonksiyonumuz ile ekrana mavi renkli ve çapı 48 pixel olan bir daire çizilmesini sağlıyoruz.</p>
<p>Şimdi de ana kodumuza ufak eklemeler yaparak tam kodu yazalım.</p>
<pre>
import sys
import pygame
from pygame.color import *
import pymunk

def top_ekle(space):
    kutle = 1
    yaricap = 24
    eylemsizlik = pymunk.moment_for_circle(kutle, 0, yaricap)
    govde = pymunk.Body(kutle, eylemsizlik)
    pos = pygame.mouse.get_pos()
    govde.position = pos[0], 600-pos[1]
    sekil = pymunk.Circle(govde, yaricap)
    space.add(govde, sekil)
    return sekil

def top_cizdir(ekran, top):
    p = int(top.body.position.x), 600-int(top.body.position.y)
    pygame.draw.circle(ekran, THECOLORS["blue"], p, int(top.radius), 0)

pygame.init()
ekran = pygame.display.set_mode((600, 600))
saat = pygame.time.Clock()

space = pymunk.Space()
space.gravity = (0.0, -900.0)

toplar = []

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            top_sekli = top_ekle(space)
            toplar.append(top_sekli)

    ekran.fill(THECOLORS["white"])
    for top in toplar:
        top_cizdir(ekran, top)
    space.step(1/60.0)
    pygame.display.flip()
    saat.tick(60)
</pre>
<p>Evet toplar adında boş bir liste oluşturduk ve ekranda fare sol tuşuyla bastığımızda şeklimizin oluşmasını ve toplar listesine eklenmesini sağladık. Oyun döngümüzde ise listeye eklenen her topun sırayla çizilmesini sağladık. Kodu çalıştırıp topları sol fare tuşuyla oluşturmaya başladıktan sonra subliminal mesaj gibi mavi topların belirip kaybolduğunu görebilirsiniz. Bu durum ya modüllerden kaynaklanan bir durum ya da listeye eklenen ama ekrandan çıkmış toplarında çizilmeye çalışmasından kaynaklı olabilir. Bir sonraki devam dersimizde bu konuyuda halletmeye çalışacağız&#8230;</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html" data-text="pymunk 2B Fizik Kütüphanesi - Bölüm 1" data-count="horizontal">Tweet</a><p>Benzer Yazılar:</p><ol>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-1-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 1. Bölüm</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-2-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 2. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 2. Bölüm</a></li>
<li><a href='http://www.metehan.us/pygame-ile-oyun-programlama-sprite-3-bolum.html' rel='bookmark' title='Pygame ile Oyun Programlama &#8211; Sprite 3. Bölüm'>Pygame ile Oyun Programlama &#8211; Sprite 3. Bölüm</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/pymunk-2b-fizik-kutuphanesi-bolum-1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Savaş</title>
		<link>http://www.metehan.us/savas.html</link>
		<comments>http://www.metehan.us/savas.html#comments</comments>
		<pubDate>Thu, 24 Nov 2011 22:52:48 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Genel Öyküler]]></category>
		<category><![CDATA[edebiyat]]></category>
		<category><![CDATA[filistin]]></category>
		<category><![CDATA[israil]]></category>
		<category><![CDATA[öykü]]></category>
		<category><![CDATA[savaş]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=131</guid>
		<description><![CDATA[Bir yılı geçen bir zamanda yazdığım öykümü yayınlamaya karar verdim. Hep kod, hep kod nereye kadar Umarım beğenirsiniz&#8230; SAVAŞ Terliyordu&#8230; Elleri titriyor ve sabit duramıyordu. İsrail&#8217; in son saldırısında ailesini kaybetmişti ve ailesinin ölümüne yol açan kişilerden; biri kadın, iki kişi elindeydi. Az sonra kapalı oldukları odaya gidecek ve yapması gerekeni; onları kurtarmak için gelmelerinden <a href='http://www.metehan.us/savas.html' class='excerpt-more'>[...]</a>
Benzer yazı yok.]]></description>
			<content:encoded><![CDATA[<p>Bir yılı geçen bir zamanda yazdığım öykümü yayınlamaya karar verdim. Hep kod, hep kod nereye kadar <img src='http://www.metehan.us/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Umarım beğenirsiniz&#8230;</p>
<h1 style="text-align: center;"><strong>SAVAŞ</strong></h1>
<p>Terliyordu&#8230; Elleri titriyor ve sabit duramıyordu. İsrail&#8217; in son saldırısında ailesini kaybetmişti ve ailesinin ölümüne yol açan kişilerden; biri kadın, iki kişi elindeydi. Az sonra kapalı oldukları odaya gidecek ve yapması gerekeni; onları kurtarmak için gelmelerinden önce ailesinin intikamını alacaktı&#8230; Sonrada yaşamına bir son verecekti; artık yaşamasının bir anlamı yoktu&#8230;</p>
<p>Mustafa; ölmeden, öldürmeden önce; o, insan demeye ağzının varmadığı canilere, yaşadığı acıyı tattırmalıydı. Onlara; ailesini kaybettiği zaman yaşadığı acıyı, en azından bir kısmını tattırmalıydı. Peki, ne yapacaktı? İşkence mi etmeliydi? Onları hayal dahi edemeyecekleri şekilde yavaş ve acılı bir ölüme mi götürmeliydi? Ama elleri, kalbi veya dürtüleri bunları gerçekleştirmesine müsaade edecek miydi? Sanmıyordu&#8230; O hiçbir zaman acımasız ve kana susamış biri olamazdı. Hayatında bir başka birini dahi incitememişti çünkü. Şimdi düşününce bile, kapalı odada elleri kolları bağlı duran iki insanı öldürebileceğini sanmıyordu. Yapmalıydı&#8230;<span id="more-131"></span></p>
<p>Silahını aldı, şarjörü kontrol etti ve birazdan öldürmeyi umduğu İsraillilerin bulunduğu odaya seğirtti. Kapının kilidini açtı ve içeri girip arkasından kapıyı kapattı, kilitledi. Eline düştüklerinde kendini kontrol edememiş ve bilinçlerini yitirene kadar dayak atmıştı onlara. Bu yüzden sandalyeye bağlı askerlerin suratları dağılmıştı.</p>
<p>Karşılıklı göz göze geldiler ve nefretle birbirlerine baktılar. Yalnız askerlerin saklayamadıkları korkuları, anlaşılabiliyordu. Mustafa, askerlere yaklaşıp ağzını tıkayan bezleri çözdü. Onları öldürmeden önce konuşmalıydı&#8230; Geri çekildi ve gözleri her iki askere sırayla baktı.</p>
<p>&#8220;Beni anladığınızı biliyorum,&#8221; dedi sakin tutmaya çalıştığı sesiyle. “Hemde çok iyi&#8230; Ailemi öldürdünüz ve bende sizi öldüreceğim&#8230; Gerçekleştiremeyeceğiniz hayaller yüzünden binlerce masum insanı katlettiniz ve bu soykırıma devam ediyorsunuz. Ne kadarda mutlusunuz&#8230; İnsanlarım acılar içinde ölürken; bir tepeye çıkmışsınız ve bir gösteri izler gibi mutlu ve gülümseyerek ölümümüzü izliyorsunuz&#8230; Çünkü rahat bir hayat sürdürürken bu durumda olmanın hayalini bile kurmuyorsunuz. İnsanlarımı öldürürken, ailemi katlederken, bu duruma düşeceğinizi hayal dahi etmemiştiniz&#8230; Şimdi kafanıza silahı dayamış bulunuyorum ve benim yaşadığım acıları yaşamanızı istiyorum&#8230;”</p>
<p>Askerler tedirginlik ve korkuyla birbirlerine baktılar. Mustafa silahını erkek olan askere doğrulttu ve sol ayağına bir mermi sıktı. Adam merminin etini delmesiyle acı dolu bir çığlık attı. Yanında bağlı olan kadın bağlı olduğu sandalyede sıçraya bildiği kadar sıçradı ve korkudan sessizce ağlamaya başladı.</p>
<p>Bu sefer sağ ayağına ateş etti ve daha ilk merminin yol açtığı acı dinmeden yenisi eklendi. Adam çığlıklar atıyor ve acı içinde kıvranıyordu. Kadın ise sıranın yavaşça kendine geldiğinin farkındaydı. Kendi dilinde yalvardı ve bağışlanmayı diledi, ama Mustafa ne dediğini anlamıyordu.</p>
<p>Şarjörde iki mermi kalana kadar, adamın hayati olmayan yerlerine ateş etti ve kan kaybından ölmeye bıraktı. Adama yavaş bir ölüm sunsa da, katilde olsa bir kadına işkence edemeyecekti. Bir kurşunu ona, son kurşunu ise kendine ayırmıştı.</p>
<p>Kadın korku içinde ölümü beklerken arkadaşının ölümünü izliyordu. Kafasını çevirdiğinde ise Mustafa müdahale ediyor ve bu olayı izlemesini sağlıyordu. Adam son nefesini vermeden önce kadına bir şeyler söylemeye çalıştı, ama bitiremeden sesi kesildi ve gözleri kaydı.</p>
<p>Sıra kadındaydı&#8230; Mustafa silahı direk kadının kafasına dayadı ve silahın horozunu kaldırdı. Kadın kendi dilinde haykırıyordu hala, ama parmağı tetiğe dokunduğunda Mustafa&#8217;nın geri adım atmasına yol açarak onun dilinde yalvarmaya başladı.</p>
<p>“Ne olur öldürme&#8230; Ailem var, çocuklarım var&#8230; Yalvarırım acı bana&#8230;”</p>
<p>Bu sözler üzerine Mustafa aniden sinirlendi.</p>
<p>“Sen benim ailemi öldürürken onlara acıdın mı? Ha! Acıdın mı? Çocukları, kadınları öldürürken hiç düşünmedin mi? Hiç onların ailelerini düşündün mü? Can çekişerek ölen insanları hiç kendi yerine koydun mu? Annesiz kalan bir çocuğun çaresizliğini, gözyaşlarını gördün mü? Sapkınca hayalleriniz uğruna, acımadan ve umursamadan katlettiniz insanları&#8230; Ta ki; kendi başınıza gelene kadar bu duruma düşeceğinizi düşünmediniz bile&#8230;”</p>
<p>“Yalvarırım&#8230; Bizi zorladılar, başka seçeneğimiz yoktu&#8230; Size karşı bizi doldurdular&#8230;”</p>
<p>“Her zaman başka bir seçenek vardır&#8230; Şimdi seni bıraksam, arkanı sağlama alınca benim peşime düşecek ve öldüreceksiniz. Ama seni burada öldürürsem-”</p>
<p>“Hiç bir şey değişmeyecek&#8230; Beni öldürsen, eline ne geçecek?”</p>
<p>“Sadece masum hayatlar&#8230; Eğer seni öldürürsem, senin işleyebileceğin cinayetleri de önlemiş olacağım&#8230;”</p>
<p>“Sonra ne olacak? Ben olsam da, olmasam da bu devam edecek&#8230; Eğer beni affedersen yemin ediyorum bir daha elime silah almayacağım&#8230;”</p>
<p>“Evet, sen olmasan da böyle devam edecek&#8230; Hayır, seni affetsem de yeminini tutacağını sanmıyorum&#8230;”</p>
<p>Parmağı tekrar tetiğe değdi ve kadının gözlerinin içine baktı. O gözlerde karısının gölgesini gördü, gözleri yaşardı. Eli daha şiddetli titredi ve parmağını tetikten uzaklaştırdı. Yapamayacaktı&#8230; Kadında anlamıştı ve suratında umudun izleri gözüküyordu. Mustafa silahını indirdi ve kadının bağlarını çözdü. Kadın ellerini ovuştururken gidip kapının kilidini açtı ve kapıyı araladı.</p>
<p>“Git! Sadece git!” dedi bağırarak. Kadın, tedirgin bir şekilde hareketlendi ve adamın her an kendisini vurmasını bekleyerek kapıya yöneldi. Adama arkasını dönmek istemiyordu, ama tek kurtuluş, kapıdan çıkmaktı. Hiçbir engelle karşılaşmadan odadan çıktı ve odanın bulunduğu harabeden dışarı çıktı. Sonra arkasından tek el bir silah sesi duydu ve anladı&#8230; Sevgi uğruna, bu dünyadan bir insan daha ayrılmıştı.</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/savas.html" data-text="Savaş" data-count="horizontal">Tweet</a><p>Benzer yazı yok.</p>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/savas.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ElementTree Modülü</title>
		<link>http://www.metehan.us/elementtree-modulu.html</link>
		<comments>http://www.metehan.us/elementtree-modulu.html#comments</comments>
		<pubDate>Wed, 23 Nov 2011 00:49:23 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Modüller]]></category>
		<category><![CDATA[cElementTree]]></category>
		<category><![CDATA[ElementTree]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python türkçe kaynak]]></category>
		<category><![CDATA[python xml]]></category>
		<category><![CDATA[xml parse]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=122</guid>
		<description><![CDATA[Xml verilerini işlemek için çeşitli yapılar vardır(dom, sax gibi). Bu derste ağaç yapısını kullanan ElementTree modülünü öğreneceğiz ve hız ve performans bakımından C ile yazılmışı olan cElementTree modülünü kullanacağız. Bu modül xml.etree modül paketinin bir parçasıdır. Modülümüzü farklı şekillerde çağırabiliriz. from xml.etree import cElementTree import xml.etree.cElementTree as cElementTree Öncelikle xml etiketi oluşturmayı ve bu etiketlere <a href='http://www.metehan.us/elementtree-modulu.html' class='excerpt-more'>[...]</a>
Benzer yazı yok.]]></description>
			<content:encoded><![CDATA[<p>Xml verilerini işlemek için çeşitli yapılar vardır(dom, sax gibi). Bu derste ağaç yapısını kullanan ElementTree modülünü öğreneceğiz ve hız ve performans bakımından C ile yazılmışı olan cElementTree modülünü kullanacağız.</p>
<p>Bu modül xml.etree modül paketinin bir parçasıdır. Modülümüzü farklı şekillerde çağırabiliriz.</p>
<pre>
from xml.etree import cElementTree
import xml.etree.cElementTree as cElementTree
</pre>
<p>Öncelikle xml etiketi oluşturmayı ve bu etiketlere nitelik ve değer atamasını öğrenelim.</p>
<pre>
from xml.etree import cElementTree

root = cElementTree.Element("diller")

child = cElementTree.SubElement(root, "dil")
child.text = "Python"

child = cElementTree.SubElement(root, "dil")
child.text = "Ruby"
</pre>
<p><span id="more-122"></span><br />
Element methoduyla root etiketimizi &#8220;diller&#8221; adıyla oluşturduk. Çocuk etiket olarak SubElement methodundan faydalandık ve ilk parametresine root değişkenini yazarak ebeveyn etiketini belirledik ve çocuk etiketimizin adını &#8220;dil&#8221; olarak belirledik. SubElement&#8217;in text niteliğini kullanarak etiketimizin değerini &#8220;Python&#8221; ve sonraki tanımlamamızda &#8220;Ruby&#8221; olarak girdik.</p>
<pre>
cElementTree.dump(root)
</pre>
<p>koduyla xml çıktısı alabiliriz.</p>
<pre>
&lt;diller&gt;&lt;dil&gt;Python&lt;/dil&gt;&lt;dil&gt;Ruby&lt;/dil&gt;&lt;/diller&gt;
</pre>
<p>Eğer etiketlerimize nitelikte eklemek istersek Element methoduna ikinci, SubElement methoduna üçüncü bir parametreyi sözlük tipinde veri girerek ekleyebiliriz.</p>
<pre>
from xml.etree import cElementTree

root = cElementTree.Element("diller", {"type":"script"})

child = cElementTree.SubElement(root, "dil", {"version":"3.2"})
child.text = "Python"

child = cElementTree.SubElement(root, "dil")
child.text = "Ruby"

cElementTree.dump(root)
</pre>
<pre>
&lt;diller type=&quot;script&quot;&gt;&lt;dil version=&quot;3.2&quot;&gt;Python&lt;/dil&gt;&lt;dil&gt;Ruby&lt;/dil&gt;&lt;/diller&gt;
</pre>
<p>Methodlara parametre olarak girmek yerine methodların attrib niteliğine sözlük verisini girebileceğiniz gibi set() methoduyla da nitelik ekleyebilirsiniz.</p>
<pre>
child.attrib = {"version":"3.2"}
child.set("version", "3.2")
[python]

Bir etiketin niteliğinin taşıdığı veriye ihtiyaç duyarsanız;

[python]
child.get("version")
</pre>
<p>gibi bir kod ile veriye ulaşabilirsiniz.</p>
<span class="notice">cElementTree.dump() sys.stdout ile yazdırır. Bir değer döndürmez. Bunun için cElementTree.tostring() fonksiyonunu kullanmalısınız.</span>
<p>Eğer etiketteki tüm nitelik ve değerlerine ulaşmak isterseniz items() sadece nitelik adına ulaşmak isterseniz de keys() methodunu kullanabilirsiniz.</p>
<pre>
print child.items()

[("version", "3.2")]

print child.keys()

["version"]
</pre>
<p>SubElement kullanmak istemiyorsanız, oluşturduğunuz çocuk Element nesnelerini ebeveyn Element nesnesinin append() methodu ile birer birer, ya da extend() methoduna liste olarak gireceğiniz Element nesneleriyle toplu olarak ekleyebilirsiniz.</p>
<p>Ekleyeceğiniz Element&#8217;in sırasını belirlemek isterseniz de insert() methodunu kullanabilirsiniz</p>
<pre>
root.insert(0, child)
</pre>
<p>Bu kod ile root&#8217;a eklenen child ilk sıraya eklenmiş olacaktır.</p>
<p>Kendinize göre bir xml verisi hazırladınız ve bir etiketin çocuğu olan etiketlerin bir listesini almak istediniz. Bunu getchildren() methodu ile alabilirsiniz. Eğer bir etiketin çocuk etiketi varsa Element nesnelerinden oluşan bir liste dönecektir; aksi halde boş bir liste döner. Eğer o çocuk etiketlerinde çocuk etiketi varsa ayrıca o Element nesnelerininde getchildren() methodunu çağırmalısınız.</p>
<p>Silmek istediğiniz bir SubElement nesnesi var ise Element nesnenizin remove() methoduna SubElementi girmelisiniz.</p>
<p>Öğreneceğimiz bir kaç methodu ise örnekle anlatalım ve bunu yaparken de başka şeylerde öğrenelim&#8230;</p>
<p>Örneğin elimizde bir xml dosyası var ya da internetten bir xml verisi çekeceğiz. Dışarıdan alınan xml verisini nasıl parse edeceğimizi ve Element&#8217;in kalan methodlarını da öğrenelim.</p>
<p>Elimizde şöyle bir xml verisi olduğunu varsayarak kodumuzu yazalım;</p>
<pre>
&lt;urlset&gt;
    &lt;url&gt;
        &lt;loc&gt;http://www.metehan.us/&lt;/loc&gt;
        &lt;lastmod&gt;2011-11-20T19:43:57+00:00&lt;/lastmod&gt;
        &lt;changefreq&gt;daily&lt;/changefreq&gt;
        &lt;priority&gt;1.0&lt;/priority&gt;
    &lt;/url&gt;
    &lt;url&gt;
        &lt;loc&gt;http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html&lt;/loc&gt;
        &lt;lastmod&gt;2011-11-20T19:43:57+00:00&lt;/lastmod&gt;
        &lt;changefreq&gt;daily&lt;/changefreq&gt;
        &lt;priority&gt;0.8&lt;/priority&gt;
    &lt;/url&gt;
    &lt;url&gt;
        &lt;loc&gt;http://www.metehan.us/python-kurulum-betigi-hazirlamak.html&lt;/loc&gt;
        &lt;lastmod&gt;2011-10-16T22:07:54+00:00&lt;/lastmod&gt;
        &lt;changefreq&gt;daily&lt;/changefreq&gt;
        &lt;priority&gt;0.8&lt;/priority&gt;
    &lt;/url&gt;
    &lt;url&gt;
        &lt;loc&gt;http://www.metehan.us/qlineedit-ile-otomatik-ve-sekme-iletamamlama.html&lt;/loc&gt;
        &lt;lastmod&gt;2011-09-23T18:42:40+00:00&lt;/lastmod&gt;
        &lt;changefreq&gt;daily&lt;/changefreq&gt;
        &lt;priority&gt;0.8&lt;/priority&gt;
    &lt;/url&gt;
    &lt;url&gt;
        &lt;loc&gt;http://www.metehan.us/qsettings-sinifi-kullanimi.html&lt;/loc&gt;
        &lt;lastmod&gt;2011-09-14T11:59:34+00:00&lt;/lastmod&gt;
        &lt;changefreq&gt;daily&lt;/changefreq&gt;
        &lt;priority&gt;0.8&lt;/priority&gt;
    &lt;/url&gt;
&lt;/urlset&gt;
</pre>
<p>bu veriyi ayrıştıracağız ve düzenli bir şekilde çıktısını alacağız&#8230;</p>
<pre>
#-*- coding: utf-8 -*-
from xml.etree import cElementTree

xmlVerisi = open("sitemap.xml").read()
xmlParse = cElementTree.XML(xmlVerisi)
urlTagList = xmlParse.findall("url")

for urlTag in urlTagList:
    print "URL: %s"%urlTag.find("loc").text
    print "Tarih: %s"%urlTag.find("lastmod").text
    print "Değişme Zamanı: %s"%urlTag.find("changefreq").text
    print "Öncelik: %s"%urlTag.find("priority").text
    print "--------------------------------\n"
</pre>
<p>Örnek kodumuz bu&#8230; sitemap.xml dosyasını okuyup XML() fonksiyonuna parametre olarak xml verisini girdik ve parse işlemini gerçekleştirmiş olduk. Bu fonksiyon geriye bir Element nesnesi döndürür. Bu Element nesnesi root etiketi taşır; yani örnek verimizse &#8220;urlset&#8221; etiketi. Xml verisindeki url etiketine sahip olanlar findall() methoduyla liste olarak aldık ve bir for döngüsü oluşturduk. Bu döngüde url etiketinin çocuğu olan loc, lastmod, changefreq ve priority etiketlerini find() methodu ile taşıdığı veriyi aldık. Örnekten de anlaşılacağı gibi find() methodu tek bir sonuç döndürüyor(aynı etiketten fazla olsa da ilk sıradakini alır).</p>
<p>Son olarak ise bu modülle oluşturulan xml verilerinin çıktısı okunabilir olmuyor. Okunabilirlik için <strong>Kaynak</strong>&#8216;tan ikinci bağlantıyı inceleyebilirsiniz.</p>
<p>Kaynak: <a href="http://docs.python.org/library/xml.etree.elementtree.html" title="The ElementTree XML API">The ElementTree XML API</a><br />
<a href="http://buraxezer.wordpress.com/2011/03/28/elementtree-ile-xml-olusturmaya-giris/">ElementTree ile XML oluşturmaya giriş</a></p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/elementtree-modulu.html" data-text="ElementTree Modülü" data-count="horizontal">Tweet</a><p>Benzer yazı yok.</p>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/elementtree-modulu.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Parçala &#8211; Büyük Boyutlu Dosyaları Böler, Birleştirir ve Kontrol Eder</title>
		<link>http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html</link>
		<comments>http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html#comments</comments>
		<pubDate>Wed, 19 Oct 2011 23:42:14 +0000</pubDate>
		<dc:creator>metehan</dc:creator>
				<category><![CDATA[Python-Qt]]></category>
		<category><![CDATA[parçala]]></category>
		<category><![CDATA[pyqt]]></category>
		<category><![CDATA[pyqt app]]></category>
		<category><![CDATA[pyqt türkçe kaynak]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.metehan.us/?p=117</guid>
		<description><![CDATA[Uzun süredir geliştirmediğim Parçala adlı uygulamamın yeni sürümünü çıkarmış bulunuyorum. Parçala, Hj-Split ile aynı işi gören büyük boyutlu dosyaları parçalara ayırır, birleştirir ve dosya özetini çıkarır; bu sayede birleşen dosya doğru birleşmiş mi diye kontrol etmiş olursunuz. Aşağıda kullanımını gösteren bir video paylaşıyorum&#8230; Doğrulama yaparken neden ikinci sefer dialogu açtığıma gelirsek; dosya özetinin değişmemesi kullanıcıları <a href='http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html' class='excerpt-more'>[...]</a>
Benzer Yazılar:<ol>
<li><a href='http://www.metehan.us/virux-gnulinux-icin-bir-antivirus-yazilimi.html' rel='bookmark' title='Virux &#8211; GNU/Linux için bir antivirüs yazılımı :P'>Virux &#8211; GNU/Linux için bir antivirüs yazılımı :P</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Uzun süredir geliştirmediğim Parçala adlı uygulamamın yeni sürümünü çıkarmış bulunuyorum. Parçala, <a href="http://www.hjsplit.org/">Hj-Split</a> ile aynı işi gören büyük boyutlu dosyaları parçalara ayırır, birleştirir ve dosya özetini çıkarır; bu sayede birleşen dosya doğru birleşmiş mi diye kontrol etmiş olursunuz. Aşağıda kullanımını gösteren bir video paylaşıyorum&#8230;<span id="more-117"></span></p>
<p><object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/DslEKWabEag?version=3&#038;feature=player_detailpage"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/DslEKWabEag?version=3&#038;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"></embed></param></object></p>
<p>Doğrulama yaparken neden ikinci sefer dialogu açtığıma gelirsek; dosya özetinin değişmemesi kullanıcıları yanıltabilir diye doğruluğunu kanıtlamak için. Ayrıca gtk-qt tema dönüşümünden kaynaklanan bir sorundan dolayı(sanırım) dosya özetini görebilmek için girdi alanına tıklamam gerekti. Kde üzerinde ve Windows altında sorun yaşanmayacağını düşünüyorum. Uygulamanın kaynak kodlarına <a href="https://sourceforge.net/p/parcala/">buradan</a> ulaşabilirsiniz. Uygulamayı dener, hata alırsanız ve/veya şunu şöyle yap demek isterseniz proje sayfasından istekte bulunabilirsiniz(issue).</p>
<span class="alert">Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.</span>
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html" data-text="Parçala - Büyük Boyutlu Dosyaları Böler, Birleştirir ve Kontrol Eder" data-count="horizontal">Tweet</a><p>Benzer Yazılar:</p><ol>
<li><a href='http://www.metehan.us/virux-gnulinux-icin-bir-antivirus-yazilimi.html' rel='bookmark' title='Virux &#8211; GNU/Linux için bir antivirüs yazılımı :P'>Virux &#8211; GNU/Linux için bir antivirüs yazılımı :P</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://www.metehan.us/parcala-buyuk-boyutlu-dosyalari-boler-birlestirir-ve-kontrol-eder.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

